Skip to content

Commit 07f930f

Browse files
committed
Bean completion for all component beans (includes RestController)
1 parent b47096e commit 07f930f

File tree

2 files changed

+41
-24
lines changed

2 files changed

+41
-24
lines changed

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeanCompletionProvider.java

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import org.eclipse.jdt.core.dom.Block;
2424
import org.eclipse.jdt.core.dom.CompilationUnit;
2525
import org.eclipse.jdt.core.dom.FieldAccess;
26-
import org.eclipse.jdt.core.dom.IAnnotationBinding;
2726
import org.eclipse.jdt.core.dom.ITypeBinding;
2827
import org.eclipse.jdt.core.dom.SimpleName;
2928
import org.eclipse.jdt.core.dom.ThisExpression;
@@ -32,6 +31,8 @@
3231
import org.slf4j.Logger;
3332
import org.slf4j.LoggerFactory;
3433
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
34+
import org.springframework.ide.vscode.boot.java.Annotations;
35+
import org.springframework.ide.vscode.boot.java.annotations.AnnotationHierarchies;
3536
import org.springframework.ide.vscode.boot.java.handlers.CompletionProvider;
3637
import org.springframework.ide.vscode.boot.java.rewrite.RewriteRefactorings;
3738
import org.springframework.ide.vscode.commons.java.IJavaProject;
@@ -92,7 +93,8 @@ public void provideCompletions(ASTNode node, int offset, TextDocument doc,
9293
node = fa.getName();
9394
}
9495

95-
if (isSpringComponent(topLevelClass)) {
96+
97+
if (AnnotationHierarchies.get(node).isAnnotatedWith(topLevelClass.resolveBinding(), Annotations.COMPONENT)) {
9698
String className = getFullyQualifiedName(topLevelClass);
9799
Bean[] beans = this.springIndex.getBeansOfProject(project.getElementName());
98100
ITypeBinding topLevelBeanType = topLevelClass.resolveBinding();
@@ -133,28 +135,6 @@ public void provideCompletions(ASTNode node, int offset, TextDocument doc,
133135
}
134136
}
135137

136-
private static boolean isSpringComponent(TypeDeclaration node) {
137-
for (IAnnotationBinding annotation : node.resolveBinding().getAnnotations()) {
138-
if (isSpringComponentAnnotation(annotation)) {
139-
return true;
140-
}
141-
}
142-
return false;
143-
}
144-
145-
private static boolean isSpringComponentAnnotation(IAnnotationBinding annotation) {
146-
String annotationName = annotation.getAnnotationType().getQualifiedName();
147-
if (annotationName.equals("org.springframework.stereotype.Component")) {
148-
return true;
149-
}
150-
for (IAnnotationBinding metaAnnotation : annotation.getAnnotationType().getAnnotations()) {
151-
if (metaAnnotation.getAnnotationType().getQualifiedName().equals("org.springframework.stereotype.Component")) {
152-
return true;
153-
}
154-
}
155-
return false;
156-
}
157-
158138
private static TypeDeclaration findParentClass(ASTNode node) {
159139
ASTNode current = node;
160140
while (current != null) {

headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/BeanCompletionProviderTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,43 @@ public void test() {
520520
""");
521521
}
522522

523+
@Test
524+
public void completionsForRestController() throws Exception {
525+
String content = """
526+
package org.sample.test;
527+
528+
import org.springframework.web.bind.annotation.RestController;
529+
530+
@RestController
531+
public class TestBeanCompletionClass {
532+
public void test() {
533+
owner<*>
534+
}
535+
}
536+
""";
537+
538+
539+
assertCompletions(content, new String[] {"ownerRepository", "ownerService"}, 0,
540+
"""
541+
package org.sample.test;
542+
543+
import org.springframework.samples.petclinic.owner.OwnerRepository;
544+
import org.springframework.web.bind.annotation.RestController;
545+
546+
@RestController
547+
public class TestBeanCompletionClass {
548+
549+
private final OwnerRepository ownerRepository;
550+
551+
TestBeanCompletionClass(OwnerRepository ownerRepository) {
552+
this.ownerRepository = ownerRepository;
553+
}
554+
public void test() {
555+
ownerRepository<*>
556+
}
557+
}
558+
""");
559+
}
523560

524561
private void assertCompletions(String completionLine, String[] expectedCompletions, int chosenCompletion, String expectedResult) throws Exception {
525562
assertCompletions(completionLine, expectedCompletions.length, expectedCompletions, chosenCompletion, expectedResult);

0 commit comments

Comments
 (0)