diff --git a/eclipse-extensions/org.springframework.boot.ide.properties.editors/META-INF/MANIFEST.MF b/eclipse-extensions/org.springframework.boot.ide.properties.editors/META-INF/MANIFEST.MF index a72582697..bb2c70f5a 100644 --- a/eclipse-extensions/org.springframework.boot.ide.properties.editors/META-INF/MANIFEST.MF +++ b/eclipse-extensions/org.springframework.boot.ide.properties.editors/META-INF/MANIFEST.MF @@ -5,10 +5,10 @@ Bundle-SymbolicName: org.springframework.boot.ide.properties.editors;singleton:= Bundle-Version: 4.0.0.qualifier Bundle-Vendor: Pivotal, Inc. Bundle-RequiredExecutionEnvironment: JavaSE-1.8 -Require-Bundle: org.eclipse.languageserver;bundle-version="0.1.0", - org.eclipse.ui.genericeditor;bundle-version="1.0.0", +Require-Bundle: org.eclipse.ui.genericeditor;bundle-version="1.0.0", org.eclipse.core.runtime;bundle-version="3.12.0", org.eclipse.jface.text;bundle-version="3.11.100", org.eclipse.jdt.ui;bundle-version="3.13.0", - org.dadacoalition.yedit;bundle-version="1.0.20" + org.dadacoalition.yedit;bundle-version="1.0.20", + org.eclipse.lsp4e;bundle-version="0.1.0" Import-Package: org.eclipse.jface.preference diff --git a/eclipse-language-servers/org.springframework.boot.ide.cloudfoundry.server/META-INF/MANIFEST.MF b/eclipse-language-servers/org.springframework.boot.ide.cloudfoundry.server/META-INF/MANIFEST.MF index 6c4ebee7d..d442fc27e 100644 --- a/eclipse-language-servers/org.springframework.boot.ide.cloudfoundry.server/META-INF/MANIFEST.MF +++ b/eclipse-language-servers/org.springframework.boot.ide.cloudfoundry.server/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Bundle-Name: Server Bundle-SymbolicName: org.springframework.boot.ide.cloudfoundry.server;singleton:=true Bundle-Version: 4.0.0.qualifier Bundle-RequiredExecutionEnvironment: JavaSE-1.8 -Require-Bundle: org.eclipse.languageserver;bundle-version="0.1.0", - org.eclipse.jdt.launching;bundle-version="3.9.0", - org.eclipse.core.runtime;bundle-version="3.12.0" +Require-Bundle: org.eclipse.jdt.launching;bundle-version="3.9.0", + org.eclipse.core.runtime;bundle-version="3.12.0", + org.eclipse.lsp4e;bundle-version="0.1.0" Import-Package: org.osgi.framework diff --git a/eclipse-language-servers/org.springframework.boot.ide.cloudfoundry.server/plugin.xml b/eclipse-language-servers/org.springframework.boot.ide.cloudfoundry.server/plugin.xml index 1ef77e33a..2f17eb347 100644 --- a/eclipse-language-servers/org.springframework.boot.ide.cloudfoundry.server/plugin.xml +++ b/eclipse-language-servers/org.springframework.boot.ide.cloudfoundry.server/plugin.xml @@ -3,7 +3,7 @@ + point="org.eclipse.lsp4e.languageServer"> + point="org.eclipse.lsp4e.languageServer"> - + diff --git a/eclipse-language-servers/pom.xml b/eclipse-language-servers/pom.xml index cd63148d0..c0248d776 100644 --- a/eclipse-language-servers/pom.xml +++ b/eclipse-language-servers/pom.xml @@ -51,8 +51,6 @@ 0.26.0 UTF-8 - - file:///${basedir}/../../../eclipse-language-service/repository/target/repository @@ -86,7 +84,12 @@ orbit p2 - http://download.eclipse.org/tools/orbit/downloads/drops/R20160520211859/repository/ + http://download.eclipse.org/tools/orbit/downloads/drops/S20161021172207/repository/ + + + lsp4e + p2 + http://download.eclipse.org/lsp4e/snapshots/ @@ -118,14 +121,6 @@ - - - eclipse-language-server-local-repo - p2 - ${eclipse-lsp-support-repo} - - - tycho-snapshots diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/ClassReferenceProvider.java b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/ClassReferenceProvider.java index e50f95a46..a8173959a 100644 --- a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/ClassReferenceProvider.java +++ b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/ClassReferenceProvider.java @@ -20,6 +20,14 @@ import com.google.common.cache.CacheBuilder; import reactor.core.publisher.Flux; +/** + * Provides the algorithm for 'class-reference' valueProvider. + *

