cache itemscope tag

#WEB-19192 fixed
This commit is contained in:
Dennis Ushakov
2015-11-24 21:55:47 +03:00
parent bf2d81f33e
commit ca28f5f414
@@ -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<String, XmlTag> findScopesWithItemRef(@Nullable PsiFile file) {
private static Map<String, XmlTag> findScopesWithItemRef(@Nullable final PsiFile file) {
if (!(file instanceof XmlFile)) return Collections.emptyMap();
final Map<String, XmlTag> result = new THashMap<String, XmlTag>();
file.accept(new XmlRecursiveElementVisitor() {
return CachedValuesManager.getCachedValue(file, new CachedValueProvider<Map<String, XmlTag>>() {
@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<String, Integer, PsiReference>() {
@Nullable
@Override
public PsiReference fun(String t, Integer v) {
result.put(t, tag);
return null;
public Result<Map<String, XmlTag>> compute() {
final Map<String, XmlTag> result = new THashMap<String, XmlTag>();
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<String, Integer, PsiReference>() {
@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<String> extractProperties(PsiFile file, String type) {