use same caching for looking up via qName and a tag

This commit is contained in:
Dennis Ushakov
2017-11-07 22:58:03 +00:00
parent 195861bdd1
commit 04150b0905
@@ -19,7 +19,6 @@ package org.intellij.plugins.relaxNG.model.descriptors;
import com.intellij.codeInsight.daemon.Validator;
import com.intellij.javaee.ExternalResourceManager;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.ModificationTracker;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
@@ -27,7 +26,10 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.search.PsiElementProcessor;
import com.intellij.psi.util.*;
import com.intellij.psi.util.CachedValue;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.util.CachedValuesManager;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.xml.XmlDocument;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
@@ -55,8 +57,6 @@ public class RngNsDescriptor implements XmlNSDescriptorEx, Validator {
private final Map<QName, CachedValue<XmlElementDescriptor>> myDescriptorsMap =
Collections.synchronizedMap(new HashMap<QName, CachedValue<XmlElementDescriptor>>());
private static final Key<ParameterizedCachedValue<XmlElementDescriptor, RngNsDescriptor>> ROOT_KEY = Key.create("ROOT_DESCRIPTOR");
private XmlFile myFile;
private PsiElement myElement;
private String myUrl;
@@ -100,31 +100,12 @@ public class RngNsDescriptor implements XmlNSDescriptorEx, Validator {
}
private XmlElementDescriptor findRootDescriptor(final XmlTag tag) {
return CachedValuesManager.getManager(tag.getProject())
.getParameterizedCachedValue(tag, ROOT_KEY, new ParameterizedCachedValueProvider<XmlElementDescriptor, RngNsDescriptor>() {
@Override
public CachedValueProvider.Result<XmlElementDescriptor> compute(RngNsDescriptor o) {
final XmlElementDescriptor descr = o.findRootDescriptorInner(tag);
if (descr != null) {
return CachedValueProvider.Result.create(descr, descr.getDependences(), o.getDependences());
}
else {
return CachedValueProvider.Result.create(null, o.getDependences());
}
}
}, false, this);
}
private XmlElementDescriptor findRootDescriptorInner(XmlTag tag) {
final List<DElementPattern> allNamedPatterns =
ContainerUtil.findAll(ChildElementFinder.find(-1, myPattern), NamedPatternFilter.INSTANCE);
XmlElementDescriptor descriptor = findDescriptor(tag, allNamedPatterns);
return descriptor != null ? descriptor : findDescriptor(tag, ChildElementFinder.find(myPattern));
return getElementDescriptor(tag.getLocalName(), tag.getNamespace());
}
private XmlElementDescriptor findRootDescriptorInner(QName qName) {
return findDescriptor(qName, ContainerUtil.findAll(
ChildElementFinder.find(-1, myPattern), NamedPatternFilter.INSTANCE));
XmlElementDescriptor descriptor = findDescriptor(qName, ContainerUtil.findAll(ChildElementFinder.find(-1, myPattern), NamedPatternFilter.INSTANCE));
return descriptor != null ? descriptor : findDescriptor(qName, ChildElementFinder.find(myPattern));
}
public XmlElementDescriptor findDescriptor(XmlTag tag, List<DElementPattern> list) {