From bdebabf696b23375080d1f566eefc0b6698ba32f Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Tue, 6 Mar 2018 11:24:29 +0100 Subject: [PATCH] ignore abstract bean definition methods while scanning for bean symbols --- .../boot/java/beans/BeansSymbolProvider.java | 22 +++++++++++++++++-- .../beans/test/SpringIndexerBeansTest.java | 15 ++++++++++--- .../test/SpringIndexerFunctionBeansTest.java | 3 --- .../org/test/AbstractBeanConfiguration.java | 12 ++++++++++ 4 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 headless-services/spring-boot-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/AbstractBeanConfiguration.java diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java index bf33c1ce8..0570a4ca6 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java @@ -11,11 +11,14 @@ package org.springframework.ide.vscode.boot.java.beans; import java.util.Collection; +import java.util.List; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.Annotation; +import org.eclipse.jdt.core.dom.IExtendedModifier; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.MethodDeclaration; +import org.eclipse.jdt.core.dom.Modifier; import org.eclipse.jdt.core.dom.ParameterizedType; import org.eclipse.jdt.core.dom.StringLiteral; import org.eclipse.jdt.core.dom.Type; @@ -48,9 +51,11 @@ public class BeansSymbolProvider implements SymbolProvider { @Override public Collection getSymbols(Annotation node, ITypeBinding annotationType, Collection metaAnnotations, TextDocument doc) { - boolean isFunction = isFunctionBean(node); - + if (isMethodAbstract(node)) return null; + ImmutableList.Builder symbols = ImmutableList.builder(); + + boolean isFunction = isFunctionBean(node); String beanType = getBeanType(node); for (Tuple2 nameAndRegion : getBeanNames(node, doc)) { try { @@ -167,6 +172,19 @@ public class BeansSymbolProvider implements SymbolProvider { } return false; } + + private boolean isMethodAbstract(Annotation node) { + if (node != null && node.getParent() != null && node.getParent() instanceof MethodDeclaration) { + MethodDeclaration method = (MethodDeclaration) node.getParent(); + List modifiers = method.modifiers(); + for (Object modifier : modifiers) { + if (modifier instanceof Modifier && ((Modifier) modifier).isAbstract()) { + return true; + } + } + } + return false; + } @Override public Collection getSymbols(MethodDeclaration methodDeclaration, TextDocument doc) { diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java index 9a951c44e..bbb9240b4 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java @@ -20,7 +20,6 @@ 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.BootJavaLanguageServerHarness; import org.springframework.ide.vscode.project.harness.ProjectsHarness; @@ -31,7 +30,6 @@ public class SpringIndexerBeansTest { private AnnotationHierarchyAwareLookup symbolProviders; private BootJavaLanguageServerHarness harness; - private JavaProjectFinder projectFinder; @Before public void setup() throws Exception { @@ -40,7 +38,6 @@ public class SpringIndexerBeansTest { symbolProviders.put(Annotations.COMPONENT, new ComponentSymbolProvider()); harness = BootJavaLanguageServerHarness.builder().build(); - projectFinder = harness.getProjectFinder(); harness.intialize(new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI())); } @@ -85,6 +82,18 @@ public class SpringIndexerBeansTest { ); } + @Test + public void testScanAbstractBeanConfiguration() throws Exception { + SpringIndexerHarness indexer = createIndexerHarness(); + File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI()); + indexer.initialize(indexer.wsFolder(directory)); + + String docUri = directory.toPath().resolve("src/main/java/org/test/AbstractBeanConfiguration.java").toUri().toString(); + indexer.assertDocumentSymbols(docUri, + symbol("@Configuration", "@+ 'abstractBeanConfiguration' (@Configuration <: @Component) AbstractBeanConfiguration") + ); + } + @Test public void testScanSimpleComponentClass() throws Exception { SpringIndexerHarness indexer = createIndexerHarness(); diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerFunctionBeansTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerFunctionBeansTest.java index f7c2c07bd..8b45d4609 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerFunctionBeansTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerFunctionBeansTest.java @@ -20,7 +20,6 @@ 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.BootJavaLanguageServerHarness; import org.springframework.ide.vscode.project.harness.ProjectsHarness; @@ -31,7 +30,6 @@ public class SpringIndexerFunctionBeansTest { private AnnotationHierarchyAwareLookup symbolProviders; private BootJavaLanguageServerHarness harness; - private JavaProjectFinder projectFinder; @Before public void setup() throws Exception { @@ -40,7 +38,6 @@ public class SpringIndexerFunctionBeansTest { symbolProviders.put(Annotations.COMPONENT, new ComponentSymbolProvider()); harness = BootJavaLanguageServerHarness.builder().build(); - projectFinder = harness.getProjectFinder(); harness.intialize(new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI())); } diff --git a/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/AbstractBeanConfiguration.java b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/AbstractBeanConfiguration.java new file mode 100644 index 000000000..1713eb2a8 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/AbstractBeanConfiguration.java @@ -0,0 +1,12 @@ +package org.test; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public abstract class AbstractBeanConfiguration { + + @Bean + public abstract BeanClass abstractBean(); + +}