diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/ICompletionProposal.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/ICompletionProposal.java index 131ef4453..134292231 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/ICompletionProposal.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/ICompletionProposal.java @@ -39,7 +39,7 @@ public interface ICompletionProposal { default boolean isDeprecated() { return false; } - default ICompletionProposal dropLabelPrefix(int numberOfDroppedChars) { + default TransformedCompletion dropLabelPrefix(int numberOfDroppedChars) { return new TransformedCompletion(this) { @Override protected String tranformLabel(String originalLabel) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java index 08530fbcb..fb629251a 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/yaml/completions/ApplicationYamlAssistContext.java @@ -450,6 +450,10 @@ public abstract class ApplicationYamlAssistContext extends AbstractYamlAssistCon ScoreableProposal completion = completionFactory.property( doc.getDocument(), edits, match, typeUtil ); + String prefix = indexNav.getPrefix(); + if (StringUtil.hasText(prefix)) { + completion = completion.dropLabelPrefix(prefix.length()+1); + } if (getContextRoot(doc).exists(YamlPath.fromProperty(match.data.getId()))) { completion.deemphasize(DEEMP_EXISTS); } diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java index 2dc104a63..bc639058c 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/ApplicationYamlEditorTest.java @@ -71,6 +71,98 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { //////////////////////////////////////////////////////////////////////////////////////// + @Test public void abbreviateLongPrefixCompletions() throws Exception { + //See: https://github.com/spring-projects/sts4/issues/361 + Editor editor; + + data("spring.data.jpa.very.long.foobar", "java.lang.String", null, null); + data("spring.data.jpa.very.long.barbar", "java.lang.String", null, null); + data("spring.data.jpa.very.long.foofoo", "java.lang.String", null, null); + data("spring.data.jpa.very.long.barfoo", "java.lang.String", null, null); + data("spring.data.jpa.very.long.foobar.more", "java.lang.String", null, null); + data("spring.data.jpa.very.long.barbar.more", "java.lang.String", null, null); + data("spring.data.jpa.very.long.foofoo.more", "java.lang.String", null, null); + data("spring.data.jpa.very.long.barfoo.more", "java.lang.String", null, null); + + + editor = newEditor( + "spring:\n" + + " data:\n" + + " jpa:\n" + + " very:\n" + + " bar<*>" + ); + editor.assertCompletions( + "spring:\n" + + " data:\n" + + " jpa:\n" + + " very:\n" + + " long:\n" + + " barbar: <*>", + "spring:\n" + + " data:\n" + + " jpa:\n" + + " very:\n" + + " long:\n" + + " barfoo: <*>", + "spring:\n" + + " data:\n" + + " jpa:\n" + + " very:\n" + + " long:\n" + + " foobar: <*>", + "spring:\n" + + " data:\n" + + " jpa:\n" + + " very:\n" + + " long:\n" + + " barbar:\n"+ + " more: <*>", + "spring:\n" + + " data:\n" + + " jpa:\n" + + " very:\n" + + " long:\n" + + " barfoo:\n"+ + " more: <*>", + "spring:\n" + + " data:\n" + + " jpa:\n" + + " very:\n" + + " long:\n" + + " foobar:\n"+ + " more: <*>" + ); + + editor.assertCompletionLabels( + "long.barbar", + "long.barfoo", + "long.foobar", + "long.barbar.more", + "long.barfoo.more", + "long.foobar.more" + ); + + editor = newEditor( + "spring:\n" + + " data:\n" + + " jpa:\n" + + " vr<*>" + ); + editor.assertCompletionLabels( + "very.long.barbar", + "very.long.barfoo", + "very.long.foobar", + "very.long.foofoo", + "very.long.barbar.more", + "very.long.barfoo.more", + "very.long.foobar.more", + "very.long.foofoo.more" + ); + + } + + @Test public void bug_GH_327() throws Exception { //See https://github.com/spring-projects/sts4/issues/327 data("spring.resources.static-locations", "java.lang.Boolean", null, "Blah"); @@ -3358,7 +3450,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { " p<*>" ); - editor.assertCompletionLabels("server.port"); + editor.assertCompletionLabels("port");