diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeanCompletionProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeanCompletionProvider.java index 13d84f1c77..e85ebe2286 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeanCompletionProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeanCompletionProvider.java @@ -23,7 +23,6 @@ import org.eclipse.jdt.core.dom.Block; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.FieldAccess; -import org.eclipse.jdt.core.dom.IAnnotationBinding; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.SimpleName; import org.eclipse.jdt.core.dom.ThisExpression; @@ -32,6 +31,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex; +import org.springframework.ide.vscode.boot.java.Annotations; +import org.springframework.ide.vscode.boot.java.annotations.AnnotationHierarchies; import org.springframework.ide.vscode.boot.java.handlers.CompletionProvider; import org.springframework.ide.vscode.boot.java.rewrite.RewriteRefactorings; import org.springframework.ide.vscode.commons.java.IJavaProject; @@ -92,7 +93,8 @@ public void provideCompletions(ASTNode node, int offset, TextDocument doc, node = fa.getName(); } - if (isSpringComponent(topLevelClass)) { + + if (AnnotationHierarchies.get(node).isAnnotatedWith(topLevelClass.resolveBinding(), Annotations.COMPONENT)) { String className = getFullyQualifiedName(topLevelClass); Bean[] beans = this.springIndex.getBeansOfProject(project.getElementName()); ITypeBinding topLevelBeanType = topLevelClass.resolveBinding(); @@ -133,28 +135,6 @@ public void provideCompletions(ASTNode node, int offset, TextDocument doc, } } - private static boolean isSpringComponent(TypeDeclaration node) { - for (IAnnotationBinding annotation : node.resolveBinding().getAnnotations()) { - if (isSpringComponentAnnotation(annotation)) { - return true; - } - } - return false; - } - - private static boolean isSpringComponentAnnotation(IAnnotationBinding annotation) { - String annotationName = annotation.getAnnotationType().getQualifiedName(); - if (annotationName.equals("org.springframework.stereotype.Component")) { - return true; - } - for (IAnnotationBinding metaAnnotation : annotation.getAnnotationType().getAnnotations()) { - if (metaAnnotation.getAnnotationType().getQualifiedName().equals("org.springframework.stereotype.Component")) { - return true; - } - } - return false; - } - private static TypeDeclaration findParentClass(ASTNode node) { ASTNode current = node; while (current != null) { diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/BeanCompletionProviderTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/BeanCompletionProviderTest.java index 2b431dfddb..77ae3002a4 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/BeanCompletionProviderTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/BeanCompletionProviderTest.java @@ -520,6 +520,43 @@ public void test() { """); } + @Test + public void completionsForRestController() throws Exception { + String content = """ + package org.sample.test; + + import org.springframework.web.bind.annotation.RestController; + + @RestController + public class TestBeanCompletionClass { + public void test() { + owner<*> + } + } + """; + + + assertCompletions(content, new String[] {"ownerRepository", "ownerService"}, 0, + """ + package org.sample.test; + + import org.springframework.samples.petclinic.owner.OwnerRepository; + import org.springframework.web.bind.annotation.RestController; + + @RestController + public class TestBeanCompletionClass { + + private final OwnerRepository ownerRepository; + + TestBeanCompletionClass(OwnerRepository ownerRepository) { + this.ownerRepository = ownerRepository; + } + public void test() { + ownerRepository<*> + } + } + """); + } private void assertCompletions(String completionLine, String[] expectedCompletions, int chosenCompletion, String expectedResult) throws Exception { assertCompletions(completionLine, expectedCompletions.length, expectedCompletions, chosenCompletion, expectedResult);