Skip to content

Commit

Permalink
Add support for textDocument/linkedEditingRange
Browse files Browse the repository at this point in the history
Fixes #987

Signed-off-by: azerr <[email protected]>
  • Loading branch information
angelozerr committed Jun 3, 2021
1 parent 4497ae5 commit d6f779e
Show file tree
Hide file tree
Showing 25 changed files with 601 additions and 190 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@
import org.eclipse.lsp4j.FoldingRangeRequestParams;
import org.eclipse.lsp4j.Hover;
import org.eclipse.lsp4j.HoverParams;
import org.eclipse.lsp4j.LinkedEditingRangeParams;
import org.eclipse.lsp4j.LinkedEditingRanges;
import org.eclipse.lsp4j.Location;
import org.eclipse.lsp4j.LocationLink;
import org.eclipse.lsp4j.PublishDiagnosticsParams;
Expand Down Expand Up @@ -468,6 +470,12 @@ public CompletableFuture<List<SelectionRange>> selectionRange(SelectionRangePara
});
}

public CompletableFuture<LinkedEditingRanges> linkedEditingRange(LinkedEditingRangeParams params) {
return computeDOMAsync(params.getTextDocument(), (cancelChecker, xmlDocument) -> {
return getXMLLanguageService().findLinkedEditingRanges(xmlDocument, params.getPosition(), cancelChecker);
});
}

