From be10667f46838aa217ac1964a610d82aa6bc8380 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Fri, 21 Jun 2024 18:30:42 +0200 Subject: [PATCH] GH-1280: do not show up mapping completions on the type declaration --- .../boot/java/snippets/JavaSnippetContext.java | 7 ++++++- .../test/RequestMappingSnippetTests.java | 13 ++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetContext.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetContext.java index 550508be6..4b7376b0c 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetContext.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetContext.java @@ -20,7 +20,12 @@ public interface JavaSnippetContext { JavaSnippetContext BOOT_MEMBERS = (node, offset, prefix) -> node instanceof TypeDeclaration || node instanceof SimpleName; JavaSnippetContext AT_ROOT_LEVEL = (node, offset, prefix) -> { - if (node instanceof TypeDeclaration) return true; + if (node instanceof TypeDeclaration) { + TypeDeclaration typeNode = (TypeDeclaration) node; + SimpleName name = typeNode.getName(); + + return offset > (name.getStartPosition() + name.getLength()); + } ASTNode nodeBeforePrefix = NodeFinder.perform(node.getRoot(), offset - (prefix.length() + 1), 0); return nodeBeforePrefix != null && nodeBeforePrefix instanceof TypeDeclaration; diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSnippetTests.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSnippetTests.java index 609286e96..0f70a616c 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSnippetTests.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSnippetTests.java @@ -14,6 +14,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import java.io.InputStream; +import java.nio.charset.Charset; import java.util.List; import org.apache.commons.io.IOUtils; @@ -227,13 +228,23 @@ public class RequestMappingSnippetTests { } } + @Test + void testSnippetNotShowUpOnClassDeclaration() throws Exception { + prepareCase(CONTROLLER_CLASSNAME, "@Controller", "@Controller\n<*>"); + + List completions = editor.getCompletions(); + for (CompletionItem completionItem : completions) { + assertNotEquals("@GetMapping(..) {..}", completionItem.getLabel()); + } + } + private void prepareCase(String className, String prefix) throws Exception { prepareCase(className, "class " + className + " {", "class " + className + " {\n\n" + prefix); } private void prepareCase(String className, String replace, String replaceWith) throws Exception { InputStream resource = this.getClass().getResourceAsStream("/test-projects/test-request-mapping-completions/src/main/java/example/" + className + ".java"); - String content = IOUtils.toString(resource); + String content = IOUtils.toString(resource, Charset.defaultCharset()); content = content.replace(replace, replaceWith); editor = new Editor(harness, content, LanguageId.JAVA);