From d0dd97ca0f869a1c0355d0e8475d67707581821f Mon Sep 17 00:00:00 2001 From: aboyko Date: Mon, 13 Nov 2023 17:49:23 -0500 Subject: [PATCH] No snippet proposals for offset inside compiler problem range --- .../java/snippets/JavaSnippetManager.java | 6 ++ .../test/RequestMappingSnippetTests.java | 78 +++++++++++++++++-- 2 files changed, 78 insertions(+), 6 deletions(-) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetManager.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetManager.java index 86a983c74..64d1d6c2f 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetManager.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetManager.java @@ -11,6 +11,7 @@ package org.springframework.ide.vscode.boot.java.snippets; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.function.Supplier; @@ -47,6 +48,11 @@ public class JavaSnippetManager { } public void getCompletions(IDocument doc, int offset, ASTNode node, CompilationUnit cu, Collection completions) { + // check if current offset is within the range of possible compiler problems + if (Arrays.stream(cu.getProblems()).anyMatch(p -> p.getSourceStart() <= offset && offset <= p.getSourceEnd())) { + return; + } + DocumentRegion query = PREFIX_FINDER.getPrefixRegion(doc, offset); for (JavaSnippet javaSnippet : snippets) { 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 96d26fd62..45a37c618 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 @@ -49,7 +49,7 @@ public class RequestMappingSnippetTests { @Test void getMapping() throws Exception { prepareCase("Get<*>"); - assertOneSnippet("package example;\n" + assertSnippets("package example;\n" + "\n" + "import org.springframework.stereotype.Controller;\n" + "import org.springframework.web.bind.annotation.DeleteMapping;\n" @@ -110,6 +110,70 @@ public class RequestMappingSnippetTests { + " return name;\n" + " }\n" + "}\n" + + "", + + "package example;\n" + + "\n" + + "import org.springframework.stereotype.Controller;\n" + + "import org.springframework.web.bind.annotation.DeleteMapping;\n" + + "import org.springframework.web.bind.annotation.GetMapping;\n" + + "import org.springframework.web.bind.annotation.PathVariable;\n" + + "import org.springframework.web.bind.annotation.PostMapping;\n" + + "import org.springframework.web.bind.annotation.PutMapping;\n" + + "import org.springframework.web.bind.annotation.RequestBody;\n" + + "import org.springframework.web.bind.annotation.RequestMapping;\n" + + "import org.springframework.web.bind.annotation.ResponseBody;\n" + + "import org.springframework.web.bind.annotation.RequestMethod;\n" + + "import org.springframework.web.bind.annotation.RequestParam;\n" + + "\n" + + "\n" + + "/** Boot Java - Test Completion */\n" + + "@Controller\n" + + "public class RestApi {\n" + + "\n" + + "@RequestMapping(value=\"${1:path}\", method=RequestMethod.${2:GET})\n" + + "public ${3:SomeData} ${4:requestMethodName}(@RequestParam ${5:String} ${6:param}) {\n" + + " return new ${3:SomeData}($0);\n" + + "}\n" + + "<*>\n" + + "\n" + + "\n" + + " @RequestMapping(\"/hello\")\n" + + " @ResponseBody\n" + + " public String hello() {\n" + + " return \"Hello there!\";\n" + + " }\n" + + " \n" + + " \n" + + " @RequestMapping(\"/goodbye\")\n" + + " @ResponseBody\n" + + " public String goodbye() {\n" + + " return \"Good bye\";\n" + + " }\n" + + "\n" + + " @GetMapping(\"/person/{name}\")\n" + + " public String getMapping(@PathVariable String name) {\n" + + " return \"Hello \" + name;\n" + + " }\n" + + "\n" + + " @DeleteMapping(\"/delete/{id}\")\n" + + " public String removeMe(@PathVariable int id) {\n" + + " System.out.println(\"You are removed: \" + id);\n" + + " return \"Done\";\n" + + " }\n" + + "\n" + + " @PostMapping(\"/postHello\")\n" + + " public String postMethod(@RequestBody String name) {\n" + + " System.out.println(\"Posted hello: \" + name);\n" + + " return name;\n" + + " }\n" + + "\n" + + " @PutMapping(\"/put/{id}\")\n" + + " public String putMethod(@PathVariable int id, @RequestBody String name) {\n" + + " System.out.println(\"Added \" + name + \" with ID: \" + id);\n" + + " return name;\n" + + " }\n" + + "}\n" + ""); } @@ -121,12 +185,14 @@ public class RequestMappingSnippetTests { editor = new Editor(harness, content, LanguageId.JAVA); } - private void assertOneSnippet(String expected) throws Exception { + private void assertSnippets(String... expected) throws Exception { List completions = editor.getCompletions(); - assertEquals(1, completions.size()); - Editor clonedEditor = editor.clone(); - clonedEditor.apply(completions.get(0)); - assertEquals(expected, clonedEditor.getText()); + assertEquals(expected.length, completions.size()); + for (int i = 0; i < expected.length; i++) { + Editor clonedEditor = editor.clone(); + clonedEditor.apply(completions.get(i)); + assertEquals(expected[i], clonedEditor.getText()); + } } }