From bd34877b73b6d9795473f87537e9b226fbf30d76 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Thu, 25 Aug 2022 14:49:40 +0200 Subject: [PATCH] GH-818: do not create bean symbols for annotation declarations --- .../java/beans/ComponentSymbolProvider.java | 19 ++++++++++++++--- .../beans/test/SpringIndexerBeansTest.java | 10 ++++++++- .../main/java/org/test/CustomAnnotation.java | 21 +++++++++++++++++++ 3 files changed, 46 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/CustomAnnotation.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 f39d67dd9..1b5de3c15 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2019 Pivotal, Inc. + * Copyright (c) 2017, 2022 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 @@ -15,6 +15,7 @@ import java.util.stream.Collectors; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.Annotation; +import org.eclipse.jdt.core.dom.AnnotationTypeDeclaration; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.lsp4j.Location; @@ -42,8 +43,10 @@ public class ComponentSymbolProvider extends AbstractSymbolProvider { @Override protected void addSymbolsPass1(Annotation node, ITypeBinding annotationType, Collection metaAnnotations, SpringIndexerJavaContext context, TextDocument doc) { try { - EnhancedSymbolInformation enhancedSymbol = createSymbol(node, annotationType, metaAnnotations, doc); - context.getGeneratedSymbols().add(new CachedSymbol(context.getDocURI(), context.getLastModified(), enhancedSymbol)); + if (!isOnAnnotationDeclaration(node)) { + EnhancedSymbolInformation enhancedSymbol = createSymbol(node, annotationType, metaAnnotations, doc); + context.getGeneratedSymbols().add(new CachedSymbol(context.getDocURI(), context.getLastModified(), enhancedSymbol)); + } } catch (Exception e) { log.error("", e); @@ -114,5 +117,15 @@ public class ComponentSymbolProvider extends AbstractSymbolProvider { } return null; } + + private boolean isOnAnnotationDeclaration(Annotation node) { + ASTNode parent = node.getParent(); + if (parent != null && parent instanceof AnnotationTypeDeclaration) { + return true; + } + return false; + } + + } 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 2c012c7ab..40bd79666 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2019 Pivotal, Inc. + * Copyright (c) 2017, 2022 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 @@ -165,4 +165,12 @@ public class SpringIndexerBeansTest { ); } + @Test + public void testCustomAnnotationClass() throws Exception { + String docUri = directory.toPath().resolve("src/main/java/org/test/CustomAnnotation.java").toUri().toString(); + SpringIndexerHarness.assertDocumentSymbols(indexer, docUri, + SpringIndexerHarness.symbol("@AliasFor(annotation = Component.class)", "@AliasFor(annotation=Component.class)") + ); + } + } diff --git a/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/CustomAnnotation.java b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/CustomAnnotation.java new file mode 100644 index 000000000..f693d845b --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-annotation-indexing-beans/src/main/java/org/test/CustomAnnotation.java @@ -0,0 +1,21 @@ +package org.test; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.core.annotation.AliasFor; +import org.springframework.stereotype.Component; + +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Component +public @interface CustomAnnotation { + + @AliasFor(annotation = Component.class) + String value() default ""; + +}