From 5df3ffdd2196b606cf5d81911a1fb2a3944eb670 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Sun, 11 Mar 2012 12:43:42 +0400 Subject: [PATCH] better cache --- .../psi/impl/source/xml/XmlTagImpl.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) 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) {