@Override
public void didSave(DidSaveTextDocumentParams params) {
computeAsync((monitor) -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ public List<CompletionItem> getCompletionItems(Range replaceRange, String lineDe
range = new Range(replaceRange.getStart(), end);
}
}
item.setTextEdit(new TextEdit(range, insertText));
item.setTextEdit(Either.forLeft(new TextEdit(range, insertText)));
item.setInsertTextFormat(InsertTextFormat.Snippet);
item.setSortText(snippet.getSortText());
return item;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -287,12 +287,16 @@ public boolean isInStartTag(int offset) {
}

public boolean isInEndTag(int offset) {
return isInEndTag(offset, false);
}

public boolean isInEndTag(int offset, boolean afterBackSlash) {
if (endTagOpenOffset == NULL_VALUE) {
// case >|
return false;
}
if (offset > endTagOpenOffset && offset < getEnd()) {
// case <\bean | >
if (offset > endTagOpenOffset + (afterBackSlash ? 1 : 0) && offset < getEnd()) {
// case </bean | >
return true;
}
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import org.eclipse.lsp4j.Range;
import org.eclipse.lsp4j.TextEdit;
import org.eclipse.lsp4j.jsonrpc.CancelChecker;
import org.eclipse.lsp4j.jsonrpc.messages.Either;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
Expand Down Expand Up @@ -219,7 +220,7 @@ private static void addTagName(NodeList list, Set<String> tags, ICompletionReque
item.setKind(CompletionItemKind.Property);
item.setFilterText(request.getFilterForStartTagName(tagName));
String xml = elt.getOwnerDocument().getText().substring(elt.getStart(), elt.getEnd());
item.setTextEdit(new TextEdit(request.getReplaceRange(), xml));
item.setTextEdit(Either.forLeft(new TextEdit(request.getReplaceRange(), xml)));
response.addCompletionItem(item);
tags.add(item.getLabel());
}
Expand Down Expand Up @@ -250,7 +251,7 @@ private static void addCompletionItem(CMElementDeclaration elementDeclaration, D
item.setDocumentation(documentation);
String xml = generator.generate(elementDeclaration, prefix,
isGenerateEndTag(request.getNode(), request.getOffset(), label));
item.setTextEdit(new TextEdit(request.getReplaceRange(), xml));
item.setTextEdit(Either.forLeft(new TextEdit(request.getReplaceRange(), xml)));
item.setInsertTextFormat(InsertTextFormat.Snippet);
response.addCompletionItem(item, true);
}
Expand Down Expand Up @@ -349,7 +350,7 @@ private void fillAttributeValuesWithCMAttributeDeclarations(CMElementDeclaration
item.setLabel(value);
item.setKind(CompletionItemKind.Value);
item.setFilterText(insertText);
item.setTextEdit(new TextEdit(fullRange, insertText));
item.setTextEdit(Either.forLeft(new TextEdit(fullRange, insertText)));
MarkupContent documentation = XMLGenerator.createMarkupContent(cmAttribute, value, cmElement, request);
item.setDocumentation(documentation);
response.addCompletionItem(item);
Expand Down Expand Up @@ -390,7 +391,7 @@ public void onXMLContent(ICompletionRequest request, ICompletionResponse respons
item.setLabel(value);
item.setKind(CompletionItemKind.Value);
item.setFilterText(tokenStart + insertText);
item.setTextEdit(new TextEdit(fullRange, insertText));
item.setTextEdit(Either.forLeft(new TextEdit(fullRange, insertText)));
MarkupContent documentation = XMLGenerator.createMarkupContent(cmElement, value, request);
item.setDocumentation(documentation);
response.addCompletionItem(item);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import org.eclipse.lsp4j.Range;
import org.eclipse.lsp4j.TextEdit;
import org.eclipse.lsp4j.jsonrpc.CancelChecker;
import org.eclipse.lsp4j.jsonrpc.messages.Either;
import org.w3c.dom.Entity;
import org.w3c.dom.NamedNodeMap;

Expand Down Expand Up @@ -143,7 +144,7 @@ private static void fillCompletion(String name, MarkupContent documentation, Ran
item.setInsertTextFormat(InsertTextFormat.PlainText);
String insertText = entityName;
item.setFilterText(insertText);
item.setTextEdit(new TextEdit(entityRange, insertText));
item.setTextEdit(Either.forLeft(new TextEdit(entityRange, insertText)));
item.setDocumentation(documentation);
response.addCompletionItem(item);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import org.eclipse.lsp4j.Range;
import org.eclipse.lsp4j.TextEdit;
import org.eclipse.lsp4j.jsonrpc.CancelChecker;
import org.eclipse.lsp4j.jsonrpc.messages.Either;

/**
* Extension to support completion for file, folder path in:
Expand Down Expand Up @@ -73,14 +74,15 @@ public class FilePathCompletionParticipant extends CompletionParticipantAdapter
private static final Logger LOGGER = Logger.getLogger(FilePathCompletionParticipant.class.getName());

@Override
public void onAttributeValue(String value, ICompletionRequest request, ICompletionResponse response, CancelChecker cancelChecker)
throws Exception {
public void onAttributeValue(String value, ICompletionRequest request, ICompletionResponse response,
CancelChecker cancelChecker) throws Exception {
// File path completion on attribute value
addCompletionItems(value, request, response);
}

@Override
public void onDTDSystemId(String value, ICompletionRequest request, ICompletionResponse response, CancelChecker cancelChecker) throws Exception {
public void onDTDSystemId(String value, ICompletionRequest request, ICompletionResponse response,
CancelChecker cancelChecker) throws Exception {
// File path completion on DTD DOCTYPE SYSTEM
addCompletionItems(value, request, response);
}
Expand Down Expand Up @@ -253,7 +255,7 @@ private static void createFilePathCompletionItem(File f, Range replaceRange, ICo

item.setSortText(CompletionSortTextHelper.getSortText(kind));
item.setFilterText(insertText);
item.setTextEdit(new TextEdit(replaceRange, insertText));
item.setTextEdit(Either.forLeft(new TextEdit(replaceRange, insertText)));
response.addCompletionItem(item);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import org.eclipse.lemminx.commons.BadLocationException;
import org.eclipse.lemminx.dom.DOMAttr;
import org.eclipse.lemminx.dom.DOMDocument;
Expand All @@ -29,6 +30,7 @@
import org.eclipse.lsp4j.MarkupKind;
import org.eclipse.lsp4j.Range;
import org.eclipse.lsp4j.TextEdit;
import org.eclipse.lsp4j.jsonrpc.messages.Either;
import org.w3c.dom.NamedNodeMap;

import com.google.common.base.Charsets;
Expand Down Expand Up @@ -160,7 +162,7 @@ private static void createCompletionItemsForValues(Collection<String> enumeratio
item.setLabel(option);
item.setFilterText(insertText);
item.setKind(CompletionItemKind.Enum);
item.setTextEdit(new TextEdit(editRange, insertText));
item.setTextEdit(Either.forLeft(new TextEdit(editRange, insertText)));
item.setSortText(Integer.toString(sortText));
sortText++;
response.addCompletionItem(item);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public void onXMLContent(ICompletionRequest request, ICompletionResponse respons
item.setKind(CompletionItemKind.Property);
item.setDocumentation(Either.forLeft(label));
item.setFilterText(insertText);
item.setTextEdit(new TextEdit(range, insertText));
item.setTextEdit(Either.forLeft(new TextEdit(range, insertText)));
item.setInsertTextFormat(InsertTextFormat.PlainText);
response.addCompletionItem(item);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import org.eclipse.lsp4j.Range;
import org.eclipse.lsp4j.TextEdit;
import org.eclipse.lsp4j.jsonrpc.CancelChecker;
import org.eclipse.lsp4j.jsonrpc.messages.Either;

/**
* XSD completion for
Expand All @@ -42,8 +43,8 @@
public class XSDCompletionParticipant extends CompletionParticipantAdapter {

@Override
public void onAttributeValue(String valuePrefix, ICompletionRequest request, ICompletionResponse response, CancelChecker cancelChecker)
throws Exception {
public void onAttributeValue(String valuePrefix, ICompletionRequest request, ICompletionResponse response,
CancelChecker cancelChecker) throws Exception {
DOMNode node = request.getNode();
DOMDocument document = node.getOwnerDocument();
if (!DOMUtils.isXSD(document)) {
Expand All @@ -67,7 +68,7 @@ public void onAttributeValue(String valuePrefix, ICompletionRequest request, ICo
item.setLabel(value);
item.setKind(CompletionItemKind.Value);
item.setFilterText(insertText);
item.setTextEdit(new TextEdit(fullRange, insertText));
item.setTextEdit(Either.forLeft(new TextEdit(fullRange, insertText)));
response.addCompletionItem(item);
});
if (bindingType.isSimple()) {
Expand All @@ -83,7 +84,7 @@ public void onAttributeValue(String valuePrefix, ICompletionRequest request, ICo
item.setLabel(value);
item.setKind(CompletionItemKind.Value);
item.setFilterText(insertText);
item.setTextEdit(new TextEdit(fullRange, insertText));
item.setTextEdit(Either.forLeft(new TextEdit(fullRange, insertText)));
response.addCompletionItem(item);
});
}
Expand Down
Loading

0 comments on commit d6f779e

Please sign in to comment.