From d3324a595ef48d1cfe1cf995eb6a500c968bf29b Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 13 Mar 2017 19:39:07 +0100 Subject: [PATCH] FileTrees.withExclusiveStub: more diagnostics and avoid complete reindexing (RUBY-19319) replace assertion with RuntimeException, because AssertionErrors cause index rebuild --- .../src/com/intellij/psi/impl/source/FileTrees.java | 7 +++++-- .../src/com/intellij/psi/impl/source/PsiFileImpl.java | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/FileTrees.java b/platform/core-impl/src/com/intellij/psi/impl/source/FileTrees.java index af23d6fbad40..412562ee9d3f 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/FileTrees.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/FileTrees.java @@ -24,6 +24,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.lang.ref.Reference; +import java.util.Set; /** * @author peter @@ -67,8 +68,10 @@ final class FileTrees { return new FileTrees(myStub, ast, true, useStrongRefs); } - FileTrees withExclusiveStub(@NotNull StubTree stub) { - assert derefTreeElement() == null && !useStrongRefs : this; + FileTrees withExclusiveStub(@NotNull StubTree stub, Set allRoots) { + if (derefTreeElement() != null || useStrongRefs) { + throw new RuntimeException(toString() + "; roots=" + allRoots); + } return new FileTrees(new SoftReference<>(stub), null, false, false); } 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 3ea808fc3559..64c219cfc58a 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 @@ -716,7 +716,7 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF // now stubs can be safely published for (PsiFileImpl eachPsiRoot : bindings.keySet()) { - eachPsiRoot.updateTrees(eachPsiRoot.myTrees.withExclusiveStub(bindings.get(eachPsiRoot))); + eachPsiRoot.updateTrees(eachPsiRoot.myTrees.withExclusiveStub(bindings.get(eachPsiRoot), bindings.keySet())); } return result; }