From 710fe36b9c52f5125cc70877c6dcabc99b197268 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 19 Aug 2013 17:49:17 +0200 Subject: [PATCH] use smart pointers instead of anchors in trees so that the selection survives on stub tree modifications (IDEA-112157) --- .../impl/nodes/PsiTreeAnchorizer.java | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiTreeAnchorizer.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiTreeAnchorizer.java index 1dd3972d31fd..70e64125a945 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiTreeAnchorizer.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiTreeAnchorizer.java @@ -19,8 +19,9 @@ import com.intellij.ide.util.treeView.TreeAnchorizer; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Key; -import com.intellij.psi.PsiAnchor; import com.intellij.psi.PsiElement; +import com.intellij.psi.SmartPointerManager; +import com.intellij.psi.SmartPsiElementPointer; import org.jetbrains.annotations.Nullable; /** @@ -28,7 +29,7 @@ import org.jetbrains.annotations.Nullable; */ public class PsiTreeAnchorizer extends TreeAnchorizer { - private static final Key PSI_ANCHORIZER_ANCHOR = Key.create("PSI_ANCHORIZER_ANCHOR"); + private static final Key PSI_ANCHORIZER_POINTER = Key.create("PSI_ANCHORIZER_ANCHOR"); @Override public Object createAnchor(Object element) { @@ -38,15 +39,16 @@ public class PsiTreeAnchorizer extends TreeAnchorizer { return ApplicationManager.getApplication().runReadAction(new Computable() { @Override public Object compute() { - PsiAnchor anchor = psiElement.getUserData(PSI_ANCHORIZER_ANCHOR); + SmartPsiElementPointer pointer = psiElement.getUserData(PSI_ANCHORIZER_POINTER); if (!psiElement.isValid()) { - return anchor != null ? anchor : psiElement; + return pointer != null ? pointer : psiElement; } - if (anchor == null || anchor.retrieve() != psiElement) { - psiElement.putUserData(PSI_ANCHORIZER_ANCHOR, anchor = PsiAnchor.create(psiElement)); + if (pointer == null || pointer.getElement() != psiElement) { + pointer = SmartPointerManager.getInstance(psiElement.getProject()).createSmartPsiElementPointer(psiElement); + psiElement.putUserData(PSI_ANCHORIZER_POINTER, pointer); } - return anchor; + return pointer; } }); } @@ -55,12 +57,8 @@ public class PsiTreeAnchorizer extends TreeAnchorizer { @Override @Nullable public Object retrieveElement(Object pointer) { - if (pointer instanceof PsiAnchor) { - PsiElement retrieve = ((PsiAnchor)pointer).retrieve(); - if (retrieve == null) { - //System.out.println("Null anchor: " + pointer); - } - return retrieve; + if (pointer instanceof SmartPsiElementPointer) { + return ((SmartPsiElementPointer)pointer).getElement(); } return super.retrieveElement(pointer);