ignore abstract bean definition methods while scanning for bean symbols

This commit is contained in:
Martin Lippert
2018-03-06 11:24:29 +01:00
parent 5171b0c4fe
commit bdebabf696
4 changed files with 44 additions and 8 deletions

View File

@@ -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<EnhancedSymbolInformation> getSymbols(Annotation node, ITypeBinding annotationType, Collection<ITypeBinding> metaAnnotations, TextDocument doc) {
boolean isFunction = isFunctionBean(node);
if (isMethodAbstract(node)) return null;
ImmutableList.Builder<EnhancedSymbolInformation> symbols = ImmutableList.builder();
boolean isFunction = isFunctionBean(node);
String beanType = getBeanType(node);
for (Tuple2<String, DocumentRegion> 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<EnhancedSymbolInformation> getSymbols(MethodDeclaration methodDeclaration, TextDocument doc) {

View File

@@ -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<SymbolProvider> 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();

View File

@@ -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<SymbolProvider> 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()));
}

View File

@@ -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();
}