Skip to content

Commit

Permalink
Implement itemDefaults for CompletionList
Browse files Browse the repository at this point in the history
Signed-off-by: Jessica He <[email protected]>
  • Loading branch information
JessicaJHee authored and rgrunber committed Mar 24, 2023
1 parent 2f5984d commit 00391c1
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,12 @@
import org.eclipse.jdt.ls.core.internal.handlers.CompletionResponses;
import org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager;
import org.eclipse.lsp4j.CompletionItem;
import org.eclipse.lsp4j.CompletionItemDefaults;
import org.eclipse.lsp4j.CompletionItemKind;
import org.eclipse.lsp4j.CompletionItemTag;
import org.eclipse.lsp4j.InsertReplaceRange;
import org.eclipse.lsp4j.Range;
import org.eclipse.lsp4j.jsonrpc.messages.Either;

import com.google.common.collect.ImmutableSet;

Expand All @@ -68,6 +71,7 @@ public final class CompletionProposalRequestor extends CompletionRequestor {
private boolean isComplete = true;
private PreferenceManager preferenceManager;
private CompletionProposalReplacementProvider proposalProvider;
private CompletionItemDefaults itemDefaults;

static class ProposalComparator implements Comparator<CompletionProposal> {

Expand Down Expand Up @@ -115,6 +119,12 @@ public boolean isComplete() {
return isComplete;
}

public CompletionItemDefaults getCompletionItemDefaults() {
if (itemDefaults == null) {
itemDefaults = new CompletionItemDefaults();
}
return itemDefaults;
}
// Update SUPPORTED_KINDS when mapKind changes
// @formatter:off
public static final Set<CompletionItemKind> SUPPORTED_KINDS = ImmutableSet.of(CompletionItemKind.Constructor,
Expand Down Expand Up @@ -231,6 +241,9 @@ public List<CompletionItem> getCompletionItems(IProgressMonitor monitor) {
int limit = Math.min(proposals.size(), maxCompletions);
List<CompletionItem> completionItems = new ArrayList<>(limit);

if (!proposals.isEmpty()){
initializeCompletionListItemDefaults(proposals.get(0));
}
//Let's compute replacement texts for the most relevant results only
for (int i = 0; i < limit; i++) {
CompletionProposal proposal = proposals.get(i);
Expand Down Expand Up @@ -299,8 +312,22 @@ private CompletionRankingAggregation[] getAggregatedRankingResult(IProgressMonit
return resultCombination;
}

private void initializeCompletionListItemDefaults(CompletionProposal proposal) {
CompletionItem completionItem = new CompletionItem();
CompletionItemDefaults itemDefaults = getCompletionItemDefaults();
proposalProvider.updateReplacement(proposal, completionItem, '\0');
if (completionItem.getInsertTextFormat() != null && preferenceManager.getClientPreferences().isCompletionListItemDefaultsInsertTextFormatSupport()) {
itemDefaults.setInsertTextFormat(completionItem.getInsertTextFormat());
}
if (completionItem.getTextEdit() != null && preferenceManager.getClientPreferences().isCompletionListItemDefaultsEditRangeSupport()) {
itemDefaults.setEditRange(getEditRange(completionItem, preferenceManager));
}
}


public CompletionItem toCompletionItem(CompletionProposal proposal, int index) {
final CompletionItem $ = new CompletionItem();
CompletionItemDefaults itemDefaults = getCompletionItemDefaults();
$.setKind(mapKind(proposal));
if (Flags.isDeprecated(proposal.getFlags())) {
if (preferenceManager.getClientPreferences().isCompletionItemTagSupported()) {
Expand Down Expand Up @@ -337,10 +364,27 @@ public CompletionItem toCompletionItem(CompletionProposal proposal, int index) {
if (replace != null && replace.getEnd().getLine() != replace.getStart().getLine()) {
replace.setEnd(replace.getStart());
}
if (itemDefaults.getEditRange() != null && itemDefaults.getEditRange().equals(getEditRange($, preferenceManager))) {
$.setTextEditText(newText);
$.setTextEdit(null);
}
}
if (itemDefaults.getInsertTextFormat() != null && itemDefaults.getInsertTextFormat() == $.getInsertTextFormat()) {
$.setInsertTextFormat(null);
}
return $;
}

private static Either<Range, InsertReplaceRange> getEditRange(CompletionItem completionItem, PreferenceManager preferenceManager) {
if (preferenceManager.getClientPreferences().isCompletionInsertReplaceSupport()) {
return Either.forRight(new InsertReplaceRange(completionItem.getTextEdit().getRight().getInsert(), completionItem.getTextEdit().getRight().getReplace()));
} else {
Range range = completionItem.getTextEdit().isLeft() ? completionItem.getTextEdit().getLeft().getRange()
: (completionItem.getTextEdit().getRight().getInsert() != null ? completionItem.getTextEdit().getRight().getInsert() : completionItem.getTextEdit().getRight().getReplace());
return Either.forLeft(range);
}
}

@Override
public void acceptContext(CompletionContext context) {
super.acceptContext(context);
Expand All @@ -357,7 +401,6 @@ public void acceptContext(CompletionContext context) {
);
}


private CompletionItemKind mapKind(final CompletionProposal proposal) {
//When a new CompletionItemKind is added, don't forget to update SUPPORTED_KINDS
int kind = proposal.getKind();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,9 @@ public boolean isCanceled() {
proposals.sort(PROPOSAL_COMPARATOR);
CompletionList list = new CompletionList(proposals);
list.setIsIncomplete(!collector.isComplete() || completionForConstructor);
if (isCompletionListItemDefaultsSupport()){
list.setItemDefaults(collector.getCompletionItemDefaults());
}
return list;
}

Expand Down Expand Up @@ -286,4 +289,9 @@ private boolean isCompletionForConstructor(CompletionParams params, ICompilation
public boolean isIndexEngineEnabled() {
return !JDTEnvironmentUtils.isSyntaxServer();
}

private boolean isCompletionListItemDefaultsSupport() {
return this.manager != null && this.manager.getClientPreferences() != null
&& (this.manager.getClientPreferences().isCompletionListItemDefaultsEditRangeSupport() || this.manager.getClientPreferences().isCompletionListItemDefaultsInsertTextFormatSupport());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,22 @@ public boolean isCompletionInsertReplaceSupport() {
&& capabilities.getTextDocument().getCompletion().getCompletionItem().getInsertReplaceSupport().booleanValue();
}

public boolean isCompletionListItemDefaultsEditRangeSupport() {
return v3supported
&& capabilities.getTextDocument().getCompletion() != null
&& capabilities.getTextDocument().getCompletion().getCompletionList() != null
&& capabilities.getTextDocument().getCompletion().getCompletionList().getItemDefaults() != null
&& capabilities.getTextDocument().getCompletion().getCompletionList().getItemDefaults().contains("editRange");
}

public boolean isCompletionListItemDefaultsInsertTextFormatSupport() {
return v3supported
&& capabilities.getTextDocument().getCompletion() != null
&& capabilities.getTextDocument().getCompletion().getCompletionList() != null
&& capabilities.getTextDocument().getCompletion().getCompletionList().getItemDefaults() != null
&& capabilities.getTextDocument().getCompletion().getCompletionList().getItemDefaults().contains("insertTextFormat");
}

public boolean isInlayHintRefreshSupported() {
return v3supported
&& capabilities.getWorkspace().getInlayHint() != null
Expand Down

0 comments on commit 00391c1

Please sign in to comment.