diff --git a/xml/tests/src/com/intellij/codeInsight/daemon/XmlHighlightingTest.java b/xml/tests/src/com/intellij/codeInsight/daemon/XmlHighlightingTest.java index d88422df2127..3d0ade45ff0a 100644 --- a/xml/tests/src/com/intellij/codeInsight/daemon/XmlHighlightingTest.java +++ b/xml/tests/src/com/intellij/codeInsight/daemon/XmlHighlightingTest.java @@ -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); diff --git a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/ComplexTypeDescriptor.java b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/ComplexTypeDescriptor.java index e86f655bc6d1..d246a0e8616f 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/ComplexTypeDescriptor.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/ComplexTypeDescriptor.java @@ -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> myAnyAttributeCache = new ConcurrentFactoryMap>() { @Override protected CachedValue create(final String key) { return CachedValuesManager.getManager(myTag.getProject()).createCachedValue(new CachedValueProvider() { @Override public Result compute() { - THashSet dependencies = new THashSet(); + THashSet dependencies = new THashSet(); CanContainAttributeType type = _canContainAttribute(key, myTag, null, new THashSet(), 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 visited, - @Nullable Set dependencies) { + @Nullable Set dependencies) { if (XmlNSDescriptorImpl.equalsToSchemaName(tag, "anyAttribute")) { if (dependencies != null) { dependencies.add(tag.getContainingFile());