From d5b21a7e8cd72f5bb7ba91b89cff7813e402a6fb Mon Sep 17 00:00:00 2001 From: aboyko Date: Thu, 3 Apr 2025 17:40:02 -0400 Subject: [PATCH] No bean completion proposals in type declaration block --- .../java/beans/BeanCompletionProvider.java | 9 ++++ .../test/BeanCompletionProviderTest.java | 44 ++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) 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 cdd440805..30e7e31fc 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 @@ -69,6 +69,15 @@ public class BeanCompletionProvider implements CompletionProvider { && (node instanceof SimpleName || node instanceof Block || node instanceof FieldAccess || node instanceof ThisExpression)) { try { + // Should be inside the block but not inside type declaration block. + ASTNode block = node; + for (; block != null && !(block instanceof Block); block = block.getParent()) { + } + // Not inside the block? Or inside the Type Declaration block? Bail out! + if (block == null || block instanceof Block && block.getParent() instanceof TypeDeclaration) { + return; + } + if (node instanceof SimpleName) { if (node.getParent() instanceof FieldAccess fa && !(fa.getExpression() instanceof ThisExpression)) { return; 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 3a26a26c5..e8f79e3d5 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 @@ -1220,6 +1220,48 @@ public class TestBeanCompletionClass { assertCompletions(content, new String[0], 0, null); } + @Test + public void constructorNoCompletions_3() throws Exception { + String content = """ + package org.sample.test; + + import org.springframework.stereotype.Component; + + @Component + public class Comp1 { + + ow<*> + + public Comp1() { + + } + } + """; + + assertCompletions(content, new String[0], 0, null); + } + + @Test + public void constructorNoCompletions_4() throws Exception { + String content = """ + package org.sample.test; + + import org.springframework.stereotype.Component; + + @Component + public class Comp1 { + + ow<*> + + Comp1() { + + } + } + """; + + assertCompletions(content, new String[0], 0, null); + } + private void assertCompletions(String completionLine, String[] expectedCompletions, int chosenCompletion, String expectedResult) throws Exception { Editor editor = harness.newEditor(LanguageId.JAVA, completionLine, tempJavaDocUri); @@ -1230,7 +1272,7 @@ public class TestBeanCompletionClass { if (expectedCompletions != null) { String[] completionItems = completions.stream() .map(item -> item.getLabel()) - .limit(expectedCompletions.length) + .limit(expectedCompletions.length == 0 ? Integer.MAX_VALUE : expectedCompletions.length) .toArray(size -> new String[size]); assertArrayEquals(expectedCompletions, completionItems);