diff --git a/xml/dom-openapi/src/com/intellij/util/xml/DomUtil.java b/xml/dom-openapi/src/com/intellij/util/xml/DomUtil.java index 01638c9f3416..28827b7aa6fd 100644 --- a/xml/dom-openapi/src/com/intellij/util/xml/DomUtil.java +++ b/xml/dom-openapi/src/com/intellij/util/xml/DomUtil.java @@ -6,6 +6,7 @@ package com.intellij.util.xml; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Key; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; @@ -37,6 +38,8 @@ import java.util.*; public class DomUtil { public static final TypeVariable> GENERIC_VALUE_TYPE_VARIABLE = ReflectionCache.getTypeParameters(GenericValue.class)[0]; private static final Class DUMMY = void.class; + private static final Key FILE_ELEMENT_KEY = Key.create("dom file element"); + private static final ConcurrentFactoryMap ourTypeParameters = new ConcurrentFactoryMap() { @NotNull protected Class create(final Type key) { @@ -394,8 +397,19 @@ public class DomUtil { } public static DomFileElement getFileElement(@NotNull DomElement element) { - final DomElement root = getRoot(element); - return root instanceof DomFileElement ? (DomFileElement)root : null; + + if (element instanceof DomFileElement) { + return (DomFileElement)element; + } + DomFileElement fileElement = element.getUserData(FILE_ELEMENT_KEY); + if (fileElement == null) { + DomElement parent = element.getParent(); + if (parent != null) { + fileElement = getFileElement(parent); + } + element.putUserData(FILE_ELEMENT_KEY, fileElement); + } + return fileElement; } @NotNull