diff --git a/java/java-psi-api/src/com/intellij/codeInsight/AnnotationUtil.java b/java/java-psi-api/src/com/intellij/codeInsight/AnnotationUtil.java index 2d1bf2a43ac6..5a2e0f4623d7 100644 --- a/java/java-psi-api/src/com/intellij/codeInsight/AnnotationUtil.java +++ b/java/java-psi-api/src/com/intellij/codeInsight/AnnotationUtil.java @@ -217,9 +217,7 @@ public class AnnotationUtil { //noinspection unchecked list.addAll((Collection)result); - List dependencies = ContainerUtil.newArrayList(result); - dependencies.add(PsiModificationTracker.MODIFICATION_COUNT); - return Result.create(list, dependencies); + return Result.create(list, PsiModificationTracker.MODIFICATION_COUNT); } }); } diff --git a/java/java-tests/testSrc/com/intellij/psi/resolve/ResolveInCodeFragmentTest.java b/java/java-tests/testSrc/com/intellij/psi/resolve/ResolveInCodeFragmentTest.java index 5633acd5ba7d..4dd80ac62867 100644 --- a/java/java-tests/testSrc/com/intellij/psi/resolve/ResolveInCodeFragmentTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/resolve/ResolveInCodeFragmentTest.java @@ -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)); + } } diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java b/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java index 217a39d7c8c1..5298f2468a71 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java @@ -433,7 +433,10 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF @Override public long getModificationStamp() { - return myModificationStamp; + PsiElement context = getContext(); + PsiFile contextFile = context == null ? null : context.getContainingFile(); + long contextStamp = contextFile == null ? 0 : contextFile.getModificationStamp(); + return myModificationStamp + contextStamp; } @Override