+ * See: https://github.com/spring-projects/spring-boot/blob/master/spring-boot-docs/src/main/asciidoc/appendix-configuration-metadata.adoc + * + * @author Kris De Volder + * @author Alex Boyko + */ public class ClassReferenceProvider extends CachingValueProvider { /** @@ -44,7 +52,7 @@ public class ClassReferenceProvider extends CachingValueProvider { } ); - public static Function applyOn(long duration, TimeUnit unit, Function func) { + private static Function applyOn(long duration, TimeUnit unit, Function func) { Cache cache = CacheBuilder.newBuilder().expireAfterAccess(duration, unit).expireAfterWrite(duration, unit).build(); return (k) -> { try { diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/LoggerNameProvider.java b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/LoggerNameProvider.java new file mode 100644 index 000000000..dc58e1dc9 --- /dev/null +++ b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/LoggerNameProvider.java @@ -0,0 +1,41 @@ +package org.springframework.ide.vscode.application.properties.metadata; + +import java.util.Map; +import java.util.function.Function; + +import org.springframework.ide.vscode.application.properties.metadata.ValueProviderRegistry.ValueProviderStrategy; +import org.springframework.ide.vscode.application.properties.metadata.hints.StsValueHint; +import org.springframework.ide.vscode.commons.java.IJavaProject; + +import reactor.core.publisher.Flux; +import reactor.util.function.Tuples; + +/** + * Provides the algorithm for 'logger-name' valueProvider. + *

