Skip to content

Commit

Permalink
Provide cancel support for hover
Browse files Browse the repository at this point in the history
Fixes #1474

Signed-off-by: azerr <[email protected]>
  • Loading branch information
angelozerr authored and datho7561 committed Mar 22, 2023
1 parent 9bb4dd2 commit b34a847
Show file tree
Hide file tree
Showing 18 changed files with 101 additions and 67 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@
import org.eclipse.lemminx.services.IXMLDocumentProvider;
import org.eclipse.lemminx.services.IXMLValidationService;
import org.eclipse.lemminx.services.extensions.IDocumentLinkParticipant;
import org.eclipse.lemminx.services.extensions.IHoverParticipant;
import org.eclipse.lemminx.services.extensions.ITypeDefinitionParticipant;
import org.eclipse.lemminx.services.extensions.IXMLExtension;
import org.eclipse.lemminx.services.extensions.XMLExtensionsRegistry;
Expand All @@ -48,6 +47,7 @@
import org.eclipse.lemminx.services.extensions.commands.IXMLCommandService;
import org.eclipse.lemminx.services.extensions.completion.ICompletionParticipant;
import org.eclipse.lemminx.services.extensions.diagnostics.IDiagnosticsParticipant;
import org.eclipse.lemminx.services.extensions.hover.IHoverParticipant;
import org.eclipse.lemminx.services.extensions.save.ISaveContext;
import org.eclipse.lemminx.uriresolver.URIResolverExtensionManager;
import org.eclipse.lemminx.utils.DOMUtils;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,16 @@
import org.eclipse.lemminx.extensions.contentmodel.model.ContentModelManager;
import org.eclipse.lemminx.extensions.contentmodel.utils.XMLGenerator;
import org.eclipse.lemminx.extensions.xsi.XSISchemaModel;
import org.eclipse.lemminx.services.extensions.HoverParticipantAdapter;
import org.eclipse.lemminx.services.extensions.IHoverRequest;
import org.eclipse.lemminx.services.extensions.ISharedSettingsRequest;
import org.eclipse.lemminx.services.extensions.hover.HoverParticipantAdapter;
import org.eclipse.lemminx.services.extensions.hover.IHoverRequest;
import org.eclipse.lemminx.uriresolver.CacheResourceDownloadingException;
import org.eclipse.lemminx.utils.MarkupContentFactory;
import org.eclipse.lemminx.utils.StringUtils;
import org.eclipse.lsp4j.Hover;
import org.eclipse.lsp4j.MarkupContent;
import org.eclipse.lsp4j.MarkupKind;
import org.eclipse.lsp4j.jsonrpc.CancelChecker;

