drop caches on non-physical file context change (a more universal fix for EA-69690 - PIEAE: StubBasedPsiElementBase.getContainingFile)

This commit is contained in:
peter
2016-11-14 20:39:39 +01:00
parent 0d67966124
commit 979ac11689
3 changed files with 17 additions and 4 deletions
@@ -1,7 +1,9 @@
package com.intellij.psi.resolve;
import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiElementFactoryImpl;
import com.intellij.psi.impl.search.JavaSourceFilterScope;
import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl;
import com.intellij.psi.util.PsiTreeUtil;
@@ -95,4 +97,14 @@ public class ResolveInCodeFragmentTest extends ResolveTestCase {
PsiCodeBlock block = factory.createCodeBlockFromText("{ return o; }", method);
assertInstanceOf(block.findReferenceAt(block.getText().indexOf("o")).resolve(), PsiParameter.class);
}
public void testDropCachesOnNonPhysicalContextChange() {
PsiElementFactoryImpl factory = (PsiElementFactoryImpl)JavaPsiFacade.getElementFactory(getProject());
PsiClass superClass = ((PsiJavaFile) PsiFileFactory.getInstance(myProject).createFileFromText("a.java", JavaFileType.INSTANCE, "class Super { @Deprecated void foo(){} }")).getClasses()[0];
PsiClass subClass = ((PsiNewExpression)factory.createExpressionFromText("new Super() { void foo(){} }", superClass)).getAnonymousClass();
assertNotNull(AnnotationUtil.findAnnotationInHierarchy(subClass.getMethods()[0], Deprecated.class));
superClass.getMethods()[0].getModifierList().getAnnotations()[0].delete();
assertNull(AnnotationUtil.findAnnotationInHierarchy(subClass.getMethods()[0], Deprecated.class));
}
}