From 2c74a45d762d14e0ef2611b4ab864b75e2263876 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Fri, 29 Dec 2017 14:13:01 +0100 Subject: [PATCH 1/6] code cleanup --- .../boot/java/BootJavaLanguageServer.java | 87 +++++++------------ .../annotations/AnnotationHierarchies.java | 7 -- .../AnnotationHierarchyAwareLookup.java | 8 +- .../java/beans/ComponentSymbolProvider.java | 1 - .../handlers/BootJavaCompletionEngine.java | 2 +- .../java/handlers/BootJavaHoverProvider.java | 4 - .../handlers/BootJavaReferencesHandler.java | 2 +- .../boot/java/utils/CompilationUnitCache.java | 2 +- .../vscode/boot/java/utils/SpringIndexer.java | 4 +- .../beans/test/SpringIndexerBeansTest.java | 23 ----- .../test/PropertyReferenceFinderTest.java | 1 - .../java/scope/test/ScopeCompletionTest.java | 1 - 12 files changed, 35 insertions(+), 107 deletions(-) diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java index 6779af88e..ac593e3a7 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java @@ -254,60 +254,36 @@ public class BootJavaLanguageServer extends SimpleLanguageServer { providers.put(org.springframework.ide.vscode.boot.java.value.Constants.SPRING_VALUE, new ValueHoverProvider()); - providers.put(Annotations.SPRING_REQUEST_MAPPING, - new RequestMappingHoverProvider()); - providers.put(Annotations.SPRING_GET_MAPPING, - new RequestMappingHoverProvider()); - providers.put(Annotations.SPRING_POST_MAPPING, - new RequestMappingHoverProvider()); - providers.put(Annotations.SPRING_PUT_MAPPING, - new RequestMappingHoverProvider()); - providers.put(Annotations.SPRING_DELETE_MAPPING, - new RequestMappingHoverProvider()); - providers.put(Annotations.SPRING_PATCH_MAPPING, - new RequestMappingHoverProvider()); + providers.put(Annotations.SPRING_REQUEST_MAPPING, new RequestMappingHoverProvider()); + providers.put(Annotations.SPRING_GET_MAPPING, new RequestMappingHoverProvider()); + providers.put(Annotations.SPRING_POST_MAPPING, new RequestMappingHoverProvider()); + providers.put(Annotations.SPRING_PUT_MAPPING, new RequestMappingHoverProvider()); + providers.put(Annotations.SPRING_DELETE_MAPPING, new RequestMappingHoverProvider()); + providers.put(Annotations.SPRING_PATCH_MAPPING, new RequestMappingHoverProvider()); providers.put(Annotations.PROFILE, new ActiveProfilesProvider()); providers.put(Annotations.AUTOWIRED, new AutowiredHoverProvider()); providers.put(Annotations.COMPONENT, new ComponentInjectionsHoverProvider()); providers.put(Annotations.BEAN, new BeanInjectedIntoHoverProvider()); - providers.put(Annotations.CONDITIONAL, - new ConditionalsLiveHoverProvider()); - providers.put(Annotations.CONDITIONAL_ON_BEAN, - new ConditionalsLiveHoverProvider()); - providers.put(Annotations.CONDITIONAL_ON_MISSING_BEAN, - new ConditionalsLiveHoverProvider()); - providers.put(Annotations.CONDITIONAL_ON_PROPERTY, - new ConditionalsLiveHoverProvider()); - providers.put(Annotations.CONDITIONAL_ON_RESOURCE, - new ConditionalsLiveHoverProvider()); - providers.put(Annotations.CONDITIONAL_ON_CLASS, - new ConditionalsLiveHoverProvider()); - providers.put(Annotations.CONDITIONAL_ON_MISSING_CLASS, - new ConditionalsLiveHoverProvider()); - providers.put(Annotations.CONDITIONAL_ON_CLOUD_PLATFORM, - new ConditionalsLiveHoverProvider()); - providers.put(Annotations.CONDITIONAL_ON_WEB_APPLICATION, - new ConditionalsLiveHoverProvider()); - providers.put(Annotations.CONDITIONAL_ON_NOT_WEB_APPLICATION, - new ConditionalsLiveHoverProvider()); - providers.put(Annotations.CONDITIONAL_ON_ENABLED_INFO_CONTRIBUTOR, - new ConditionalsLiveHoverProvider()); - providers.put(Annotations.CONDITIONAL_ON_ENABLED_RESOURCE_CHAIN, - new ConditionalsLiveHoverProvider()); - providers.put(Annotations.CONDITIONAL_ON_ENABLED_ENDPOINT, - new ConditionalsLiveHoverProvider()); - providers.put(Annotations.CONDITIONAL_ON_ENABLED_HEALTH_INDICATOR, - new ConditionalsLiveHoverProvider()); - providers.put(Annotations.CONDITIONAL_ON_EXPRESSION, - new ConditionalsLiveHoverProvider()); - providers.put(Annotations.CONDITIONAL_ON_JAVA, - new ConditionalsLiveHoverProvider()); - providers.put(Annotations.CONDITIONAL_ON_JNDI, - new ConditionalsLiveHoverProvider()); - providers.put(Annotations.CONDITIONAL_ON_SINGLE_CANDIDATE, - new ConditionalsLiveHoverProvider()); + providers.put(Annotations.CONDITIONAL, new ConditionalsLiveHoverProvider()); + providers.put(Annotations.CONDITIONAL_ON_BEAN, new ConditionalsLiveHoverProvider()); + providers.put(Annotations.CONDITIONAL_ON_MISSING_BEAN, new ConditionalsLiveHoverProvider()); + providers.put(Annotations.CONDITIONAL_ON_PROPERTY, new ConditionalsLiveHoverProvider()); + providers.put(Annotations.CONDITIONAL_ON_RESOURCE, new ConditionalsLiveHoverProvider()); + providers.put(Annotations.CONDITIONAL_ON_CLASS, new ConditionalsLiveHoverProvider()); + providers.put(Annotations.CONDITIONAL_ON_MISSING_CLASS, new ConditionalsLiveHoverProvider()); + providers.put(Annotations.CONDITIONAL_ON_CLOUD_PLATFORM, new ConditionalsLiveHoverProvider()); + providers.put(Annotations.CONDITIONAL_ON_WEB_APPLICATION, new ConditionalsLiveHoverProvider()); + providers.put(Annotations.CONDITIONAL_ON_NOT_WEB_APPLICATION, new ConditionalsLiveHoverProvider()); + providers.put(Annotations.CONDITIONAL_ON_ENABLED_INFO_CONTRIBUTOR, new ConditionalsLiveHoverProvider()); + providers.put(Annotations.CONDITIONAL_ON_ENABLED_RESOURCE_CHAIN, new ConditionalsLiveHoverProvider()); + providers.put(Annotations.CONDITIONAL_ON_ENABLED_ENDPOINT, new ConditionalsLiveHoverProvider()); + providers.put(Annotations.CONDITIONAL_ON_ENABLED_HEALTH_INDICATOR, new ConditionalsLiveHoverProvider()); + providers.put(Annotations.CONDITIONAL_ON_EXPRESSION, new ConditionalsLiveHoverProvider()); + providers.put(Annotations.CONDITIONAL_ON_JAVA, new ConditionalsLiveHoverProvider()); + providers.put(Annotations.CONDITIONAL_ON_JNDI, new ConditionalsLiveHoverProvider()); + providers.put(Annotations.CONDITIONAL_ON_SINGLE_CANDIDATE, new ConditionalsLiveHoverProvider()); return new BootJavaHoverProvider(this, javaProjectFinder, providers, runningAppProvider); } @@ -315,16 +291,11 @@ public class BootJavaLanguageServer extends SimpleLanguageServer { protected SpringIndexer createAnnotationIndexer(SimpleLanguageServer server, JavaProjectFinder projectFinder) { AnnotationHierarchyAwareLookup providers = new AnnotationHierarchyAwareLookup<>(); providers.put(Annotations.SPRING_REQUEST_MAPPING, new RequestMappingSymbolProvider()); - providers.put(Annotations.SPRING_GET_MAPPING, - new RequestMappingSymbolProvider()); - providers.put(Annotations.SPRING_POST_MAPPING, - new RequestMappingSymbolProvider()); - providers.put(Annotations.SPRING_PUT_MAPPING, - new RequestMappingSymbolProvider()); - providers.put(Annotations.SPRING_DELETE_MAPPING, - new RequestMappingSymbolProvider()); - providers.put(Annotations.SPRING_PATCH_MAPPING, - new RequestMappingSymbolProvider()); + providers.put(Annotations.SPRING_GET_MAPPING, new RequestMappingSymbolProvider()); + providers.put(Annotations.SPRING_POST_MAPPING, new RequestMappingSymbolProvider()); + providers.put(Annotations.SPRING_PUT_MAPPING, new RequestMappingSymbolProvider()); + providers.put(Annotations.SPRING_DELETE_MAPPING, new RequestMappingSymbolProvider()); + providers.put(Annotations.SPRING_PATCH_MAPPING, new RequestMappingSymbolProvider()); providers.put(Annotations.BEAN, new BeansSymbolProvider()); providers.put(Annotations.COMPONENT, new ComponentSymbolProvider()); diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchies.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchies.java index 19d9e8274..7de211d63 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchies.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchies.java @@ -11,22 +11,15 @@ package org.springframework.ide.vscode.boot.java.annotations; import java.util.Collection; -import java.util.HashMap; import java.util.HashSet; -import java.util.List; -import java.util.Map; import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; import java.util.function.Predicate; import java.util.stream.Stream; import org.eclipse.jdt.core.dom.Annotation; import org.eclipse.jdt.core.dom.IAnnotationBinding; import org.eclipse.jdt.core.dom.ITypeBinding; -import org.gradle.internal.io.SkipFirstTextStream; import org.springframework.ide.vscode.commons.util.CollectorUtil; -import org.springframework.ide.vscode.commons.util.Log; import com.google.common.collect.ImmutableList; diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchyAwareLookup.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchyAwareLookup.java index 2f7729a86..2195af2f6 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchyAwareLookup.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchyAwareLookup.java @@ -18,18 +18,12 @@ import java.util.Map; import java.util.function.Consumer; import org.eclipse.jdt.core.dom.ITypeBinding; -import org.springframework.ide.vscode.boot.java.requestmapping.RequestMappingSymbolProvider; import org.springframework.ide.vscode.commons.util.Assert; -import org.springframework.ide.vscode.commons.util.StringUtil; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; - -import reactor.util.function.Tuple2; -import reactor.util.function.Tuples; /** - * A Map-like utilyt that allows putting and getting values associated with + * A Map-like utilty that allows putting and getting values associated with * annotation types. *

* The lookup is 'hierarchy aware' which means that is able to associate values diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java index 92ed764c1..657ad9de3 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java @@ -23,7 +23,6 @@ import org.eclipse.lsp4j.SymbolKind; import org.springframework.ide.vscode.boot.java.handlers.SymbolProvider; import org.springframework.ide.vscode.commons.util.BadLocationException; import org.springframework.ide.vscode.commons.util.Log; -import org.springframework.ide.vscode.commons.util.StringUtil; import org.springframework.ide.vscode.commons.util.text.TextDocument; import com.google.common.collect.ImmutableList; diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaCompletionEngine.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaCompletionEngine.java index 50e436435..7a2b37bc2 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaCompletionEngine.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaCompletionEngine.java @@ -51,7 +51,7 @@ public class BootJavaCompletionEngine implements ICompletionEngine { @Override public Collection getCompletions(IDocument document, int offset) throws Exception { - ASTParser parser = ASTParser.newParser(AST.JLS8); + ASTParser parser = ASTParser.newParser(AST.JLS9); Map options = JavaCore.getOptions(); JavaCore.setComplianceOptions(JavaCore.VERSION_1_8, options); parser.setCompilerOptions(options); diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaHoverProvider.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaHoverProvider.java index 3cf3416dd..4e8740734 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaHoverProvider.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaHoverProvider.java @@ -10,18 +10,14 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.java.handlers; -import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; -import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.concurrent.CompletableFuture; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ASTVisitor; import org.eclipse.jdt.core.dom.Annotation; -import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.MarkerAnnotation; import org.eclipse.jdt.core.dom.NodeFinder; diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaReferencesHandler.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaReferencesHandler.java index 2e032aa7e..b6c81415c 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaReferencesHandler.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaReferencesHandler.java @@ -71,7 +71,7 @@ public class BootJavaReferencesHandler implements ReferencesHandler { } private CompletableFuture> provideReferences(TextDocument document, int offset) throws Exception { - ASTParser parser = ASTParser.newParser(AST.JLS8); + ASTParser parser = ASTParser.newParser(AST.JLS9); Map options = JavaCore.getOptions(); JavaCore.setComplianceOptions(JavaCore.VERSION_1_8, options); parser.setCompilerOptions(options); diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/CompilationUnitCache.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/CompilationUnitCache.java index a35a14572..3a9af0836 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/CompilationUnitCache.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/CompilationUnitCache.java @@ -126,7 +126,7 @@ public final class CompilationUnitCache { } public static CompilationUnit parse(TextDocument document, IJavaProject project) throws Exception { - ASTParser parser = ASTParser.newParser(AST.JLS8); + ASTParser parser = ASTParser.newParser(AST.JLS9); Map options = JavaCore.getOptions(); JavaCore.setComplianceOptions(JavaCore.VERSION_1_8, options); parser.setCompilerOptions(options); diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java index eedc19440..fcac22a3d 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java @@ -273,7 +273,7 @@ public class SpringIndexer { private void scanProject(IJavaProject project, String[] files) { try { - ASTParser parser = ASTParser.newParser(AST.JLS8); + ASTParser parser = ASTParser.newParser(AST.JLS9); String[] classpathEntries = getClasspathEntries(project); scanFiles(parser, files, classpathEntries); @@ -284,7 +284,7 @@ public class SpringIndexer { } private void scanFile(String docURI, String content, String[] classpathEntries) throws Exception { - ASTParser parser = ASTParser.newParser(AST.JLS8); + ASTParser parser = ASTParser.newParser(AST.JLS9); Map options = JavaCore.getOptions(); JavaCore.setComplianceOptions(JavaCore.VERSION_1_8, options); parser.setCompilerOptions(options); diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java index 48ab22d89..a4a9acc90 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java @@ -11,10 +11,7 @@ package org.springframework.ide.vscode.boot.java.beans.test; import java.io.File; -import java.util.Iterator; -import java.util.List; -import org.eclipse.lsp4j.SymbolInformation; import org.junit.Before; import org.junit.Test; import org.springframework.ide.vscode.boot.java.Annotations; @@ -112,9 +109,6 @@ public class SpringIndexerBeansTest { indexer.assertDocumentSymbols(uriPrefix + "/src/main/java/org/test/SimpleComponent.java", symbol("@Component", "@+ 'simpleComponent' (@Component) SimpleComponent") ); -// List symbols = indexer.getSymbols(uriPrefix + "/src/main/java/org/test/SimpleComponent.java"); -// assertEquals(1, symbols.size()); -// assertTrue(containsSymbol(symbols, "@+ 'simpleComponent' (@Component) SimpleComponent", uriPrefix + "/src/main/java/org/test/SimpleComponent.java", 4, 0, 4, 10)); } @Test public void testScanSimpleControllerClass() throws Exception { @@ -145,23 +139,6 @@ public class SpringIndexerBeansTest { //////////////////////////////// // harness code - private boolean containsSymbol(List symbols, String name, String uri, int startLine, int startCHaracter, int endLine, int endCharacter) { - for (Iterator iterator = symbols.iterator(); iterator.hasNext();) { - SymbolInformation symbol = iterator.next(); - - if (symbol.getName().equals(name) - && symbol.getLocation().getUri().equals(uri) - && symbol.getLocation().getRange().getStart().getLine() == startLine - && symbol.getLocation().getRange().getStart().getCharacter() == startCHaracter - && symbol.getLocation().getRange().getEnd().getLine() == endLine - && symbol.getLocation().getRange().getEnd().getCharacter() == endCharacter) { - return true; - } - } - - return false; - } - private TestSymbolInfo symbol(String coveredText, String label) { return new TestSymbolInfo(coveredText, label); } diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/references/test/PropertyReferenceFinderTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/references/test/PropertyReferenceFinderTest.java index 4ac7509e2..50c9d71b2 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/references/test/PropertyReferenceFinderTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/references/test/PropertyReferenceFinderTest.java @@ -13,7 +13,6 @@ package org.springframework.ide.vscode.boot.java.references.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import java.io.File; import java.net.URI; import java.nio.file.Path; import java.nio.file.Paths; diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/scope/test/ScopeCompletionTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/scope/test/ScopeCompletionTest.java index f3ad70632..60ccde49e 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/scope/test/ScopeCompletionTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/scope/test/ScopeCompletionTest.java @@ -11,7 +11,6 @@ package org.springframework.ide.vscode.boot.java.scope.test; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; import java.io.InputStream; import java.util.List; From 16888fe1fee14bf7fbe0cf7e2015922e203c8a07 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Fri, 29 Dec 2017 13:22:00 -0500 Subject: [PATCH 2/6] PT #153612030 Don't show tools.jar message for Java 9 --- .../commons-vscode/src/launch-util.ts | 4 ++-- vscode-extensions/vscode-boot-java/lib/Main.ts | 16 ++++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/vscode-extensions/commons-vscode/src/launch-util.ts b/vscode-extensions/commons-vscode/src/launch-util.ts index f2a895637..5fc5bd85b 100644 --- a/vscode-extensions/commons-vscode/src/launch-util.ts +++ b/vscode-extensions/commons-vscode/src/launch-util.ts @@ -33,7 +33,7 @@ export interface ActivatorOptions { clientOptions: LanguageClientOptions; launcher: (context: VSCode.ExtensionContext) => string; jvmHeap?: string; - classpath?: (context: VSCode.ExtensionContext) => string[]; + classpath?: (context: VSCode.ExtensionContext, javaVersion: number) => string[]; } export function activate(options: ActivatorOptions, context: VSCode.ExtensionContext): Promise { @@ -98,7 +98,7 @@ export function activate(options: ActivatorOptions, context: VSCode.ExtensionCon '-Dorg.slf4j.simpleLogger.logFile=' + logfile ]; if (options.classpath) { - const classpath = options.classpath(context); + const classpath = options.classpath(context, version); if (classpath) { args.push('-cp'); args.push(classpath.join(Path.delimiter)); diff --git a/vscode-extensions/vscode-boot-java/lib/Main.ts b/vscode-extensions/vscode-boot-java/lib/Main.ts index d94520247..2b6e1225a 100644 --- a/vscode-extensions/vscode-boot-java/lib/Main.ts +++ b/vscode-extensions/vscode-boot-java/lib/Main.ts @@ -22,16 +22,20 @@ export function activate(context: VSCode.ExtensionContext) { CONNECT_TO_LS: false, extensionId: 'boot-java', launcher: (context: VSCode.ExtensionContext) => 'org.springframework.boot.loader.JarLauncher', - classpath: (context: VSCode.ExtensionContext) => { + classpath: (context: VSCode.ExtensionContext, javaVersion: number) => { const classpath = [ Path.resolve(context.extensionPath, 'jars/language-server.jar') ]; - const toolsJar = commons.findJvmFile('lib', 'tools.jar'); - if (toolsJar) { - classpath.push(toolsJar); - } else { - VSCode.window.showWarningMessage('JAVA_HOME environment variable points either to JRE or JDK missing "lib/tools.jar" hence Boot Hints are unavailable'); + + if (javaVersion < 9) { + const toolsJar = commons.findJvmFile('lib', 'tools.jar'); + if (toolsJar) { + classpath.push(toolsJar); + } else { + VSCode.window.showWarningMessage('JAVA_HOME environment variable points either to JRE or JDK missing "lib/tools.jar" hence Boot Hints are unavailable'); + } } + return classpath; }, clientOptions: { From 13fc1ba6faf0f5b84e2edc973c3098218da8ea77 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Mon, 1 Jan 2018 16:58:58 +0100 Subject: [PATCH 3/6] first cut for providing symbols for function beans from ckasses without annotation --- .../AnnotationHierarchyAwareLookup.java | 9 +- .../boot/java/beans/BeansSymbolProvider.java | 135 ++++++++++++------ .../java/beans/ComponentSymbolProvider.java | 8 +- .../boot/java/handlers/SymbolProvider.java | 4 +- .../RequestMappingSymbolProvider.java | 7 +- .../vscode/boot/java/utils/SpringIndexer.java | 30 +++- .../beans/test/SpringIndexerBeansTest.java | 15 +- .../test/SpringIndexerFunctionBeansTest.java | 79 ++++++++++ .../java/org/test/ScannedFunctionClass.java | 12 ++ 9 files changed, 236 insertions(+), 63 deletions(-) create mode 100644 headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerFunctionBeansTest.java create mode 100644 headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/ScannedFunctionClass.java diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchyAwareLookup.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchyAwareLookup.java index 2195af2f6..83e9843d5 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchyAwareLookup.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchyAwareLookup.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017 Pivotal, Inc. + * Copyright (c) 2017, 2018 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -93,6 +93,13 @@ public class AnnotationHierarchyAwareLookup { return found.build(); } + public Collection getAll() { + ImmutableList.Builder found = ImmutableList.builder(); + Collection> values = bindings.values(); + values.forEach(binding -> found.add(binding.value)); + return found.build(); + } + private void findElements(ITypeBinding typeBinding, HashSet seen, Consumer requestor) { String qname = typeBinding.getQualifiedName(); if (seen.add(qname)) { diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java index b60159be4..e30ca4d66 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017 Pivotal, Inc. + * Copyright (c) 2017, 2018 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -11,6 +11,7 @@ package org.springframework.ide.vscode.boot.java.beans; import java.util.Collection; +import java.util.List; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; @@ -22,6 +23,7 @@ import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.ParameterizedType; import org.eclipse.jdt.core.dom.StringLiteral; import org.eclipse.jdt.core.dom.Type; +import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.lsp4j.Location; import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.SymbolKind; @@ -35,6 +37,7 @@ import org.springframework.ide.vscode.commons.util.text.TextDocument; import com.google.common.collect.ImmutableList; import reactor.util.function.Tuple2; +import reactor.util.function.Tuple3; import reactor.util.function.Tuples; /** @@ -46,51 +49,13 @@ public class BeansSymbolProvider implements SymbolProvider { private static final String FUNCTION_FUNCTION_TYPE = Function.class.getName(); private static final String FUNCTION_CONSUMER_TYPE = Consumer.class.getName(); private static final String FUNCTION_SUPPLIER_TYPE = Supplier.class.getName(); + private static final String[] NAME_ATTRIBUTES = {"value", "name"}; - private boolean isFunctionBean(Annotation node) { - ASTNode parent = node.getParent(); - if (parent instanceof MethodDeclaration) { - MethodDeclaration method = (MethodDeclaration) parent; - - String returnType = null; - if (method.getReturnType2().isParameterizedType()) { - ParameterizedType paramType = (ParameterizedType) method.getReturnType2(); - Type type = paramType.getType(); - ITypeBinding typeBinding = type.resolveBinding(); - returnType = typeBinding.getBinaryName(); - } - else { - returnType = method.getReturnType2().resolveBinding().getQualifiedName(); - } - - return FUNCTION_FUNCTION_TYPE.equals(returnType) || FUNCTION_CONSUMER_TYPE.equals(returnType) - || FUNCTION_SUPPLIER_TYPE.equals(returnType); - } - return false; - } - -// private SymbolInformation createFunctionSymbol(Annotation node, TextDocument doc) throws BadLocationException { -// StringBuilder symbolLabel = new StringBuilder(); -// symbolLabel.append("@> "); -// -// String beanName = getBeanName(node); -// String beanType = getBeanType(node); -// -// symbolLabel.append('\''); -// symbolLabel.append(beanName); -// symbolLabel.append('\''); -// symbolLabel.append(" (@Bean) "); -// symbolLabel.append(beanType); -// -// SymbolInformation symbol = new SymbolInformation(symbolLabel.toString(), SymbolKind.Interface, -// new Location(doc.getUri(), doc.toRange(node.getStartPosition(), node.getLength()))); -// return symbol; -// } - @Override public Collection getSymbols(Annotation node, ITypeBinding annotationType, Collection metaAnnotations, TextDocument doc) { boolean isFunction = isFunctionBean(node); + ImmutableList.Builder symbols = ImmutableList.builder(); String beanType = getBeanType(node); for (Tuple2 nameAndRegion : getBeanNames(node, doc)) { @@ -107,16 +72,65 @@ public class BeansSymbolProvider implements SymbolProvider { return symbols.build(); } - Collection> getBeanNames(Annotation node, TextDocument doc) { + @Override + public Collection getSymbols(TypeDeclaration typeDeclaration, TextDocument doc) { + Tuple3 functionBean = getFunctionBean(typeDeclaration, doc); + if (functionBean != null) { + try { + SymbolInformation symbol = new SymbolInformation( + beanLabel(true, functionBean.getT1(), functionBean.getT2()), + SymbolKind.Interface, + new Location(doc.getUri(), doc.toRange(functionBean.getT3()))); + return ImmutableList.of(symbol); + } catch (BadLocationException e) { + Log.log(e); + } + } + return ImmutableList.of(); + } + + protected Tuple3 getFunctionBean(TypeDeclaration typeDeclaration, TextDocument doc) { + List interfaceTypes = typeDeclaration.superInterfaceTypes(); + if (interfaceTypes != null && interfaceTypes.size() > 0) { + for (Object interfaceType : interfaceTypes) { + Type type = (Type) interfaceType; + String simplifiedType = null; + + if (type.isParameterizedType()) { + ParameterizedType paramType = (ParameterizedType) type; + Type simpleType = paramType.getType(); + ITypeBinding typeBinding = simpleType.resolveBinding(); + simplifiedType = typeBinding.getBinaryName(); + } + else { + simplifiedType = type.resolveBinding().getQualifiedName(); + } + + if (FUNCTION_FUNCTION_TYPE.equals(simplifiedType) || FUNCTION_CONSUMER_TYPE.equals(simplifiedType) + || FUNCTION_SUPPLIER_TYPE.equals(simplifiedType)) { + String beanName = getBeanName(typeDeclaration); + String beanType = type.resolveBinding().getName(); + DocumentRegion region = ASTUtils.nodeRegion(doc, typeDeclaration.getName()); + + return Tuples.of(beanName, beanType, region); + } + } + } + return null; + } + + protected Collection> getBeanNames(Annotation node, TextDocument doc) { Collection beanNameNodes = getBeanNameLiterals(node); - if (beanNameNodes!=null && !beanNameNodes.isEmpty()) { + + if (beanNameNodes != null && !beanNameNodes.isEmpty()) { ImmutableList.Builder> namesAndRegions = ImmutableList.builder(); for (StringLiteral nameNode : beanNameNodes) { String name = ASTUtils.getLiteralValue(nameNode); namesAndRegions.add(Tuples.of(name, ASTUtils.stringRegion(doc, nameNode))); } return namesAndRegions.build(); - } else { + } + else { ASTNode parent = node.getParent(); if (parent instanceof MethodDeclaration) { MethodDeclaration method = (MethodDeclaration) parent; @@ -141,6 +155,7 @@ public class BeansSymbolProvider implements SymbolProvider { symbolLabel.append(beanType); return symbolLabel.toString(); } + protected Collection getBeanNameLiterals(Annotation node) { ImmutableList.Builder literals = ImmutableList.builder(); for (String attrib : NAME_ATTRIBUTES) { @@ -160,4 +175,36 @@ public class BeansSymbolProvider implements SymbolProvider { } return null; } + + protected String getBeanName(TypeDeclaration typeDeclaration) { + String beanName = typeDeclaration.getName().toString(); + if (beanName.length() > 0 && Character.isUpperCase(beanName.charAt(0))) { + beanName = Character.toLowerCase(beanName.charAt(0)) + beanName.substring(1); + } + return beanName; + } + + private boolean isFunctionBean(Annotation node) { + ASTNode parent = node.getParent(); + if (parent instanceof MethodDeclaration) { + MethodDeclaration method = (MethodDeclaration) parent; + + String returnType = null; + if (method.getReturnType2().isParameterizedType()) { + ParameterizedType paramType = (ParameterizedType) method.getReturnType2(); + Type type = paramType.getType(); + ITypeBinding typeBinding = type.resolveBinding(); + returnType = typeBinding.getBinaryName(); + } + else { + returnType = method.getReturnType2().resolveBinding().getQualifiedName(); + } + + return FUNCTION_FUNCTION_TYPE.equals(returnType) || FUNCTION_CONSUMER_TYPE.equals(returnType) + || FUNCTION_SUPPLIER_TYPE.equals(returnType); + } + return false; + } + + } diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java index 657ad9de3..aa745f103 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017 Pivotal, Inc. + * Copyright (c) 2017, 2018 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -111,4 +111,10 @@ public class ComponentSymbolProvider implements SymbolProvider { return null; } + @Override + public Collection getSymbols(TypeDeclaration typeDeclaration, TextDocument doc) { + // TODO Auto-generated method stub + return null; + } + } diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/SymbolProvider.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/SymbolProvider.java index 3c0ca62cf..ff4802e26 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/SymbolProvider.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/SymbolProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017 Pivotal, Inc. + * Copyright (c) 2017, 2018 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -14,6 +14,7 @@ import java.util.Collection; import org.eclipse.jdt.core.dom.Annotation; import org.eclipse.jdt.core.dom.ITypeBinding; +import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.lsp4j.SymbolInformation; import org.springframework.ide.vscode.commons.util.text.TextDocument; @@ -24,5 +25,6 @@ import org.springframework.ide.vscode.commons.util.text.TextDocument; public interface SymbolProvider { Collection getSymbols(Annotation node, ITypeBinding typeBinding, Collection metaAnnotations, TextDocument doc); + Collection getSymbols(TypeDeclaration typeDeclaration, TextDocument doc); } diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/RequestMappingSymbolProvider.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/RequestMappingSymbolProvider.java index f7ca9ae55..ec9d4d7a0 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/RequestMappingSymbolProvider.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/RequestMappingSymbolProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017 Pivotal, Inc. + * Copyright (c) 2017, 2018 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -176,4 +176,9 @@ public class RequestMappingSymbolProvider implements SymbolProvider { return null; } + @Override + public Collection getSymbols(TypeDeclaration typeDeclaration, TextDocument doc) { + return null; + } + } diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java index fcac22a3d..8d4bc1038 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017 Pivotal, Inc. + * Copyright (c) 2017, 2018 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -43,6 +43,7 @@ import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.MarkerAnnotation; import org.eclipse.jdt.core.dom.NormalAnnotation; import org.eclipse.jdt.core.dom.SingleMemberAnnotation; +import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.lsp4j.Location; import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.SymbolKind; @@ -342,6 +343,17 @@ public class SpringIndexer { private void scanAST(final CompilationUnit cu, final String docURI, AtomicReference docRef, final String content) { cu.accept(new ASTVisitor() { + @Override + public boolean visit(TypeDeclaration node) { + try { + extractSymbolInformation(node, docURI, docRef, content); + } + catch (Exception e) { + e.printStackTrace(); + } + return super.visit(node); + } + @Override public boolean visit(SingleMemberAnnotation node) { try { @@ -380,6 +392,22 @@ public class SpringIndexer { }); } + private void extractSymbolInformation(TypeDeclaration typeDeclaration, String docURI, AtomicReference docRef, String content) throws Exception { + Collection providers = symbolProviders.getAll(); + if (!providers.isEmpty()) { + TextDocument doc = getTempTextDocument(docURI, docRef, content); + for (SymbolProvider provider : providers) { + Collection sbls = provider.getSymbols(typeDeclaration, doc); + if (sbls != null) { + sbls.forEach(symbol -> { + symbols.add(symbol); + symbolsByDoc.computeIfAbsent(docURI, s -> new ArrayList()).add(symbol); + }); + } + } + } + } + private void extractSymbolInformation(Annotation node, String docURI, AtomicReference docRef, String content) throws Exception { ITypeBinding typeBinding = node.resolveTypeBinding(); diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java index a4a9acc90..2e5268eb3 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017 Pivotal, Inc. + * Copyright (c) 2017, 2018 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -86,19 +86,6 @@ public class SpringIndexerBeansTest { ); } - @Test - public void testScanSimpleFunctionBean() throws Exception { - SpringIndexerHarness indexer = new SpringIndexerHarness(harness.getServer(), projectFinder, symbolProviders); - File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI()); - indexer.initialize(indexer.wsFolder(directory)); - - String uriPrefix = "file://" + directory.getAbsolutePath(); - indexer.assertDocumentSymbols(uriPrefix + "/src/main/java/org/test/FunctionClass.java", - symbol("@Configuration", "@+ 'functionClass' (@Configuration <: @Component) FunctionClass"), - symbol("@Bean", "@> 'uppercase' (@Bean) Function") - ); - } - @Test public void testScanSimpleComponentClass() throws Exception { SpringIndexerHarness indexer = new SpringIndexerHarness(harness.getServer(), projectFinder, symbolProviders); diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerFunctionBeansTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerFunctionBeansTest.java new file mode 100644 index 000000000..ac32c0579 --- /dev/null +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerFunctionBeansTest.java @@ -0,0 +1,79 @@ +/******************************************************************************* + * Copyright (c) 2017, 2018 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.java.beans.test; + +import java.io.File; + +import org.junit.Before; +import org.junit.Test; +import org.springframework.ide.vscode.boot.java.Annotations; +import org.springframework.ide.vscode.boot.java.annotations.AnnotationHierarchyAwareLookup; +import org.springframework.ide.vscode.boot.java.beans.BeansSymbolProvider; +import org.springframework.ide.vscode.boot.java.beans.ComponentSymbolProvider; +import org.springframework.ide.vscode.boot.java.beans.test.SpringIndexerHarness.TestSymbolInfo; +import org.springframework.ide.vscode.boot.java.handlers.SymbolProvider; +import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; +import org.springframework.ide.vscode.project.harness.BootLanguageServerHarness; +import org.springframework.ide.vscode.project.harness.ProjectsHarness; + +/** + * @author Martin Lippert + */ +public class SpringIndexerFunctionBeansTest { + + private AnnotationHierarchyAwareLookup symbolProviders; + private BootLanguageServerHarness harness; + private JavaProjectFinder projectFinder; + + @Before + public void setup() throws Exception { + symbolProviders = new AnnotationHierarchyAwareLookup<>(); + symbolProviders.put(Annotations.BEAN, new BeansSymbolProvider()); + symbolProviders.put(Annotations.COMPONENT, new ComponentSymbolProvider()); + + harness = BootLanguageServerHarness.builder().build(); + projectFinder = harness.getProjectFinder(); + harness.intialize(new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI())); + } + + @Test + public void testScanSimpleFunctionBean() throws Exception { + SpringIndexerHarness indexer = new SpringIndexerHarness(harness.getServer(), projectFinder, symbolProviders); + File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI()); + indexer.initialize(indexer.wsFolder(directory)); + + String uriPrefix = "file://" + directory.getAbsolutePath(); + indexer.assertDocumentSymbols(uriPrefix + "/src/main/java/org/test/FunctionClass.java", + symbol("@Configuration", "@+ 'functionClass' (@Configuration <: @Component) FunctionClass"), + symbol("@Bean", "@> 'uppercase' (@Bean) Function") + ); + } + + @Test + public void testScanSimpleFunctionClass() throws Exception { + SpringIndexerHarness indexer = new SpringIndexerHarness(harness.getServer(), projectFinder, symbolProviders); + File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI()); + indexer.initialize(indexer.wsFolder(directory)); + + String uriPrefix = "file://" + directory.getAbsolutePath(); + indexer.assertDocumentSymbols(uriPrefix + "/src/main/java/org/test/ScannedFunctionClass.java", + symbol("ScannedFunctionClass", "@> 'scannedFunctionClass' (@Bean) Function") + ); + } + + + //////////////////////////////// + // harness code + + private TestSymbolInfo symbol(String coveredText, String label) { + return new TestSymbolInfo(coveredText, label); + } +} diff --git a/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/ScannedFunctionClass.java b/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/ScannedFunctionClass.java new file mode 100644 index 000000000..838951e0f --- /dev/null +++ b/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/ScannedFunctionClass.java @@ -0,0 +1,12 @@ +package org.test; + +import java.util.function.Function; + +public class ScannedFunctionClass implements Function { + + @Override + public String apply(String t) { + return t.toUpperCase(); + } + +} From 1466fa158c8bd1fa04b9b6531a4c45798600d9d5 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Tue, 2 Jan 2018 07:50:09 +0100 Subject: [PATCH 4/6] updated splash for 2018 --- .../about.properties | 2 +- .../plugin.properties | 2 +- .../splash.bmp | Bin 1093736 -> 1093736 bytes 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/eclipse-distribution/org.springframework.boot.ide.branding/about.properties b/eclipse-distribution/org.springframework.boot.ide.branding/about.properties index 80e2eb3eb..a315d00f0 100644 --- a/eclipse-distribution/org.springframework.boot.ide.branding/about.properties +++ b/eclipse-distribution/org.springframework.boot.ide.branding/about.properties @@ -9,7 +9,7 @@ title=Spring Tool Suite 4\n\ Version: @QUALIFIER@\n\ Build Id: @BUILD_ID@\n\ \n\ -Copyright (c) 2007 - 2017 Pivotal Software, Inc.\n\ +Copyright (c) 2007 - 2018 Pivotal Software, Inc.\n\ All rights reserved. Visit http://spring.io/tools/sts\n\ \n\ This product includes software developed by the\n\ diff --git a/eclipse-distribution/org.springframework.boot.ide.branding/plugin.properties b/eclipse-distribution/org.springframework.boot.ide.branding/plugin.properties index d8aefdd87..025ddef0a 100644 --- a/eclipse-distribution/org.springframework.boot.ide.branding/plugin.properties +++ b/eclipse-distribution/org.springframework.boot.ide.branding/plugin.properties @@ -7,7 +7,7 @@ productBlurb=Spring Tool Suite 4 \n\ Version: @QUALIFIER@\n\ Build Id: @BUILD_ID@\n\ \n\ -Copyright (c) 2007 - 2017 Pivotal Software, Inc.\n\ +Copyright (c) 2007 - 2018 Pivotal Software, Inc.\n\ All rights reserved. Visit http://spring.io/tools/sts\n\ \n\ This product includes software developed by the\n\ diff --git a/eclipse-distribution/org.springframework.boot.ide.branding/splash.bmp b/eclipse-distribution/org.springframework.boot.ide.branding/splash.bmp index 69d311df14263c83bef26c57b46487d83ff8a29d..dc17ab733caef8746ef9504013dc525190aa0050 100644 GIT binary patch delta 4381 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 NzHIf%h80f@{}1*|?brYS From 1263093c583b1459f504ace3d76a1e129e33b6db Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Tue, 2 Jan 2018 08:48:52 +0100 Subject: [PATCH 5/6] function bean symbols now generated if function interface is found in inheritance hierarchy --- .../boot/java/beans/BeansSymbolProvider.java | 62 ++++++++++++------- .../test/SpringIndexerFunctionBeansTest.java | 33 ++++++++++ .../test/FunctionFromSpecializedClass.java | 10 +++ .../FunctionFromSpecializedInterface.java | 10 +++ .../java/org/test/LoopedFunctionClass.java | 4 ++ .../main/java/org/test/LoopedInterface1.java | 6 ++ .../main/java/org/test/LoopedInterface2.java | 4 ++ .../org/test/SpecializedFunctionClass.java | 6 ++ .../test/SpecializedFunctionInterface.java | 6 ++ 9 files changed, 119 insertions(+), 22 deletions(-) create mode 100644 headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/FunctionFromSpecializedClass.java create mode 100644 headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/FunctionFromSpecializedInterface.java create mode 100644 headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/LoopedFunctionClass.java create mode 100644 headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/LoopedInterface1.java create mode 100644 headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/LoopedInterface2.java create mode 100644 headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/SpecializedFunctionClass.java create mode 100644 headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/SpecializedFunctionInterface.java diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java index e30ca4d66..2058ae07e 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java @@ -11,7 +11,6 @@ package org.springframework.ide.vscode.boot.java.beans; import java.util.Collection; -import java.util.List; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; @@ -74,6 +73,7 @@ public class BeansSymbolProvider implements SymbolProvider { @Override public Collection getSymbols(TypeDeclaration typeDeclaration, TextDocument doc) { + // this checks function beans that are defined as implementations of Function interfaces Tuple3 functionBean = getFunctionBean(typeDeclaration, doc); if (functionBean != null) { try { @@ -90,33 +90,51 @@ public class BeansSymbolProvider implements SymbolProvider { } protected Tuple3 getFunctionBean(TypeDeclaration typeDeclaration, TextDocument doc) { - List interfaceTypes = typeDeclaration.superInterfaceTypes(); - if (interfaceTypes != null && interfaceTypes.size() > 0) { - for (Object interfaceType : interfaceTypes) { - Type type = (Type) interfaceType; - String simplifiedType = null; + ITypeBinding resolvedType = typeDeclaration.resolveBinding(); + if (resolvedType != null) { + return getFunctionBean(typeDeclaration, doc, resolvedType); + } + else { + return null; + } + } - if (type.isParameterizedType()) { - ParameterizedType paramType = (ParameterizedType) type; - Type simpleType = paramType.getType(); - ITypeBinding typeBinding = simpleType.resolveBinding(); - simplifiedType = typeBinding.getBinaryName(); - } - else { - simplifiedType = type.resolveBinding().getQualifiedName(); - } + private Tuple3 getFunctionBean(TypeDeclaration typeDeclaration, TextDocument doc, + ITypeBinding resolvedType) { - if (FUNCTION_FUNCTION_TYPE.equals(simplifiedType) || FUNCTION_CONSUMER_TYPE.equals(simplifiedType) - || FUNCTION_SUPPLIER_TYPE.equals(simplifiedType)) { - String beanName = getBeanName(typeDeclaration); - String beanType = type.resolveBinding().getName(); - DocumentRegion region = ASTUtils.nodeRegion(doc, typeDeclaration.getName()); + ITypeBinding[] interfaces = resolvedType.getInterfaces(); + for (ITypeBinding resolvedInterface : interfaces) { + String simplifiedType = null; + if (resolvedInterface.isParameterizedType()) { + simplifiedType = resolvedInterface.getBinaryName(); + } + else { + simplifiedType = resolvedType.getQualifiedName(); + } - return Tuples.of(beanName, beanType, region); + if (FUNCTION_FUNCTION_TYPE.equals(simplifiedType) || FUNCTION_CONSUMER_TYPE.equals(simplifiedType) + || FUNCTION_SUPPLIER_TYPE.equals(simplifiedType)) { + String beanName = getBeanName(typeDeclaration); + String beanType = resolvedInterface.getName(); + DocumentRegion region = ASTUtils.nodeRegion(doc, typeDeclaration.getName()); + + return Tuples.of(beanName, beanType, region); + } + else { + Tuple3 result = getFunctionBean(typeDeclaration, doc, resolvedInterface); + if (result != null) { + return result; } } } - return null; + + ITypeBinding superclass = resolvedType.getSuperclass(); + if (superclass != null) { + return getFunctionBean(typeDeclaration, doc, superclass); + } + else { + return null; + } } protected Collection> getBeanNames(Annotation node, TextDocument doc) { diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerFunctionBeansTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerFunctionBeansTest.java index ac32c0579..a560746ed 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerFunctionBeansTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerFunctionBeansTest.java @@ -69,6 +69,39 @@ public class SpringIndexerFunctionBeansTest { ); } + @Test + public void testScanSpecializedFunctionClass() throws Exception { + SpringIndexerHarness indexer = new SpringIndexerHarness(harness.getServer(), projectFinder, symbolProviders); + File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI()); + indexer.initialize(indexer.wsFolder(directory)); + + String uriPrefix = "file://" + directory.getAbsolutePath(); + indexer.assertDocumentSymbols(uriPrefix + "/src/main/java/org/test/FunctionFromSpecializedClass.java", + symbol("FunctionFromSpecializedClass", "@> 'functionFromSpecializedClass' (@Bean) Function") + ); + } + + @Test + public void testScanSpecializedFunctionInterface() throws Exception { + SpringIndexerHarness indexer = new SpringIndexerHarness(harness.getServer(), projectFinder, symbolProviders); + File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI()); + indexer.initialize(indexer.wsFolder(directory)); + + String uriPrefix = "file://" + directory.getAbsolutePath(); + indexer.assertDocumentSymbols(uriPrefix + "/src/main/java/org/test/FunctionFromSpecializedInterface.java", + symbol("FunctionFromSpecializedInterface", "@> 'functionFromSpecializedInterface' (@Bean) Function") + ); + } + + @Test + public void testScanInconsistentInterfaceHierarchy() throws Exception { + SpringIndexerHarness indexer = new SpringIndexerHarness(harness.getServer(), projectFinder, symbolProviders); + File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI()); + indexer.initialize(indexer.wsFolder(directory)); + + String uriPrefix = "file://" + directory.getAbsolutePath(); + indexer.assertDocumentSymbols(uriPrefix + "/src/main/java/org/test/LoopedFunctionClass.java"); + } //////////////////////////////// // harness code diff --git a/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/FunctionFromSpecializedClass.java b/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/FunctionFromSpecializedClass.java new file mode 100644 index 000000000..b2d69778d --- /dev/null +++ b/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/FunctionFromSpecializedClass.java @@ -0,0 +1,10 @@ +package org.test; + +public class FunctionFromSpecializedClass extends SpecializedFunctionClass { + + @Override + public String apply(String t) { + return null; + } + +} diff --git a/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/FunctionFromSpecializedInterface.java b/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/FunctionFromSpecializedInterface.java new file mode 100644 index 000000000..079fcc143 --- /dev/null +++ b/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/FunctionFromSpecializedInterface.java @@ -0,0 +1,10 @@ +package org.test; + +public class FunctionFromSpecializedInterface implements SpecializedFunctionInterface { + + @Override + public String apply(String t) { + return null; + } + +} diff --git a/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/LoopedFunctionClass.java b/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/LoopedFunctionClass.java new file mode 100644 index 000000000..dc1dceb93 --- /dev/null +++ b/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/LoopedFunctionClass.java @@ -0,0 +1,4 @@ +package org.test; + +public class LoopedFunctionClass implements LoopedInterface1 { +} diff --git a/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/LoopedInterface1.java b/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/LoopedInterface1.java new file mode 100644 index 000000000..d08a23aaf --- /dev/null +++ b/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/LoopedInterface1.java @@ -0,0 +1,6 @@ +package org.test; + +import java.util.function.Function; + +public interface LoopedInterface1 extends LoopedInterface2 { +} diff --git a/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/LoopedInterface2.java b/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/LoopedInterface2.java new file mode 100644 index 000000000..490a4fecf --- /dev/null +++ b/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/LoopedInterface2.java @@ -0,0 +1,4 @@ +package org.test; + +public interface LoopedInterface2 extends LoopedInterface1 { +} diff --git a/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/SpecializedFunctionClass.java b/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/SpecializedFunctionClass.java new file mode 100644 index 000000000..021211a65 --- /dev/null +++ b/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/SpecializedFunctionClass.java @@ -0,0 +1,6 @@ +package org.test; + +import java.util.function.Function; + +public abstract class SpecializedFunctionClass implements Function { +} diff --git a/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/SpecializedFunctionInterface.java b/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/SpecializedFunctionInterface.java new file mode 100644 index 000000000..3388dba99 --- /dev/null +++ b/headless-services/boot-java-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/SpecializedFunctionInterface.java @@ -0,0 +1,6 @@ +package org.test; + +import java.util.function.Function; + +public interface SpecializedFunctionInterface extends Function { +} From 1fb2c3a04b38b2baa4297aad8b4fd5f63a1a0240 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Tue, 2 Jan 2018 15:04:59 +0100 Subject: [PATCH 6/6] removed the @Bean marker for class-based functions --- .../vscode/boot/java/beans/BeansSymbolProvider.java | 11 +++++++---- .../beans/test/SpringIndexerFunctionBeansTest.java | 6 +++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java index 2058ae07e..23170d694 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java @@ -60,7 +60,7 @@ public class BeansSymbolProvider implements SymbolProvider { for (Tuple2 nameAndRegion : getBeanNames(node, doc)) { try { symbols.add(new SymbolInformation( - beanLabel(isFunction, nameAndRegion.getT1(), beanType), + beanLabel(isFunction, nameAndRegion.getT1(), beanType, "@Bean"), SymbolKind.Interface, new Location(doc.getUri(), doc.toRange(nameAndRegion.getT2())) )); @@ -78,7 +78,7 @@ public class BeansSymbolProvider implements SymbolProvider { if (functionBean != null) { try { SymbolInformation symbol = new SymbolInformation( - beanLabel(true, functionBean.getT1(), functionBean.getT2()), + beanLabel(true, functionBean.getT1(), functionBean.getT2(), null), SymbolKind.Interface, new Location(doc.getUri(), doc.toRange(functionBean.getT3()))); return ImmutableList.of(symbol); @@ -161,7 +161,7 @@ public class BeansSymbolProvider implements SymbolProvider { } } - protected String beanLabel(boolean isFunctionBean, String beanName, String beanType) { + protected String beanLabel(boolean isFunctionBean, String beanName, String beanType, String markerString) { StringBuilder symbolLabel = new StringBuilder(); symbolLabel.append('@'); symbolLabel.append(isFunctionBean ? '>' : '+'); @@ -169,7 +169,10 @@ public class BeansSymbolProvider implements SymbolProvider { symbolLabel.append('\''); symbolLabel.append(beanName); symbolLabel.append('\''); - symbolLabel.append(" (@Bean) "); + + markerString = markerString != null && markerString.length() > 0 ? " (" + markerString + ") " : " "; + symbolLabel.append(markerString); + symbolLabel.append(beanType); return symbolLabel.toString(); } diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerFunctionBeansTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerFunctionBeansTest.java index a560746ed..03d038c66 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerFunctionBeansTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerFunctionBeansTest.java @@ -65,7 +65,7 @@ public class SpringIndexerFunctionBeansTest { String uriPrefix = "file://" + directory.getAbsolutePath(); indexer.assertDocumentSymbols(uriPrefix + "/src/main/java/org/test/ScannedFunctionClass.java", - symbol("ScannedFunctionClass", "@> 'scannedFunctionClass' (@Bean) Function") + symbol("ScannedFunctionClass", "@> 'scannedFunctionClass' Function") ); } @@ -77,7 +77,7 @@ public class SpringIndexerFunctionBeansTest { String uriPrefix = "file://" + directory.getAbsolutePath(); indexer.assertDocumentSymbols(uriPrefix + "/src/main/java/org/test/FunctionFromSpecializedClass.java", - symbol("FunctionFromSpecializedClass", "@> 'functionFromSpecializedClass' (@Bean) Function") + symbol("FunctionFromSpecializedClass", "@> 'functionFromSpecializedClass' Function") ); } @@ -89,7 +89,7 @@ public class SpringIndexerFunctionBeansTest { String uriPrefix = "file://" + directory.getAbsolutePath(); indexer.assertDocumentSymbols(uriPrefix + "/src/main/java/org/test/FunctionFromSpecializedInterface.java", - symbol("FunctionFromSpecializedInterface", "@> 'functionFromSpecializedInterface' (@Bean) Function") + symbol("FunctionFromSpecializedInterface", "@> 'functionFromSpecializedInterface' Function") ); }