From d992b4b1a8b2c1cc41e7ec0fad7d7356ead6276f Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 4 Nov 2016 08:57:23 +0100 Subject: [PATCH] don't create new AstPath-s during switching to strong refs (EA-91128 - assert: PsiFileImpl.associateAstPathWithPsi) --- .../intellij/psi/impl/source/PsiFileImpl.java | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) 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 e019751e1be9..217a39d7c8c1 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 @@ -74,7 +74,6 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF private boolean myInvalidated; private volatile boolean myAstLoaded; private volatile boolean myUseStrongRefs; - private volatile boolean mySwitchingToStrongRefs; private AstPathPsiMap myRefToPsi; private final ThreadLocal myFileElementBeingLoaded = new ThreadLocal(); protected final PsiManagerEx myManager; @@ -277,7 +276,7 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF StubBasedPsiElementBase psi = pair.first; AstPath path = pair.second; path.getNode().setPsi(psi); - associateAstPathWithPsi(path, psi); + myRefToPsi.cachePsi(path, psi); psi.setStubIndex(i + 1); } } @@ -1132,8 +1131,7 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF public final void beforeAstChange() { if (!useStrongRefs()) { - LOG.assertTrue(!mySwitchingToStrongRefs); - mySwitchingToStrongRefs = true; + myUseStrongRefs = true; myRefToPsi.switchToStrongRefs(); FileElement element = getTreeElement(); @@ -1142,9 +1140,6 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF } else { LOG.error("No AST; " + derefStub() + "; " + this + " of " + getClass() + "; " + getViewProvider() + " of " + getViewProvider().getClass()); } - - myUseStrongRefs = true; - mySwitchingToStrongRefs = false; } } @@ -1159,16 +1154,10 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF synchronized (PsiLock.LOCK) { psi = myRefToPsi.getCachedPsi(path); - return psi != null ? psi : associateAstPathWithPsi(path, creator.create()); + return psi != null ? psi : myRefToPsi.cachePsi(path, creator.create()); } } - @NotNull - private StubBasedPsiElementBase associateAstPathWithPsi(@NotNull AstPath path, @NotNull StubBasedPsiElementBase psi) { - LOG.assertTrue(!mySwitchingToStrongRefs); - return myRefToPsi.cachePsi(path, psi); - } - final AstPathPsiMap getRefToPsi() { return myRefToPsi; }