diff --git a/java/java-tests/testSrc/com/intellij/psi/impl/smartPointers/SmartPsiElementPointersTest.java b/java/java-tests/testSrc/com/intellij/psi/impl/smartPointers/SmartPsiElementPointersTest.java index efb42a5d521b..2500bcd902ec 100644 --- a/java/java-tests/testSrc/com/intellij/psi/impl/smartPointers/SmartPsiElementPointersTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/impl/smartPointers/SmartPsiElementPointersTest.java @@ -783,6 +783,23 @@ public class SmartPsiElementPointersTest extends CodeInsightTestCase { assertInstanceOf(pointer.getElement(), PsiTypeElement.class); } + public void testPointerToEmptyElement2() { + PsiFile file = configureByText(JavaFileType.INSTANCE, "class Foo {\n" + + " void foo() {}\n" + + "}"); + PsiMethod method = PsiTreeUtil.findElementOfClassAtOffset(file, file.getText().indexOf("void"), PsiMethod.class, false); + SmartPointerEx pointer1 = (SmartPointerEx)SmartPointerManager.getInstance(myProject).createSmartPsiElementPointer(method.getModifierList()); + SmartPointerEx pointer2 = (SmartPointerEx)SmartPointerManager.getInstance(myProject).createSmartPsiElementPointer(method.getTypeParameterList()); + method = null; + + PlatformTestUtil.tryGcSoftlyReachableObjects(); + assertNull(pointer1.getCachedElement()); + assertNull(pointer2.getCachedElement()); + + assertInstanceOf(pointer1.getElement(), PsiModifierList.class); + assertInstanceOf(pointer2.getElement(), PsiTypeParameterList.class); + } + public void testPointerToReferenceSurvivesRename() { PsiFile file = configureByText(JavaFileType.INSTANCE, "class Foo extends Bar {}"); PsiJavaCodeReferenceElement ref = PsiTreeUtil.findElementOfClassAtOffset(file, file.getText().indexOf("Bar"), PsiJavaCodeReferenceElement.class, false); diff --git a/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SelfElementInfo.java b/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SelfElementInfo.java index 4f0896755954..3a26df76c557 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SelfElementInfo.java +++ b/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SelfElementInfo.java @@ -135,9 +135,11 @@ public class SelfElementInfo extends SmartPointerElementInfo { if (anchor == null) return null; PsiElement result = findParent(syncStartOffset, syncEndOffset, type, anchor); - if (result == null && syncEndOffset == syncStartOffset && anchor.getTextRange().getStartOffset() == syncEndOffset) { - anchor = PsiTreeUtil.prevLeaf(anchor, false); - if (anchor != null) { + if (syncEndOffset == syncStartOffset) { + while (result == null && anchor.getTextRange().getStartOffset() == syncEndOffset) { + anchor = PsiTreeUtil.prevLeaf(anchor, false); + if (anchor == null) break; + result = findParent(syncStartOffset, syncEndOffset, type, anchor); } }