diff --git a/xml/impl/src/com/intellij/codeInsight/completion/TagNameReferenceCompletionProvider.java b/xml/impl/src/com/intellij/codeInsight/completion/TagNameReferenceCompletionProvider.java index e8ec1c0b6a47..7220a0b90567 100644 --- a/xml/impl/src/com/intellij/codeInsight/completion/TagNameReferenceCompletionProvider.java +++ b/xml/impl/src/com/intellij/codeInsight/completion/TagNameReferenceCompletionProvider.java @@ -21,6 +21,7 @@ import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.impl.source.xml.SchemaPrefixReference; import com.intellij.psi.impl.source.xml.TagNameReference; +import com.intellij.psi.xml.XmlChildRole; import com.intellij.psi.xml.XmlTag; import com.intellij.util.Consumer; import com.intellij.util.ProcessingContext; @@ -53,7 +54,7 @@ public class TagNameReferenceCompletionProvider extends CompletionProvider')), - XmlClosingTagInsertHandler.INSTANCE); + public static List createClosingTagLookupElements(XmlTag tag, boolean includePrefix, ASTNode nameElement) { + List result = new ArrayList<>(); + while (tag != null) { + LookupElementBuilder + builder = LookupElementBuilder.create(includePrefix || !nameElement.getText().contains(":") ? tag.getName() : tag.getLocalName()); + result.add(LookupElementDecorator.withInsertHandler( + TailTypeDecorator.withTail(AutoCompletionPolicy.GIVE_CHANCE_TO_OVERWRITE.applyPolicy(builder), + TailType.createSimpleTailType('>')), + XmlClosingTagInsertHandler.INSTANCE)); + if (includePrefix) break; + tag = tag.getParentTag(); + if (tag != null && + (XmlChildRole.CLOSING_TAG_NAME_FINDER.findChild(tag.getNode()) != null || + XmlChildRole.START_TAG_START_FINDER.findChild(tag.getNode()) == null)) { + break; + } + } + return result; } }