+ * See: https://github.com/spring-projects/spring-boot/blob/master/spring-boot-docs/src/main/asciidoc/appendix-configuration-metadata.adoc + * + * @author Kris De Volder + * @author Alex Boyko + */ +public class LoggerNameProvider extends CachingValueProvider { + + private static final ValueProviderStrategy INSTANCE = new LoggerNameProvider(); + public static final Function, ValueProviderStrategy> FACTORY = (params) -> INSTANCE; + + @Override + protected Flux getValuesAsync(IJavaProject javaProject, String query) { + return Flux.concat( + javaProject + .fuzzySearchPackages(query) + .map(t -> Tuples.of(StsValueHint.create(t.getT1()), t.getT2())), + javaProject + .fuzzySearchTypes(query, null) + .map(t -> Tuples.of(StsValueHint.create(t.getT1()), t.getT2())) + ) + .collectSortedList((o1, o2) -> o2.getT2().compareTo(o1.getT2())) + .flatMap(l -> Flux.fromIterable(l)) + .map(t -> t.getT1()); + } + +} diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/ValueProviderRegistry.java b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/ValueProviderRegistry.java index a7b488d10..cd4e7cf18 100644 --- a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/ValueProviderRegistry.java +++ b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/ValueProviderRegistry.java @@ -48,7 +48,7 @@ public class ValueProviderRegistry { } protected void initializeDefaults(ValueProviderRegistry r) { -// def("logger-name", LoggerNameProvider.FACTORY); + def("logger-name", LoggerNameProvider.FACTORY); def("class-reference", ClassReferenceProvider.FACTORY); } diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java index bb834d1f8..1cd029b7b 100644 --- a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java @@ -84,6 +84,8 @@ public class JandexIndex { private Map>>> knownTypes; + private Map>> knownPackages; + private Cache javadocProvidersCache = CacheBuilder.newBuilder().build(); private JandexIndex[] baseIndex; @@ -100,10 +102,12 @@ public class JandexIndex { this.baseIndex = baseIndex; this.index = new ConcurrentHashMap<>(); this.knownTypes = new HashMap<>(); + this.knownPackages = new HashMap<>(); this.javadocProviderFactory = javadocProviderFactory; classpathEntries.forEach(file -> { index.put(file, Suppliers.memoize(() -> createIndex(file, indexFileFinder))); knownTypes.put(file, Suppliers.memoize(() -> getKnownTypesStream(file).collect(Collectors.toList()))); + knownPackages.put(file, Suppliers.memoize(() -> getKnownPackages(file).collect(Collectors.toList()))); }); } @@ -225,6 +229,21 @@ public class JandexIndex { return Stream.empty(); } + private Stream getKnownPackages(File file) { + Optional indexView = index.get(file).get(); + if (indexView.isPresent()) { + return indexView.get() + .getKnownClasses() + .parallelStream() + .map(info -> { + String name = info.name().toString(); + return name.substring(0, name.lastIndexOf('.')); + }) + .distinct(); + } + return Stream.empty(); + } + public Flux> fuzzySearchTypes(String searchTerm, TypeFilter typeFilter) { Flux> flux = Flux.fromIterable(knownTypes.values()) .publishOn(Schedulers.parallel()) @@ -239,6 +258,19 @@ public class JandexIndex { } } + public Flux> fuzzySearchPackages(String searchTerm) { + Flux> flux = Flux.fromIterable(knownPackages.values()) + .publishOn(Schedulers.parallel()) + .flatMap(s -> Flux.fromIterable(s.get())) + .map(pkg -> Tuples.of(pkg, FuzzyMatcher.matchScore(searchTerm, pkg))) + .filter(t -> t.getT2() != 0.0); + if (baseIndex == null) { + return flux; + } else { + return Flux.merge(flux, Flux.fromArray(baseIndex).flatMap(index -> index.fuzzySearchPackages(searchTerm))); + } + } + public Flux allSubtypesOf(IType type) { DotName name = DotName.createSimple(type.getFullyQualifiedName()); Flux flux = Flux.fromIterable(index.keySet()) diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IJavaProject.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IJavaProject.java index c76860c49..58c34636f 100644 --- a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IJavaProject.java +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IJavaProject.java @@ -14,6 +14,8 @@ public interface IJavaProject extends IJavaElement { Flux> fuzzySearchTypes(String searchTerm, TypeFilter typeFilter); + Flux> fuzzySearchPackages(String searchTerm); + Flux allSubtypesOf(IType type); IClasspath getClasspath(); diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenJavaProject.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenJavaProject.java index 9205747a6..ba190dcca 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenJavaProject.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenJavaProject.java @@ -66,6 +66,11 @@ public class MavenJavaProject implements IJavaProject { return classpath.fuzzySearchType(searchTerm, typeFilter); } + @Override + public Flux> fuzzySearchPackages(String searchTerm) { + return classpath.fuzzySearchPackages(searchTerm); + } + @Override public Flux allSubtypesOf(IType type) { return classpath.allSubtypesOf(type); diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java index 2fd892e56..31bf7bf79 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java @@ -104,6 +104,10 @@ public class MavenProjectClasspath implements IClasspath { return javaIndex.get().fuzzySearchTypes(searchTerm, typeFilter); } + public Flux> fuzzySearchPackages(String searchTerm) { + return javaIndex.get().fuzzySearchPackages(searchTerm); + } + public Flux allSubtypesOf(IType type) { return javaIndex.get().allSubtypesOf(type); } diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/classpathfile/JavaProjectWithClasspathFile.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/classpathfile/JavaProjectWithClasspathFile.java index 499fa8df2..50f54e681 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/classpathfile/JavaProjectWithClasspathFile.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/classpathfile/JavaProjectWithClasspathFile.java @@ -63,6 +63,11 @@ public class JavaProjectWithClasspathFile implements IJavaProject { return Flux.empty(); } + @Override + public Flux> fuzzySearchPackages(String searchTerm) { + return Flux.empty(); + } + @Override public Flux allSubtypesOf(IType type) { return Flux.empty(); diff --git a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java index 6b1fbc74f..70d909196 100644 --- a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java +++ b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java @@ -87,6 +87,16 @@ public class JavaIndexTest { assertEquals("java.util.EnumMap$KeySet", results.get(0).getT1().getFullyQualifiedName()); } + @Test + public void fuzzySearchPackage() throws Exception { + List> results = MavenCore.getInstance().getJavaIndexForJreLibs() + .fuzzySearchPackages("util") + .collectSortedList((o1, o2) -> o2.getT2().compareTo(o1.getT2())) + .block(); + assertTrue(results.size() > 10); + assertEquals("java.util", results.get(0).getT1()); + } + @Test public void findClassInJar() throws Exception { MavenJavaProject project = mavenProjectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); diff --git a/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlEditorTest.java b/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlEditorTest.java index aecb348e1..208a1770b 100644 --- a/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlEditorTest.java +++ b/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlEditorTest.java @@ -3056,7 +3056,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testLoggerNameCompletion() throws Exception { + @Test public void testLoggerNameCompletion() throws Exception { CachingValueProvider.TIMEOUT = Duration.ofSeconds(20); // the provider can't be reliably tested if its not allowed to // fetch all its values (even though in 'production' you // wouldn't want it to block the UI thread for this long.