any attributes cache should be dropped on exit from dumb mode

This commit is contained in:
Dmitry Avdeev
2015-02-24 14:58:24 +03:00
parent 81f5cc5e4c
commit 5f93bf78bd
2 changed files with 36 additions and 4 deletions
@@ -49,6 +49,7 @@ import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.highlighter.EditorHighlighter;
import com.intellij.openapi.editor.highlighter.HighlighterIterator;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.project.DumbServiceImpl;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtilCore;
@@ -64,6 +65,7 @@ import com.intellij.util.Processor;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.xml.XmlAttributeDescriptor;
import com.intellij.xml.XmlBundle;
import com.intellij.xml.XmlElementDescriptor;
import com.intellij.xml.impl.schema.XmlElementDescriptorImpl;
import com.intellij.xml.util.*;
import gnu.trove.THashSet;
@@ -1422,7 +1424,7 @@ public class XmlHighlightingTest extends DaemonAnalyzerTestCase {
Editor[] allEditors = EditorFactory.getInstance().getAllEditors();
final Editor schemaEditor = allEditors[0] == myEditor ? allEditors[1]:allEditors[0];
final String text = schemaEditor.getDocument().getText();
final String newText = text.replaceAll("xsd","xs");
final String newText = text.replaceAll("xsd", "xs");
WriteCommandAction.runWriteCommandAction(null, new Runnable(){
@Override
public void run() {
@@ -2082,6 +2084,26 @@ public class XmlHighlightingTest extends DaemonAnalyzerTestCase {
assertTrue(resolve instanceof XmlTag);
}
public void testDropAnyAttributeCacheOnExitFromDumbMode() throws Exception {
try {
DumbServiceImpl.getInstance(myProject).setDumb(true);
configureByFiles(null, getVirtualFile(BASE_PATH + "AnyAttributeNavigation/test.xml"),
getVirtualFile(BASE_PATH + "AnyAttributeNavigation/test.xsd"),
getVirtualFile(BASE_PATH + "AnyAttributeNavigation/library.xsd"));
PsiReference at = getFile().findReferenceAt(getEditor().getCaretModel().getOffset());
XmlTag tag = PsiTreeUtil.getParentOfType(at.getElement(), XmlTag.class);
XmlElementDescriptor descriptor = tag.getDescriptor();
XmlAttributeDescriptor[] descriptors = descriptor.getAttributesDescriptors(tag);
System.out.println(Arrays.asList(descriptors));
}
finally {
DumbServiceImpl.getInstance(myProject).setDumb(false);
}
doDoTest(true, false);
}
public void testQualifiedAttributeReference() throws Exception {
configureByFiles(null, BASE_PATH + "qualified.xml", BASE_PATH + "qualified.xsd");
doDoTest(true, false);
@@ -15,10 +15,11 @@
*/
package com.intellij.xml.impl.schema;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.FieldCache;
import com.intellij.openapi.util.ModificationTracker;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.SchemaReferencesProvider;
import com.intellij.psi.meta.PsiMetaData;
import com.intellij.psi.util.CachedValue;
@@ -85,17 +86,26 @@ public class ComplexTypeDescriptor extends TypeDescriptor {
}
};
@SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
private final FactoryMap<String, CachedValue<CanContainAttributeType>> myAnyAttributeCache = new ConcurrentFactoryMap<String, CachedValue<CanContainAttributeType>>() {
@Override
protected CachedValue<CanContainAttributeType> create(final String key) {
return CachedValuesManager.getManager(myTag.getProject()).createCachedValue(new CachedValueProvider<CanContainAttributeType>() {
@Override
public Result<CanContainAttributeType> compute() {
THashSet<PsiFile> dependencies = new THashSet<PsiFile>();
THashSet<Object> dependencies = new THashSet<Object>();
CanContainAttributeType type = _canContainAttribute(key, myTag, null, new THashSet<String>(), dependencies);
if (dependencies.isEmpty()) {
dependencies.add(myTag.getContainingFile());
}
if (DumbService.isDumb(myTag.getProject())) {
dependencies.add(new ModificationTracker() {
@Override
public long getModificationCount() {
return DumbService.isDumb(myTag.getProject()) ? 0 : 1;
}
});
}
return Result.create(type, ArrayUtil.toObjectArray(dependencies));
}
}, false);
@@ -398,7 +408,7 @@ public class ComplexTypeDescriptor extends TypeDescriptor {
XmlTag tag,
@Nullable String qName,
Set<String> visited,
@Nullable Set<PsiFile> dependencies) {
@Nullable Set<Object> dependencies) {
if (XmlNSDescriptorImpl.equalsToSchemaName(tag, "anyAttribute")) {
if (dependencies != null) {
dependencies.add(tag.getContainingFile());