From cdf585c7fbf0eea12730b66093b8c6d4cbee29fe Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Fri, 14 Jan 2022 19:41:09 -0500 Subject: [PATCH] Support either for text edits in test-harness --- .../languageserver/testharness/Editor.java | 57 ++++++++++--------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java index 60366f1c0..90da7180c 100644 --- a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java +++ b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java @@ -41,6 +41,7 @@ import org.eclipse.lsp4j.DefinitionParams; import org.eclipse.lsp4j.Diagnostic; import org.eclipse.lsp4j.DocumentSymbol; import org.eclipse.lsp4j.Hover; +import org.eclipse.lsp4j.InsertReplaceEdit; import org.eclipse.lsp4j.LocationLink; import org.eclipse.lsp4j.MarkedString; import org.eclipse.lsp4j.MarkupContent; @@ -451,38 +452,42 @@ public class Editor { public void apply(CompletionItem completion) throws Exception { completion = harness.resolveCompletionItem(completion); - TextEdit edit = completion.getTextEdit().getLeft(); + Either edit = completion.getTextEdit(); String docText = doc.getText(); - if (edit!=null) { - String replaceWith = edit.getNewText(); - int cursorReplaceOffset = 0; + if (edit != null) { + if (edit.isLeft()) { + String replaceWith = edit.getLeft().getNewText(); + int cursorReplaceOffset = 0; - if (!Boolean.getBoolean("lsp.completions.indentation.enable")) { - //Apply indentfix, this is magic vscode seems to apply to edits returned by language server. So our harness has to - // mimick that behavior. See https://github.com/Microsoft/language-server-protocol/issues/83 - int referenceLine = edit.getRange().getStart().getLine(); - int cursorOffset = edit.getRange().getStart().getCharacter(); - String referenceIndent = doc.getLineIndentString(referenceLine); - if (cursorOffset= 0) { - replaceWith = replaceWith.substring(0, cursorReplaceOffset) - + replaceWith.substring(cursorReplaceOffset + VS_CODE_CURSOR_MARKER.length()); + // Replace the cursor string + cursorReplaceOffset = replaceWith.indexOf(VS_CODE_CURSOR_MARKER); + if (cursorReplaceOffset >= 0) { + replaceWith = replaceWith.substring(0, cursorReplaceOffset) + + replaceWith.substring(cursorReplaceOffset + VS_CODE_CURSOR_MARKER.length()); + } else { + cursorReplaceOffset = replaceWith.length(); + } + + Range rng = edit.getLeft().getRange(); + int start = doc.toOffset(rng.getStart()); + int end = doc.toOffset(rng.getEnd()); + replaceText(start, end, replaceWith); + selectionStart = selectionEnd = start+cursorReplaceOffset; } else { - cursorReplaceOffset = replaceWith.length(); + throw new UnsupportedOperationException("InsertReplaceEdit edits not supported"); } - - Range rng = edit.getRange(); - int start = doc.toOffset(rng.getStart()); - int end = doc.toOffset(rng.getEnd()); - replaceText(start, end, replaceWith); - selectionStart = selectionEnd = start+cursorReplaceOffset; } else { String insertText = getInsertText(completion); String newText = docText.substring(0, selectionStart) + insertText + docText.substring(selectionStart);