From ca28f5f41467fa412469ad6107929be4ab9aaa4c Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Tue, 24 Nov 2015 20:53:40 +0300 Subject: [PATCH] cache itemscope tag #WEB-19192 fixed --- .../html/impl/util/MicrodataUtil.java | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/xml/xml-psi-impl/src/com/intellij/html/impl/util/MicrodataUtil.java b/xml/xml-psi-impl/src/com/intellij/html/impl/util/MicrodataUtil.java index b34326477307..37b7af269afc 100644 --- a/xml/xml-psi-impl/src/com/intellij/html/impl/util/MicrodataUtil.java +++ b/xml/xml-psi-impl/src/com/intellij/html/impl/util/MicrodataUtil.java @@ -24,6 +24,8 @@ import com.intellij.psi.PsiReference; import com.intellij.psi.XmlRecursiveElementVisitor; import com.intellij.psi.impl.source.resolve.reference.impl.providers.DependentNSReference; import com.intellij.psi.impl.source.resolve.reference.impl.providers.URLReference; +import com.intellij.psi.util.CachedValueProvider; +import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlAttributeValue; import com.intellij.psi.xml.XmlFile; @@ -66,27 +68,33 @@ public class MicrodataUtil { return null; } - private static Map findScopesWithItemRef(@Nullable PsiFile file) { + private static Map findScopesWithItemRef(@Nullable final PsiFile file) { if (!(file instanceof XmlFile)) return Collections.emptyMap(); - final Map result = new THashMap(); - file.accept(new XmlRecursiveElementVisitor() { + return CachedValuesManager.getCachedValue(file, new CachedValueProvider>() { + @Nullable @Override - public void visitXmlTag(final XmlTag tag) { - super.visitXmlTag(tag); - XmlAttribute refAttr = tag.getAttribute(ITEM_REF); - if (refAttr != null && tag.getAttribute(ITEM_SCOPE) != null) { - getReferencesForAttributeValue(refAttr.getValueElement(), new PairFunction() { - @Nullable - @Override - public PsiReference fun(String t, Integer v) { - result.put(t, tag); - return null; + public Result> compute() { + final Map result = new THashMap(); + file.accept(new XmlRecursiveElementVisitor() { + @Override + public void visitXmlTag(final XmlTag tag) { + super.visitXmlTag(tag); + XmlAttribute refAttr = tag.getAttribute(ITEM_REF); + if (refAttr != null && tag.getAttribute(ITEM_SCOPE) != null) { + getReferencesForAttributeValue(refAttr.getValueElement(), new PairFunction() { + @Nullable + @Override + public PsiReference fun(String t, Integer v) { + result.put(t, tag); + return null; + } + }); } - }); - } + } + }); + return Result.create(result, file); } }); - return result; } public static List extractProperties(PsiFile file, String type) {