Skip to content

Commit e696e83

Browse files
committed
Completions order for non-java context. Bean completions score.
1 parent c9f93ff commit e696e83

File tree

11 files changed

+64
-46
lines changed

11 files changed

+64
-46
lines changed

headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/CompositeCompletionEngine.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.slf4j.LoggerFactory;
1717
import org.springframework.ide.vscode.commons.languageserver.util.LanguageSpecific;
1818
import org.springframework.ide.vscode.commons.util.Assert;
19+
import org.springframework.ide.vscode.commons.util.text.IDocument;
1920
import org.springframework.ide.vscode.commons.util.text.LanguageId;
2021
import org.springframework.ide.vscode.commons.util.text.TextDocument;
2122

@@ -78,5 +79,19 @@ public InternalCompletionList getCompletions(TextDocument document, int offset)
7879
return new InternalCompletionList(completions.build(), isIncomplete);
7980
}
8081
};
82+
83+
@Override
84+
public boolean keepCompletionsOrder(IDocument doc) {
85+
Collection<ICompletionEngine> engines = subEngines.get(doc.getLanguageId());
86+
if (engines != null) {
87+
for (ICompletionEngine e : engines) {
88+
if (e.keepCompletionsOrder(doc)) {
89+
return true;
90+
}
91+
}
92+
}
93+
return false;
94+
}
95+
8196

8297
}

headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/ICompletionEngine.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
*******************************************************************************/
1111
package org.springframework.ide.vscode.commons.languageserver.completion;
1212

13+
import org.springframework.ide.vscode.commons.util.text.IDocument;
1314
import org.springframework.ide.vscode.commons.util.text.TextDocument;
1415

1516
/**
@@ -19,4 +20,6 @@ public interface ICompletionEngine {
1920

2021
InternalCompletionList getCompletions(TextDocument document, int offset) throws Exception;
2122

23+
default boolean keepCompletionsOrder(IDocument doc) { return false; };
24+
2225
}

headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/VscodeCompletionEngineAdapter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ public CompletionList getCompletions(CancelChecker cancelToken, TextDocumentPosi
225225
boolean isIncomplete = rawCompletionList.isIncomplete();
226226

227227
List<CompletionItem> items = new ArrayList<>(completions.size());
228-
SortKeys sortkeys = new SortKeys();
228+
Optional<SortKeys> sortkeysOpt = engine.keepCompletionsOrder(doc) ? Optional.of(new SortKeys()) : Optional.empty();
229229
int count = 0;
230230

231231
for (ICompletionProposal c : completions) {
@@ -237,7 +237,7 @@ public CompletionList getCompletions(CancelChecker cancelToken, TextDocumentPosi
237237
break;
238238
}
239239
try {
240-
items.add(adaptItem(doc, c, sortkeys));
240+
items.add(adaptItem(doc, c, sortkeysOpt));
241241
} catch (Exception e) {
242242
log.error("error computing completion", e);
243243
}
@@ -274,11 +274,11 @@ public CompletionList getCompletions(CancelChecker cancelToken, TextDocumentPosi
274274
return SimpleTextDocumentService.NO_COMPLETIONS;
275275
}
276276

277-
private CompletionItem adaptItem(TextDocument doc, ICompletionProposal completion, SortKeys sortkeys) throws Exception {
277+
private CompletionItem adaptItem(TextDocument doc, ICompletionProposal completion, Optional<SortKeys> sortkeysOpt) throws Exception {
278278
CompletionItem item = new CompletionItem();
279279
item.setLabel(completion.getLabel());
280280
item.setKind(completion.getKind());
281-
item.setSortText(sortkeys.next());
281+
sortkeysOpt.ifPresent(sortkeys -> item.setSortText(sortkeys.next()));
282282
item.setFilterText(completion.getFilterText());
283283
item.setInsertTextMode(InsertTextMode.AsIs);
284284
item.setLabelDetails(completion.getLabelDetails());

headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/DefaultCompletionFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public String getLabel() {
113113

114114
@Override
115115
public CompletionItemKind getKind() {
116-
return CompletionItemKind.Keyword;
116+
return CompletionItemKind.Value;
117117
}
118118

119119
@Override

headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/YamlCompletionEngine.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,4 +480,10 @@ protected YamlPath getContextPath(YamlDocument doc, SNode node, int offset) thro
480480
throw new IllegalStateException("Missing case");
481481
}
482482
}
483+
484+
@Override
485+
public boolean keepCompletionsOrder(IDocument doc) {
486+
return true;
487+
}
488+
483489
}

headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -585,21 +585,6 @@ public Editor clone() {
585585
public List<CompletionItem> getCompletions() throws Exception {
586586
CompletionList cl = harness.getCompletions(this.doc, this.getCursor());
587587
ArrayList<CompletionItem> items = new ArrayList<>(cl.getItems());
588-
Collections.sort(items, new Comparator<CompletionItem>() {
589-
590-
@Override
591-
public int compare(CompletionItem o1, CompletionItem o2) {
592-
return sortKey(o1).compareTo(sortKey(o2));
593-
}
594-
595-
private String sortKey(CompletionItem item) {
596-
String k = item.getSortText();
597-
if (k == null) {
598-
k = item.getLabel();
599-
}
600-
return k;
601-
}
602-
});
603588
return items;
604589
}
605590

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.Map;
1515
import java.util.Optional;
1616

17+
import org.apache.commons.text.similarity.JaroWinklerSimilarity;
1718
import org.eclipse.jdt.core.dom.ASTNode;
1819
import org.eclipse.jdt.core.dom.Assignment;
1920
import org.eclipse.jdt.core.dom.Block;
@@ -36,7 +37,6 @@
3637
import org.springframework.ide.vscode.commons.rewrite.java.FixDescriptor;
3738
import org.springframework.ide.vscode.commons.rewrite.java.InjectBeanCompletionRecipe;
3839
import org.springframework.ide.vscode.commons.util.BadLocationException;
39-
import org.springframework.ide.vscode.commons.util.FuzzyMatcher;
4040
import org.springframework.ide.vscode.commons.util.Renderable;
4141
import org.springframework.ide.vscode.commons.util.Renderables;
4242
import org.springframework.ide.vscode.commons.util.text.IDocument;
@@ -76,7 +76,7 @@ public BeanCompletionProposal(ASTNode node, int offset, IDocument doc, String be
7676
this.rewriteRefactorings = rewriteRefactorings;
7777
this.prefix = computePrefix();
7878
this.edits = computeEdit();
79-
this.score = FuzzyMatcher.matchScore(prefix, beanId);
79+
this.score = /*FuzzyMatcher.matchScore*/computeJaroWinklerScore(prefix, beanId);
8080
}
8181

