From d85a101ade90f63f82f902e33426611db512f76f Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 2 Apr 2012 20:13:55 +0200 Subject: [PATCH] nullify stub->psi reference when stub-based file is changed, simpler isValid check for stub elements --- .../extapi/psi/StubBasedPsiElementBase.java | 7 ++---- .../intellij/psi/impl/source/PsiFileImpl.java | 25 ++++++++----------- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java b/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java index 1477e2344d70..094d56c5a024 100644 --- a/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java +++ b/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java @@ -154,11 +154,8 @@ public class StubBasedPsiElementBase extends ASTDelegateP public boolean isValid() { T stub = myStub; if (stub != null) { - PsiElement parentPsi = stub.getParentStub().getPsi(); - if (parentPsi instanceof PsiFileImpl) { - return ((PsiFileImpl) parentPsi).isStubBasedChildValid(this); - } - return parentPsi.isValid(); + PsiElement psi = stub.getParentStub().getPsi(); + return psi != null && psi.isValid(); } return super.isValid(); diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java b/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java index ef0e78c11bf1..c7f29a62d3f5 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java @@ -220,7 +220,7 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF stubs.next(); // Skip file stub; switchFromStubToAST(treeElement, stubs); - myStub = null; + clearStub(); } setTreeElement(treeElement); @@ -249,17 +249,6 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF return findTreeForStub(ast, stubs, stub); } - public boolean isStubBasedChildValid(@NotNull StubBasedPsiElementBase child) { - synchronized (myStubLock) { - StubTree fileStub = derefStub(); - StubElement childStub = child.getStub(); - if (childStub != null && (fileStub == null || fileStub.getRoot() != childStub.getParentStub())) { - return false; - } - } - return isValid(); - } - @Nullable private static ASTNode findTreeForStub(ASTNode tree, final Iterator> stubs, final StubElement stub) { final IElementType type = tree.getElementType(); @@ -352,10 +341,18 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF myViewProvider.beforeContentsSynchronized(); setTreeElement(null); synchronized (myStubLock) { - myStub = null; + clearStub(); } } + private void clearStub() { + StubTree stubHolder = myStub == null ? null : myStub.get(); + if (stubHolder != null) { + ((StubBase)stubHolder.getRoot()).setPsi(null); + } + myStub = null; + } + public void clearCaches() {} @Override @@ -404,7 +401,7 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF } synchronized (myStubLock) { - myStub = null; + clearStub(); if (tree != null) { tree.putUserData(STUB_TREE_IN_PARSED_TREE, null); }