Skip to content

Commit

Permalink
Lazy resolve the new text of text edit
Browse files Browse the repository at this point in the history
- When 'java.completion.lazyResolveTextEdit.enabled' turns on, the completion
  proposal will not resolve the text edit until 'completionItem/resolve'.

Signed-off-by: Sheng Chen <sheche@microsoft.com>
  • Loading branch information
jdneo authored and rgrunber committed May 11, 2023
1 parent b3202c1 commit 21c9a79
Show file tree
Hide file tree
Showing 3 changed files with 662 additions and 504 deletions.
Expand Up @@ -20,6 +20,7 @@
import java.util.Map;
import java.util.stream.Stream;

import org.apache.commons.lang3.StringUtils;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
Expand Down Expand Up @@ -160,27 +161,33 @@ public void updateReplacement(CompletionProposal proposal, CompletionItem item,

setInsertReplaceRange(proposal, insertReplaceEdit);

switch (proposal.getKind()) {
case CompletionProposal.METHOD_DECLARATION:
appendMethodOverrideReplacement(completionBuffer, proposal);
break;
case CompletionProposal.POTENTIAL_METHOD_DECLARATION:
if (proposal instanceof GetterSetterCompletionProposal getterSetterProposal) {
appendMethodPotentialReplacement(completionBuffer, getterSetterProposal);
} else {
if (preferences.isCompletionLazyResolveTextEditEnabled() && !isResolvingRequest) {
if (completionBuffer.isEmpty()) {
completionBuffer.append(getDefaultTextEditText(item));
}
} else {
switch (proposal.getKind()) {
case CompletionProposal.METHOD_DECLARATION:
appendMethodOverrideReplacement(completionBuffer, proposal);
break;
case CompletionProposal.POTENTIAL_METHOD_DECLARATION:
if (proposal instanceof GetterSetterCompletionProposal getterSetterProposal) {
appendMethodPotentialReplacement(completionBuffer, getterSetterProposal);
} else {
appendReplacementString(completionBuffer, proposal);
}
break;
case CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION:
case CompletionProposal.ANONYMOUS_CLASS_DECLARATION:
appendAnonymousClass(completionBuffer, proposal, insertReplaceEdit);
break;
case CompletionProposal.LAMBDA_EXPRESSION:
appendLambdaExpressionReplacement(completionBuffer, proposal);
break;
default:
appendReplacementString(completionBuffer, proposal);
}
break;
case CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION:
case CompletionProposal.ANONYMOUS_CLASS_DECLARATION:
appendAnonymousClass(completionBuffer, proposal, insertReplaceEdit);
break;
case CompletionProposal.LAMBDA_EXPRESSION:
appendLambdaExpressionReplacement(completionBuffer, proposal);
break;
default:
appendReplacementString(completionBuffer, proposal);
break;
break;
}
}

//select insertTextFormat.
Expand Down Expand Up @@ -214,6 +221,22 @@ public void updateReplacement(CompletionProposal proposal, CompletionItem item,
}
}

/**
* Return a default text edit text (more like a placeholder). And let it
* be corrected in completionItem/resolve request.
*/
private String getDefaultTextEditText(CompletionItem item) {
if (StringUtils.isNotBlank(item.getInsertText())) {
return item.getInsertText();
}

if (StringUtils.isNotBlank(item.getLabel())) {
return item.getLabel();
}

return "";
}

private void appendLambdaExpressionReplacement(StringBuilder completionBuffer, CompletionProposal proposal) {
StringBuilder paramBuffer = new StringBuilder();
appendGuessingCompletion(paramBuffer, proposal);
Expand Down

0 comments on commit 21c9a79

Please sign in to comment.