diff options
Diffstat (limited to 'platform/core-impl/src/com/intellij/psi/impl/source/tree')
3 files changed, 20 insertions, 7 deletions
diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java b/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java index f00c15220d57..c73d0bd485ce 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java @@ -771,8 +771,7 @@ public class CompositeElement extends TreeElement { } @Override - @Nullable - public <T extends PsiElement> T getPsi(Class<T> clazz) { + public <T extends PsiElement> T getPsi(@NotNull Class<T> clazz) { return LeafElement.getPsi(clazz, getPsi(), LOG); } @@ -797,6 +796,10 @@ public class CompositeElement extends TreeElement { myWrapper = psi; } + protected void clearPsi() { + myWrapper = null; + } + public final void rawAddChildren(@NotNull TreeElement first) { rawAddChildrenWithoutNotifications(first); diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/tree/FileElement.java b/platform/core-impl/src/com/intellij/psi/impl/source/tree/FileElement.java index f025de75b820..76d5c421094d 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/tree/FileElement.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/tree/FileElement.java @@ -19,6 +19,7 @@ package com.intellij.psi.impl.source.tree; import com.intellij.lang.ASTNode; import com.intellij.lang.FileASTNode; import com.intellij.openapi.util.Getter; +import com.intellij.psi.PsiElement; import com.intellij.psi.impl.PsiManagerEx; import com.intellij.psi.impl.source.CharTableImpl; import com.intellij.psi.impl.source.PsiFileImpl; @@ -28,6 +29,17 @@ import org.jetbrains.annotations.NotNull; public class FileElement extends LazyParseableElement implements FileASTNode, Getter<FileElement> { private volatile CharTable myCharTable = new CharTableImpl(); + private volatile boolean myDetached; + + @Override + protected PsiElement createPsiNoLock() { + return myDetached ? null : super.createPsiNoLock(); + } + + public void detachFromFile() { + myDetached = true; + clearPsi(); + } @Override @NotNull diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/tree/LeafElement.java b/platform/core-impl/src/com/intellij/psi/impl/source/tree/LeafElement.java index 929737177052..011cad8a8450 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/tree/LeafElement.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/tree/LeafElement.java @@ -290,16 +290,14 @@ public abstract class LeafElement extends TreeElement { } @Override - @Nullable - public <T extends PsiElement> T getPsi(Class<T> clazz) { + public <T extends PsiElement> T getPsi(@NotNull Class<T> clazz) { return getPsi(clazz, getPsi(), LOG); } - @Nullable - static <T extends PsiElement> T getPsi(Class<T> clazz, PsiElement element, Logger log) { + static <T extends PsiElement> T getPsi(@NotNull Class<T> clazz, PsiElement element, Logger log) { log.assertTrue(clazz.isInstance(element), "unexpected psi class. expected: " + clazz + " got: " + (element == null ? null : element.getClass())); + //noinspection unchecked return (T)element; } - } |