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 <azerr@redhat.com>
  • Loading branch information
azerr 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.
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
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
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
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
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
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
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
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
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
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
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
Expand Up @@ -10,9 +10,10 @@
* Contributors:
* Angelo Zerr <angelo.zerr@gmail.com> - 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

0 comments on commit b34a847

Please sign in to comment.