diff --git a/xml/impl/src/com/intellij/xml/util/documentation/HtmlDocumentationProvider.java b/xml/impl/src/com/intellij/xml/util/documentation/HtmlDocumentationProvider.java index 8c7e0ff0a964..54874e84d28f 100644 --- a/xml/impl/src/com/intellij/xml/util/documentation/HtmlDocumentationProvider.java +++ b/xml/impl/src/com/intellij/xml/util/documentation/HtmlDocumentationProvider.java @@ -25,6 +25,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiManager; import com.intellij.psi.PsiWhiteSpace; import com.intellij.psi.XmlElementFactory; +import com.intellij.psi.impl.FakePsiElement; import com.intellij.psi.impl.source.xml.SchemaPrefix; import com.intellij.psi.meta.PsiMetaData; import com.intellij.psi.util.PsiTreeUtil; @@ -97,6 +98,10 @@ public class HtmlDocumentationProvider implements DocumentationProvider { PsiElement nameElement = null; String key = null; + if (element instanceof FakePsiElement) { + element = element.getNavigationElement(); + } + if (element instanceof XmlElementDecl) { nameElement = ((XmlElementDecl)element).getNameElement(); } else if (element instanceof XmlAttributeDecl) { diff --git a/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngElementDescriptor.java b/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngElementDescriptor.java index 91f03f1d97e7..36bd2f45c4a1 100644 --- a/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngElementDescriptor.java +++ b/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngElementDescriptor.java @@ -23,6 +23,7 @@ import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; +import com.intellij.psi.impl.FakePsiElement; import com.intellij.psi.impl.source.tree.TreeUtil; import com.intellij.psi.util.*; import com.intellij.psi.xml.XmlAttribute; @@ -291,10 +292,7 @@ public class RngElementDescriptor implements XmlElementDescriptor { final PsiElement at; if (column > 0) { if (decl.getContainingFile().getFileType() == RncFileType.getInstance()) { - final PsiElement rncElement = file.findElementAt(startOffset + column); - final ASTNode pattern = rncElement != null ? TreeUtil.findParent(rncElement.getNode(), RncElementTypes.PATTERN) : null; - final ASTNode nameClass = pattern != null ? pattern.findChildByType(RncElementTypes.NAME_CLASS) : null; - return nameClass != null ? nameClass.getPsi() : rncElement; + return new RncLocationPsiElement(file, startOffset, column); } at = file.findElementAt(startOffset + column - 2); } else { @@ -414,4 +412,43 @@ public class RngElementDescriptor implements XmlElementDescriptor { public DElementPattern getElementPattern() { return myElementPattern; } + + private static class RncLocationPsiElement extends FakePsiElement { + private final PsiFile myFile; + private final int myStartOffset; + private final int myColumn; + + public RncLocationPsiElement(PsiFile file, int startOffset, int column) { + myFile = file; + myStartOffset = startOffset; + myColumn = column; + } + + @NotNull + @Override + public PsiElement getNavigationElement() { + final PsiElement rncElement = myFile.findElementAt(myStartOffset + myColumn); + final ASTNode pattern = rncElement != null ? TreeUtil.findParent(rncElement.getNode(), RncElementTypes.PATTERN) : null; + final ASTNode nameClass = pattern != null ? pattern.findChildByType(RncElementTypes.NAME_CLASS) : null; + return nameClass != null ? nameClass.getPsi() : rncElement; + } + + @Override + public PsiElement getParent() { + return getNavigationElement(); + } + + @Override + public boolean equals(Object another) { + return another instanceof RncLocationPsiElement && + ((RncLocationPsiElement)another).myFile == myFile && + ((RncLocationPsiElement)another).myStartOffset == myStartOffset && + ((RncLocationPsiElement)another).myColumn == myColumn; + } + + @Override + public int hashCode() { + return Objects.hash(myFile, myStartOffset, myColumn); + } + } }