diff --git a/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java b/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java index c648003b4bea..fe558eeb8b39 100644 --- a/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java +++ b/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java @@ -92,6 +92,22 @@ public class XmlTagImpl extends XmlElementImpl implements XmlTag { private final int myHC = ourHC++; private static final RecursionGuard ourGuard = RecursionManager.createGuard("xmlTag"); + private static final Key> SUBTAGS_KEY = Key.create("subtags"); + private static final ParameterizedCachedValueProvider CACHED_VALUE_PROVIDER = + new ParameterizedCachedValueProvider() { + @Override + public CachedValueProvider.Result compute(XmlTagImpl tag) { + final List result = new ArrayList(); + + tag.fillSubTags(result); + + final int s = result.size(); + XmlTag[] tags = s > 0 ? ContainerUtil.toArray(result, new XmlTag[s]) : EMPTY; + return CachedValueProvider.Result + .create(tags, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, tag.getContainingFile()); + } + }; + @Override public final int hashCode() { return myHC; @@ -606,19 +622,7 @@ public class XmlTagImpl extends XmlElementImpl implements XmlTag { @NotNull public XmlTag[] getSubTags() { - return CachedValuesManager.getManager(getProject()).getCachedValue(this, new CachedValueProvider() { - @Override - public Result compute() { - final List result = new ArrayList(); - - fillSubTags(result); - - final int s = result.size(); - XmlTag[] tags = s > 0 ? ContainerUtil.toArray(result, new XmlTag[s]) : EMPTY; - return Result.create(tags, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, getContainingFile()); - - } - }); + return CachedValuesManager.getManager(getProject()).getParameterizedCachedValue(this, SUBTAGS_KEY, CACHED_VALUE_PROVIDER, false, this); } protected void fillSubTags(final List result) {