From 87ba909e5f24c27bba6dda6a14e9fd4d3eda1975 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 14 Sep 2015 12:14:30 +0200 Subject: [PATCH] when creating anchor-based smart pointers, ensure we can restore PSI by anchors --- .../psi/impl/smartPointers/JavaAnchorProvider.java | 2 -- .../psi/impl/smartPointers/AnchorElementInfo.java | 5 +++++ .../impl/smartPointers/AnchorElementInfoFactory.java | 11 +++++++---- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/smartPointers/JavaAnchorProvider.java b/java/java-impl/src/com/intellij/psi/impl/smartPointers/JavaAnchorProvider.java index 9597a68010aa..21499dd45d74 100644 --- a/java/java-impl/src/com/intellij/psi/impl/smartPointers/JavaAnchorProvider.java +++ b/java/java-impl/src/com/intellij/psi/impl/smartPointers/JavaAnchorProvider.java @@ -53,8 +53,6 @@ public class JavaAnchorProvider extends SmartPointerAnchorProvider { parent = parent.getParent(); } - if (!anchor.equals(AnchorElementInfoFactory.getAnchor(parent))) return null; - return parent; } return null; diff --git a/platform/core-impl/src/com/intellij/psi/impl/smartPointers/AnchorElementInfo.java b/platform/core-impl/src/com/intellij/psi/impl/smartPointers/AnchorElementInfo.java index a7de84df0361..1c44930b1057 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/smartPointers/AnchorElementInfo.java +++ b/platform/core-impl/src/com/intellij/psi/impl/smartPointers/AnchorElementInfo.java @@ -84,6 +84,11 @@ class AnchorElementInfo extends SelfElementInfo { TextRange range = anchor.getTextRange(); if (range.getStartOffset() != psiRange.getStartOffset() || range.getEndOffset() != psiRange.getEndOffset()) return null; + return restoreFromAnchor(anchor); + } + + @Nullable + static PsiElement restoreFromAnchor(PsiElement anchor) { for (SmartPointerAnchorProvider provider : SmartPointerAnchorProvider.EP_NAME.getExtensions()) { final PsiElement element = provider.restoreElement(anchor); if (element != null) return element; diff --git a/platform/core-impl/src/com/intellij/psi/impl/smartPointers/AnchorElementInfoFactory.java b/platform/core-impl/src/com/intellij/psi/impl/smartPointers/AnchorElementInfoFactory.java index e39a5e394e1a..4c45d1ceed16 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/smartPointers/AnchorElementInfoFactory.java +++ b/platform/core-impl/src/com/intellij/psi/impl/smartPointers/AnchorElementInfoFactory.java @@ -59,11 +59,14 @@ public class AnchorElementInfoFactory implements SmartPointerElementInfoFactory @Nullable static PsiElement getAnchor(@NotNull PsiElement element) { PsiUtilCore.ensureValid(element); - PsiElement anchor = null; + if (!element.isPhysical()) return null; + for (SmartPointerAnchorProvider provider : SmartPointerAnchorProvider.EP_NAME.getExtensions()) { - anchor = provider.getAnchor(element); - if (anchor != null && anchor.isPhysical()) return anchor; + PsiElement anchor = provider.getAnchor(element); + if (anchor != null && anchor.isPhysical() && AnchorElementInfo.restoreFromAnchor(anchor) == element) { + return anchor; + } } - return anchor; + return null; } }