Skip to content

Commit

Permalink
Fix #211
Browse files Browse the repository at this point in the history
  • Loading branch information
angelozerr committed Nov 9, 2018
1 parent 4789034 commit d58be46
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ private void fillWithChildrenElementDeclaration(Collection<CMElementDeclaration>
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();
Expand All @@ -90,7 +90,7 @@ private void fillWithChildrenElementDeclaration(Collection<CMElementDeclaration>
String xml = generator.generate(child, prefix);
item.setTextEdit(new TextEdit(request.getReplaceRange(), xml));
item.setInsertTextFormat(InsertTextFormat.Snippet);
response.addCompletionItem(item);
response.addCompletionItem(item, true);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,27 @@
class CompletionResponse extends CompletionList implements ICompletionResponse {

private transient List<String> 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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -340,55 +340,53 @@ 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<String> 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("</").append(tag).append(">");
}
}
item.setTextEdit(new TextEdit(replaceRange, xml.toString()));
item.setInsertTextFormat(InsertTextFormat.Snippet);

completionResponse.addCompletionItem(item);
});
}
}
}
for (ICompletionParticipant participant : getCompletionParticipants()) {
try {
participant.onTagOpen(completionRequest, completionResponse);
} catch (Exception e) {
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<String> 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("</").append(tag).append(">");
}
}
item.setTextEdit(new TextEdit(replaceRange, xml.toString()));
item.setInsertTextFormat(InsertTextFormat.Snippet);

completionResponse.addCompletionItem(item);
});
}
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 <code>true</code> if there are completion items coming from grammar
* and false otherwise.
*
* @return <code>true</code> if there are completion items coming from grammar
* and false otherwise.
*/
boolean hasSomeItemFromGrammar();

}

0 comments on commit d58be46

Please sign in to comment.