From 4e90e8137a2574690848adc2e2381c1acd7d4764 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Fri, 17 Jan 2025 21:40:22 +0100 Subject: [PATCH] GH-1451: component symbol provider now takes attribute value into account when calculating the bean name Fixes GH-1451 --- .../java/beans/ComponentSymbolProvider.java | 17 +++++++++++++---- .../java/beans/test/SpringIndexerBeansTest.java | 16 ++++++++++++++++ .../SpecialNameComponentWithAttributeName.java | 7 +++++++ 3 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 headless-services/spring-boot-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/SpecialNameComponentWithAttributeName.java diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java index 515dffff0..f34dbee69 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java @@ -13,11 +13,13 @@ package org.springframework.ide.vscode.boot.java.beans; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import org.eclipse.jdt.core.dom.Annotation; +import org.eclipse.jdt.core.dom.Expression; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.lsp4j.Location; @@ -80,7 +82,7 @@ public class ComponentSymbolProvider extends AbstractSymbolProvider { TypeDeclaration type = (TypeDeclaration) node.getParent(); - String beanName = getBeanName(type); + String beanName = getBeanName(node, type); ITypeBinding beanType = getBeanType(type); Location location = new Location(doc.getUri(), doc.toRange(node.getStartPosition(), node.getLength())); @@ -138,9 +140,16 @@ public class ComponentSymbolProvider extends AbstractSymbolProvider { return symbolLabel.toString(); } - private String getBeanName(TypeDeclaration type) { - String beanName = type.getName().toString(); - return BeanUtils.getBeanNameFromType(beanName); + public static String getBeanName(Annotation annotation, TypeDeclaration type) { + Optional attribute = ASTUtils.getAttribute(annotation, "value"); + if (attribute.isPresent()) { + return ASTUtils.getExpressionValueAsString(attribute.get(), (a) -> {}); + } + else { + String beanName = type.getName().toString(); + return BeanUtils.getBeanNameFromType(beanName); + } + } private ITypeBinding getBeanType(TypeDeclaration type) { 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 e4d0c8df0..2beeab130 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 @@ -145,6 +145,22 @@ public class SpringIndexerBeansTest { ); } + @Test + void testScanComponentClassWithName() throws Exception { + String docUri = directory.toPath().resolve("src/main/java/org/test/SpecialNameComponent.java").toUri().toString(); + SpringIndexerHarness.assertDocumentSymbols(indexer, docUri, + SpringIndexerHarness.symbol("@Component(\"specialName\")", "@+ 'specialName' (@Component) SpecialNameComponent") + ); + } + + @Test + void testScanComponentClassWithNameAndAttributeName() throws Exception { + String docUri = directory.toPath().resolve("src/main/java/org/test/SpecialNameComponentWithAttributeName.java").toUri().toString(); + SpringIndexerHarness.assertDocumentSymbols(indexer, docUri, + SpringIndexerHarness.symbol("@Component(value = \"specialNameWithAttributeName\")", "@+ 'specialNameWithAttributeName' (@Component) SpecialNameComponentWithAttributeName") + ); + } + @Test void testScanSimpleControllerClass() throws Exception { String docUri = directory.toPath().resolve("src/main/java/org/test/SimpleController.java").toUri().toString(); diff --git a/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/SpecialNameComponentWithAttributeName.java b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/SpecialNameComponentWithAttributeName.java new file mode 100644 index 000000000..6f592eef4 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/SpecialNameComponentWithAttributeName.java @@ -0,0 +1,7 @@ +package org.test; + +import org.springframework.stereotype.Component; + +@Component(value = "specialNameWithAttributeName") +public class SpecialNameComponentWithAttributeName { +}