fix restoring smart pointers to empty siblings of empty elements

This commit is contained in:
peter
2015-09-07 21:22:55 +02:00
parent 4a9e3022bb
commit c89c1aec7f
2 changed files with 22 additions and 3 deletions
@@ -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);
@@ -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);
}
}