PsiTreeUtil.isAncestor() avoids loading tree when working with stub-based elements
authorDmitry Jemerov <yole@jetbrains.com>
Wed, 10 Mar 2010 17:27:19 +0000 (20:27 +0300)
committerDmitry Jemerov <yole@jetbrains.com>
Wed, 10 Mar 2010 18:22:51 +0000 (21:22 +0300)
platform/lang-api/src/com/intellij/psi/util/PsiTreeUtil.java

index ba50a6d79dd90a516ed5da469e46fe514fa6a826..bbbea29c8583787cc99fcddad84679964510da94 100644 (file)
@@ -48,7 +48,14 @@ public class PsiTreeUtil {
    */
   public static boolean isAncestor(@Nullable PsiElement ancestor, @NotNull PsiElement element, boolean strict) {
     if (ancestor == null) return false;
+    // fast path to avoid loading tree
+    if ((ancestor instanceof StubBasedPsiElement && (((StubBasedPsiElement)ancestor).getStub() != null)) ||
+        (element instanceof StubBasedPsiElement && ((StubBasedPsiElement)element).getStub() != null)) {
+      if (ancestor.getContainingFile() != element.getContainingFile()) return false;
+    }
+
     boolean stopAtFileLevel = !(ancestor instanceof PsiFile || ancestor instanceof PsiDirectory);
+
     PsiElement parent = strict ? element.getParent() : element;
     while (true) {
       if (parent == null) return false;