mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
any attributes cache should be dropped on exit from dumb mode
This commit is contained in:
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user