From 20cd5979452f04ee05186505efff2bc8d3ee27f1 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Tue, 13 Apr 2010 16:18:36 +0400 Subject: [PATCH] IDEA-53874: DomFileElement cached [rev. by peter] --- .../src/com/intellij/util/xml/DomUtil.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) 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