/**
* Extension to support XML hover based on content model (XML Schema
Expand All @@ -44,7 +45,7 @@
public class ContentModelHoverParticipant extends HoverParticipantAdapter {

@Override
public Hover onTag(IHoverRequest hoverRequest) throws Exception {
public Hover onTag(IHoverRequest hoverRequest, CancelChecker cancelChecker) throws Exception {
try {
ContentModelManager contentModelManager = hoverRequest.getComponent(ContentModelManager.class);
DOMElement element = (DOMElement) hoverRequest.getNode();
Expand All @@ -69,7 +70,7 @@ public Hover onTag(IHoverRequest hoverRequest) throws Exception {
}

@Override
public Hover onAttributeName(IHoverRequest hoverRequest) throws Exception {
public Hover onAttributeName(IHoverRequest hoverRequest, CancelChecker cancelChecker) throws Exception {
DOMAttr attribute = (DOMAttr) hoverRequest.getNode();
DOMElement element = attribute.getOwnerElement();
try {
Expand Down Expand Up @@ -98,7 +99,7 @@ public Hover onAttributeName(IHoverRequest hoverRequest) throws Exception {
}

@Override
public Hover onAttributeValue(IHoverRequest hoverRequest) throws Exception {
public Hover onAttributeValue(IHoverRequest hoverRequest, CancelChecker cancelChecker) throws Exception {
DOMAttr attribute = (DOMAttr) hoverRequest.getNode();

// Attempts to compute specifically for XSI related attributes since
Expand Down Expand Up @@ -138,7 +139,7 @@ public Hover onAttributeValue(IHoverRequest hoverRequest) throws Exception {
}

@Override
public Hover onText(IHoverRequest hoverRequest) throws Exception {
public Hover onText(IHoverRequest hoverRequest, CancelChecker cancelChecker) throws Exception {
DOMText text = (DOMText) hoverRequest.getNode();
DOMElement element = text.getParentElement();
if (element == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@
import org.eclipse.lemminx.extensions.entities.participants.EntitiesDefinitionParticipant;
import org.eclipse.lemminx.extensions.entities.participants.EntitiesHoverParticipant;
import org.eclipse.lemminx.services.extensions.IDefinitionParticipant;
import org.eclipse.lemminx.services.extensions.IHoverParticipant;
import org.eclipse.lemminx.services.extensions.IXMLExtension;
import org.eclipse.lemminx.services.extensions.XMLExtensionsRegistry;
import org.eclipse.lemminx.services.extensions.completion.ICompletionParticipant;
import org.eclipse.lemminx.services.extensions.hover.IHoverParticipant;
import org.eclipse.lsp4j.InitializeParams;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,15 @@
import org.eclipse.lemminx.extensions.entities.EntitiesDocumentationUtils;
import org.eclipse.lemminx.extensions.entities.EntitiesDocumentationUtils.EntityOriginType;
import org.eclipse.lemminx.extensions.entities.EntitiesDocumentationUtils.PredefinedEntity;
import org.eclipse.lemminx.services.extensions.HoverParticipantAdapter;
import org.eclipse.lemminx.services.extensions.IHoverRequest;
import org.eclipse.lemminx.services.extensions.hover.HoverParticipantAdapter;
import org.eclipse.lemminx.services.extensions.hover.IHoverRequest;
import org.eclipse.lemminx.utils.XMLPositionUtility;
import org.eclipse.lemminx.utils.XMLPositionUtility.EntityReferenceRange;
import org.eclipse.lsp4j.Hover;
import org.eclipse.lsp4j.MarkupContent;
import org.eclipse.lsp4j.MarkupKind;
import org.eclipse.lsp4j.Range;
import org.eclipse.lsp4j.jsonrpc.CancelChecker;
import org.w3c.dom.Entity;
import org.w3c.dom.NamedNodeMap;

Expand All @@ -42,7 +43,7 @@
public class EntitiesHoverParticipant extends HoverParticipantAdapter {

@Override
public Hover onText(IHoverRequest request) throws Exception {
public Hover onText(IHoverRequest request, CancelChecker cancelChecker) throws Exception {
DOMNode node = request.getNode();
if (!node.isText()) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@
import org.eclipse.lemminx.dom.DOMDocument;
import org.eclipse.lemminx.dom.DOMElement;
import org.eclipse.lemminx.dom.DOMNode;
import org.eclipse.lemminx.services.extensions.IHoverRequest;
import org.eclipse.lemminx.services.extensions.completion.AttributeCompletionItem;
import org.eclipse.lemminx.services.extensions.completion.ICompletionRequest;
import org.eclipse.lemminx.services.extensions.completion.ICompletionResponse;
import org.eclipse.lemminx.services.extensions.hover.IHoverRequest;
import org.eclipse.lemminx.settings.SharedSettings;
import org.eclipse.lemminx.utils.StringUtils;
import org.eclipse.lsp4j.CompletionItem;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@
import org.eclipse.lemminx.extensions.xsi.participants.XSICompletionParticipant;
import org.eclipse.lemminx.extensions.xsi.participants.XSIFormatterParticipant;
import org.eclipse.lemminx.extensions.xsi.participants.XSIHoverParticipant;
import org.eclipse.lemminx.services.extensions.IHoverParticipant;
import org.eclipse.lemminx.services.extensions.IXMLExtension;
import org.eclipse.lemminx.services.extensions.XMLExtensionsRegistry;
import org.eclipse.lemminx.services.extensions.completion.ICompletionParticipant;
import org.eclipse.lemminx.services.extensions.format.IFormatterParticipant;
import org.eclipse.lemminx.services.extensions.hover.IHoverParticipant;
import org.eclipse.lsp4j.InitializeParams;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,18 @@

import org.eclipse.lemminx.dom.DOMAttr;
import org.eclipse.lemminx.extensions.xsi.XSISchemaModel;
import org.eclipse.lemminx.services.extensions.HoverParticipantAdapter;
import org.eclipse.lemminx.services.extensions.IHoverRequest;
import org.eclipse.lemminx.services.extensions.hover.HoverParticipantAdapter;
import org.eclipse.lemminx.services.extensions.hover.IHoverRequest;
import org.eclipse.lsp4j.Hover;
import org.eclipse.lsp4j.jsonrpc.CancelChecker;

/**
* XSIHoverParticipant
*/
public class XSIHoverParticipant extends HoverParticipantAdapter {

@Override
public Hover onAttributeName(IHoverRequest request) throws Exception {
public Hover onAttributeName(IHoverRequest request, CancelChecker cancelChecker) throws Exception {
DOMAttr attribute = (DOMAttr) request.getNode();
return XSISchemaModel.computeHoverResponse(attribute, request);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
import org.eclipse.lemminx.dom.DOMAttr;
import org.eclipse.lemminx.dom.DOMDocument;
import org.eclipse.lemminx.dom.DOMNode;
import org.eclipse.lemminx.services.extensions.IHoverRequest;
import org.eclipse.lemminx.services.extensions.XMLExtensionsRegistry;
import org.eclipse.lemminx.services.extensions.hover.IHoverRequest;
import org.eclipse.lemminx.settings.SharedSettings;
import org.eclipse.lemminx.settings.XMLHoverSettings;
import org.eclipse.lsp4j.Position;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
import org.eclipse.lemminx.dom.parser.Scanner;
import org.eclipse.lemminx.dom.parser.TokenType;
import org.eclipse.lemminx.dom.parser.XMLScanner;
import org.eclipse.lemminx.services.extensions.IHoverParticipant;
import org.eclipse.lemminx.services.extensions.XMLExtensionsRegistry;
import org.eclipse.lemminx.services.extensions.hover.IHoverParticipant;
import org.eclipse.lemminx.settings.SharedSettings;
import org.eclipse.lemminx.utils.MarkupContentFactory;
import org.eclipse.lemminx.utils.XMLPositionUtility;
Expand Down Expand Up @@ -72,51 +72,52 @@ public Hover doHover(DOMDocument xmlDocument, Position position, SharedSettings
if (element.hasEndTag() && offset >= element.getEndTagOpenOffset()) {
Range tagRange = getTagNameRange(TokenType.EndTag, element.getEndTagOpenOffset(), offset, xmlDocument);
if (tagRange != null) {
return getTagHover(hoverRequest, tagRange, false);
return getTagHover(hoverRequest, tagRange, false, cancelChecker);
}
return null;
}

Range tagRange = getTagNameRange(TokenType.StartTag, node.getStart(), offset, xmlDocument);
if (tagRange != null) {
return getTagHover(hoverRequest, tagRange, true);
return getTagHover(hoverRequest, tagRange, true, cancelChecker);
}
} else if (node.isAttribute()) {
// Attribute is hovered
DOMAttr attr = (DOMAttr) node;
if (attr.valueContainsOffset(offset)) {
// Attribute value is hovered
Range attrRange = XMLPositionUtility.selectAttributeValue(attr);
return getAttrValueHover(hoverRequest, attrRange);
return getAttrValueHover(hoverRequest, attrRange, cancelChecker);
}
// Attribute name is hovered
Range attrRange = XMLPositionUtility.selectAttributeName(attr);
return getAttrNameHover(hoverRequest, attrRange);
return getAttrNameHover(hoverRequest, attrRange, cancelChecker);
} else if (node.isText()) {
// Text is hovered
DOMText text = (DOMText) node;
Range textRange = XMLPositionUtility.selectText(text);
return getTextHover(hoverRequest, textRange);
return getTextHover(hoverRequest, textRange, cancelChecker);
}
return null;
}

/**
* Returns the LSP hover from the hovered element.
*
* @param hoverRequest the hover request.
* @param tagRange the tag range
* @param open true if it's the start tag which is hovered and false if
* it's the end tag.
* @param hoverRequest the hover request.
* @param tagRange the tag range
* @param open true if it's the start tag which is hovered and false if
* it's the end tag.
* @param cancelChecker the cancel checker.
* @return the LSP hover from the hovered element.
*/
private Hover getTagHover(HoverRequest hoverRequest, Range tagRange, boolean open) {
private Hover getTagHover(HoverRequest hoverRequest, Range tagRange, boolean open, CancelChecker cancelChecker) {
hoverRequest.setHoverRange(tagRange);
hoverRequest.setOpen(open);
List<Hover> hovers = new ArrayList<>();
for (IHoverParticipant participant : extensionsRegistry.getHoverParticipants()) {
try {
Hover hover = participant.onTag(hoverRequest);
Hover hover = participant.onTag(hoverRequest, cancelChecker);
if (hover != null) {
hovers.add(hover);
}
Expand Down Expand Up @@ -149,16 +150,18 @@ private Range getTagNameRange(TokenType tokenType, int startOffset, int offset,
/**
* Returns the LSP hover from the hovered attribute.
*
* @param hoverRequest the hover request.
* @param attrRange the attribute range
* @param hoverRequest the hover request.
* @param attrRange the attribute range
* @param cancelChecker the cancel checker.
*
* @return the LSP hover from the hovered attribute.
*/
private Hover getAttrNameHover(HoverRequest hoverRequest, Range attrRange) {
private Hover getAttrNameHover(HoverRequest hoverRequest, Range attrRange, CancelChecker cancelChecker) {
hoverRequest.setHoverRange(attrRange);
List<Hover> hovers = new ArrayList<>();
for (IHoverParticipant participant : extensionsRegistry.getHoverParticipants()) {
try {
Hover hover = participant.onAttributeName(hoverRequest);
Hover hover = participant.onAttributeName(hoverRequest, cancelChecker);
if (hover != null) {
hovers.add(hover);
}
Expand All @@ -172,16 +175,18 @@ private Hover getAttrNameHover(HoverRequest hoverRequest, Range attrRange) {
/**
* Returns the LSP hover from the hovered attribute.
*
* @param hoverRequest the hover request.
* @param attrRange the attribute range
* @param hoverRequest the hover request.
* @param attrRange the attribute range
* @param cancelChecker the cancel checker.
*
* @return the LSP hover from the hovered attribute.
*/
private Hover getAttrValueHover(HoverRequest hoverRequest, Range attrRange) {
private Hover getAttrValueHover(HoverRequest hoverRequest, Range attrRange, CancelChecker cancelChecker) {
hoverRequest.setHoverRange(attrRange);
List<Hover> hovers = new ArrayList<>();
for (IHoverParticipant participant : extensionsRegistry.getHoverParticipants()) {
try {
Hover hover = participant.onAttributeValue(hoverRequest);
Hover hover = participant.onAttributeValue(hoverRequest, cancelChecker);
if (hover != null) {
hovers.add(hover);
}
Expand All @@ -195,16 +200,18 @@ private Hover getAttrValueHover(HoverRequest hoverRequest, Range attrRange) {
/**
* Returns the LSP hover from the hovered text.
*
* @param hoverRequest the hover request.
* @param attrRange the attribute range
* @param hoverRequest the hover request.
* @param attrRange the attribute range
* @param cancelChecker the cancel checker.
*
* @return the LSP hover from the hovered text.
*/
private Hover getTextHover(HoverRequest hoverRequest, Range textRange) {
private Hover getTextHover(HoverRequest hoverRequest, Range textRange, CancelChecker cancelChecker) {
hoverRequest.setHoverRange(textRange);
List<Hover> hovers = new ArrayList<>();
for (IHoverParticipant participant : extensionsRegistry.getHoverParticipants()) {
try {
Hover hover = participant.onText(hoverRequest);
Hover hover = participant.onText(hoverRequest, cancelChecker);
if (hover != null) {
hovers.add(hover);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

import org.eclipse.lemminx.services.extensions.completion.ICompletionParticipant;
import org.eclipse.lemminx.services.extensions.diagnostics.IDiagnosticsParticipant;
import org.eclipse.lemminx.services.extensions.hover.IHoverParticipant;
import org.eclipse.lemminx.services.extensions.save.ISaveContext;
import org.eclipse.lsp4j.InitializeParams;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import org.eclipse.lemminx.services.extensions.completion.ICompletionParticipant;
import org.eclipse.lemminx.services.extensions.diagnostics.IDiagnosticsParticipant;
import org.eclipse.lemminx.services.extensions.format.IFormatterParticipant;
import org.eclipse.lemminx.services.extensions.hover.IHoverParticipant;
import org.eclipse.lemminx.services.extensions.save.ISaveContext;
import org.eclipse.lemminx.services.extensions.save.ISaveContext.SaveContextType;
import org.eclipse.lemminx.telemetry.TelemetryManager;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,10 @@
* Contributors:
* Angelo Zerr <[email protected]> - initial API and implementation
*/
package org.eclipse.lemminx.services.extensions;
package org.eclipse.lemminx.services.extensions.hover;

import org.eclipse.lsp4j.Hover;
import org.eclipse.lsp4j.jsonrpc.CancelChecker;

/**
* Hover participant adapter.
Expand All @@ -21,22 +22,22 @@
public class HoverParticipantAdapter implements IHoverParticipant {

@Override
public Hover onTag(IHoverRequest request) throws Exception {
public Hover onTag(IHoverRequest request, CancelChecker cancelChecker) throws Exception {
return null;
}

@Override
public Hover onAttributeName(IHoverRequest request) throws Exception {
public Hover onAttributeName(IHoverRequest request, CancelChecker cancelChecker) throws Exception {
return null;
}

@Override
public Hover onAttributeValue(IHoverRequest request) throws Exception {
public Hover onAttributeValue(IHoverRequest request, CancelChecker cancelChecker) throws Exception {
return null;
}

@Override
public Hover onText(IHoverRequest request) throws Exception {
public Hover onText(IHoverRequest request, CancelChecker cancelChecker) throws Exception {
return null;
}

Expand Down
Loading

0 comments on commit b34a847

Please sign in to comment.