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) {