From 399d496b57fe5a31e8cd47926373e53d1533fe4a Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Mon, 18 Sep 2017 12:12:10 +0200 Subject: [PATCH] implemented first steps towards symbol provider for @Component --- .../java/beans/ComponentSymbolProvider.java | 48 +++++++++++++++++++ .../boot/java/utils/AnnotationIndexer.java | 2 +- .../test/AnnotationIndexerBeansTest.java | 12 +++++ 3 files changed, 61 insertions(+), 1 deletion(-) 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 021fa5cf2..13f9bc6b0 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 @@ -10,8 +10,13 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.java.beans; +import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.Annotation; +import org.eclipse.jdt.core.dom.MethodDeclaration; +import org.eclipse.jdt.core.dom.TypeDeclaration; +import org.eclipse.lsp4j.Location; import org.eclipse.lsp4j.SymbolInformation; +import org.eclipse.lsp4j.SymbolKind; import org.springframework.ide.vscode.boot.java.handlers.SymbolProvider; import org.springframework.ide.vscode.commons.util.text.TextDocument; @@ -22,6 +27,49 @@ public class ComponentSymbolProvider implements SymbolProvider { @Override public SymbolInformation getSymbol(Annotation node, TextDocument doc) { + try { + StringBuilder symbolLabel = new StringBuilder(); + symbolLabel.append("@Bean"); + + String beanName = getBeanName(node); + String beanType = getBeanType(node); + + symbolLabel.append(' '); + symbolLabel.append(beanName); + symbolLabel.append(' '); + symbolLabel.append(beanType); + + SymbolInformation symbol = new SymbolInformation(symbolLabel.toString(), SymbolKind.Interface, + new Location(doc.getUri(), doc.toRange(node.getStartPosition(), node.getLength()))); + return symbol; + } + catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + private String getBeanName(Annotation node) { + ASTNode parent = node.getParent(); + if (parent instanceof TypeDeclaration) { + TypeDeclaration type = (TypeDeclaration) parent; + + String beanName = type.getName().toString(); + if (beanName.length() > 0 && Character.isUpperCase(beanName.charAt(0))) { + beanName = Character.toLowerCase(beanName.charAt(0)) + beanName.substring(1); + } + return beanName; + } + return null; + } + + private String getBeanType(Annotation node) { + ASTNode parent = node.getParent(); + if (parent instanceof TypeDeclaration) { + TypeDeclaration type = (TypeDeclaration) parent; + String returnType = type.resolveBinding().getQualifiedName(); + return returnType; + } return null; } diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/AnnotationIndexer.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/AnnotationIndexer.java index 863e1fec8..53fcc4c29 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/AnnotationIndexer.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/AnnotationIndexer.java @@ -65,6 +65,7 @@ public class AnnotationIndexer { public void reset() { this.symbols.clear(); + this.symbolsByDoc.clear(); } public List getAllSymbols() { @@ -167,7 +168,6 @@ public class AnnotationIndexer { } private void extractSymbolInformation(Annotation node, String docURI) throws Exception { - System.out.println("annotation found: " + node.toString()); ITypeBinding typeBinding = node.resolveTypeBinding(); if (typeBinding != null) { diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/AnnotationIndexerBeansTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/AnnotationIndexerBeansTest.java index 6e1f7c3b5..155d4d7ee 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/AnnotationIndexerBeansTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/AnnotationIndexerBeansTest.java @@ -63,6 +63,18 @@ public class AnnotationIndexerBeansTest { assertTrue(containsSymbol(symbols, "@Bean simpleBean org.test.BeanClass", uriPrefix + "/src/main/java/org/test/SimpleConfiguration.java", 8, 1, 8, 8)); } + @Test + public void testScanSimpleComponentClass() throws Exception { + AnnotationIndexer indexer = new AnnotationIndexer(projectFinder, symbolProviders); + File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI()); + indexer.scanFiles(directory); + + String uriPrefix = "file://" + directory.getAbsolutePath(); + List symbols = indexer.getSymbols(uriPrefix + "/src/main/java/org/test/SimpleComponent.java"); + assertEquals(1, symbols.size()); + assertTrue(containsSymbol(symbols, "@Bean simpleComponent org.test.SimpleComponent", uriPrefix + "/src/main/java/org/test/SimpleComponent.java", 4, 0, 4, 10)); + } + 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();