From d58be460444f0023400cee0cd53b00f59461e020 Mon Sep 17 00:00:00 2001 From: angelozerr Date: Fri, 9 Nov 2018 12:35:11 +0100 Subject: [PATCH] Fix #211 --- .../ContentModelCompletionParticipant.java | 4 +- .../lsp4xml/services/CompletionResponse.java | 12 +++ .../lsp4xml/services/XMLCompletions.java | 82 +++++++++---------- .../extensions/ICompletionResponse.java | 27 ++++++ 4 files changed, 81 insertions(+), 44 deletions(-) diff --git a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/extensions/contentmodel/participants/ContentModelCompletionParticipant.java b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/extensions/contentmodel/participants/ContentModelCompletionParticipant.java index 998918fb3..21065feff 100644 --- a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/extensions/contentmodel/participants/ContentModelCompletionParticipant.java +++ b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/extensions/contentmodel/participants/ContentModelCompletionParticipant.java @@ -80,7 +80,7 @@ private void fillWithChildrenElementDeclaration(Collection XMLGenerator generator = request.getXMLGenerator(); for (CMElementDeclaration child : cmElements) { String label = child.getName(prefix); - CompletionItem item = new CompletionItem(label); + CompletionItem item = new CompletionItem(label + " - XML Schema"); item.setFilterText(request.getFilterForStartTagName(label)); item.setKind(CompletionItemKind.Property); String documentation = child.getDocumentation(); @@ -90,7 +90,7 @@ private void fillWithChildrenElementDeclaration(Collection String xml = generator.generate(child, prefix); item.setTextEdit(new TextEdit(request.getReplaceRange(), xml)); item.setInsertTextFormat(InsertTextFormat.Snippet); - response.addCompletionItem(item); + response.addCompletionItem(item, true); } } diff --git a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/services/CompletionResponse.java b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/services/CompletionResponse.java index 53a2139af..653e6915f 100644 --- a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/services/CompletionResponse.java +++ b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/services/CompletionResponse.java @@ -24,15 +24,27 @@ class CompletionResponse extends CompletionList implements ICompletionResponse { private transient List seenAttributes; + private boolean hasSomeItemFromGrammar; public CompletionResponse() { super.setIsIncomplete(false); } + public void addCompletionItem(CompletionItem completionItem, boolean fromGrammar) { + if (fromGrammar) { + hasSomeItemFromGrammar = true; + } + addCompletionItem(completionItem); + } @Override public void addCompletionItem(CompletionItem completionItem) { super.getItems().add(completionItem); } + + @Override + public boolean hasSomeItemFromGrammar() { + return hasSomeItemFromGrammar; + } @Override public boolean hasAttribute(String attribute) { diff --git a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/services/XMLCompletions.java b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/services/XMLCompletions.java index 990aa2227..ed236dba6 100644 --- a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/services/XMLCompletions.java +++ b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/services/XMLCompletions.java @@ -340,48 +340,6 @@ private void collectOpenTagSuggestions(boolean hasOpenBracket, Range replaceRang } completionRequest.setHasOpenBracket(hasOpenBracket); completionRequest.setReplaceRange(replaceRange); - if (!completionRequest.getXMLDocument().hasGrammar()) { - // no grammar, collect similar tags from the parent node - Element parentNode = completionRequest.getParentElement(); - if (parentNode != null) { - Set seenElements = new HashSet<>(); - if (parentNode != null && parentNode.isElement() && parentNode.hasChildNodes()) { - parentNode.getChildren().forEach(node -> { - Element element = node.isElement() ? (Element) node : null; - if (element == null || element.getTagName() == null - || seenElements.contains(element.getTagName())) { - return; - } - String tag = element.getTagName(); - seenElements.add(tag); - CompletionItem item = new CompletionItem(); - item.setLabel(tag); - item.setKind(CompletionItemKind.Property); - item.setFilterText(completionRequest.getFilterForStartTagName(tag)); - StringBuilder xml = new StringBuilder(); - xml.append("<"); - xml.append(tag); - if (element.isSelfClosed()) { - xml.append(" />"); - } else { - xml.append(">"); - CompletionSettings completionSettings = completionRequest.getCompletionSettings(); - - if (completionSettings.isCompletionSnippetsSupported()) { - xml.append("$0"); - } - if (completionSettings.isAutoCloseTags()) { - xml.append(""); - } - } - item.setTextEdit(new TextEdit(replaceRange, xml.toString())); - item.setInsertTextFormat(InsertTextFormat.Snippet); - - completionResponse.addCompletionItem(item); - }); - } - } - } for (ICompletionParticipant participant : getCompletionParticipants()) { try { participant.onTagOpen(completionRequest, completionResponse); @@ -389,6 +347,46 @@ private void collectOpenTagSuggestions(boolean hasOpenBracket, Range replaceRang LOGGER.log(Level.SEVERE, "While performing ICompletionParticipant#onTagOpen", e); } } + Element parentNode = completionRequest.getParentElement(); + if (parentNode != null && !completionResponse.hasSomeItemFromGrammar()) { + // no grammar, collect similar tags from the parent node + Set seenElements = new HashSet<>(); + if (parentNode != null && parentNode.isElement() && parentNode.hasChildNodes()) { + parentNode.getChildren().forEach(node -> { + Element element = node.isElement() ? (Element) node : null; + if (element == null || element.getTagName() == null + || seenElements.contains(element.getTagName())) { + return; + } + String tag = element.getTagName(); + seenElements.add(tag); + CompletionItem item = new CompletionItem(); + item.setLabel(tag); + item.setKind(CompletionItemKind.Property); + item.setFilterText(completionRequest.getFilterForStartTagName(tag)); + StringBuilder xml = new StringBuilder(); + xml.append("<"); + xml.append(tag); + if (element.isSelfClosed()) { + xml.append(" />"); + } else { + xml.append(">"); + CompletionSettings completionSettings = completionRequest.getCompletionSettings(); + + if (completionSettings.isCompletionSnippetsSupported()) { + xml.append("$0"); + } + if (completionSettings.isAutoCloseTags()) { + xml.append(""); + } + } + item.setTextEdit(new TextEdit(replaceRange, xml.toString())); + item.setInsertTextFormat(InsertTextFormat.Snippet); + + completionResponse.addCompletionItem(item); + }); + } + } } /** diff --git a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/services/extensions/ICompletionResponse.java b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/services/extensions/ICompletionResponse.java index a99200326..d341f0f03 100644 --- a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/services/extensions/ICompletionResponse.java +++ b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/services/extensions/ICompletionResponse.java @@ -18,10 +18,37 @@ */ public interface ICompletionResponse { + /** + * Add completion item and mark as coming from grammar. + * + * @param completionItem + * @param comingFromGrammar + */ + void addCompletionItem(CompletionItem completionItem, boolean comingFromGrammar); + + /** + * Add completion item. + * + * @param completionItem + */ void addCompletionItem(CompletionItem completionItem); boolean hasAttribute(String attribute); + /** + * Add completion attribute. + * + * @param item + */ void addCompletionAttribute(CompletionItem item); + /** + * Returns true if there are completion items coming from grammar + * and false otherwise. + * + * @return true if there are completion items coming from grammar + * and false otherwise. + */ + boolean hasSomeItemFromGrammar(); + }