8282
@Override
@@ -88,6 +88,10 @@ public String getLabel() {
8888
public CompletionItemKind getKind() {
8989
return CompletionItemKind.Field;
9090
}
91+
92+
private static double computeJaroWinklerScore(CharSequence pattern, CharSequence data) {
93+
return pattern.isEmpty() ? 1 / (double) Integer.MAX_VALUE : new JaroWinklerSimilarity().apply(pattern, data);
94+
}
9195

9296
private String computePrefix() {
9397
String prefix = "";

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/providers/DataRepositoryQueryStartCompletionProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public void addProposals(Collection<ICompletionProposal> completions, IDocument
3333
for(QueryMethodSubject queryMethodSubject : QueryMethodSubject.QUERY_METHOD_SUBJECTS){
3434
String toInsert = queryMethodSubject.key() + "By";
3535
if(prefix == null || (toInsert.length() > localPrefix.length() && toInsert.startsWith(localPrefix)) || isOffsetAfterWhitespace(doc, offset)) {
36-
completions.add(FindByCompletionProposal.createProposal(offset, CompletionItemKind.Text, prefix, toInsert, toInsert, true, null));
36+
completions.add(FindByCompletionProposal.createProposal(offset, CompletionItemKind.Method, prefix, toInsert, toInsert, true, null));
3737
}
3838
}
3939
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/providers/prefixsensitive/DataRepositoryPrefixSensitiveCompletionProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ private void createLastWordReplacementCompletion(Collection<ICompletionProposal>
114114
if (toReplace.startsWith(lastWord)) {
115115
DocumentEdits edits = new DocumentEdits(null, false);
116116
edits.replace(offset - lastWord.length(), offset, toReplace);
117-
ICompletionProposal proposal = new FindByCompletionProposal(toReplace, CompletionItemKind.Text, edits, "property " + toReplace, null, null, lastWord, true);
117+
ICompletionProposal proposal = new FindByCompletionProposal(toReplace, CompletionItemKind.Property, edits, "property " + toReplace, null, null, lastWord, true);
118118
completions.add(proposal);
119119
}
120120
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/properties/completions/SpringPropertiesCompletionEngine.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
2525
import org.springframework.ide.vscode.commons.languageserver.util.LanguageSpecific;
2626
import org.springframework.ide.vscode.commons.util.BadLocationException;
27+
import org.springframework.ide.vscode.commons.util.text.IDocument;
2728
import org.springframework.ide.vscode.commons.util.text.LanguageId;
2829
import org.springframework.ide.vscode.commons.util.text.TextDocument;
2930

@@ -79,4 +80,9 @@ public Collection<LanguageId> supportedLanguages() {
7980
return ImmutableList.of(LanguageId.BOOT_PROPERTIES);
8081
}
8182

83+
@Override
84+
public boolean keepCompletionsOrder(IDocument doc) {
85+
return true;
86+
}
87+
8288
}

0 commit comments

Comments
 (0)