diff --git a/java/java-tests/testSrc/com/intellij/psi/impl/smartPointers/SmartPsiElementPointersTest.java b/java/java-tests/testSrc/com/intellij/psi/impl/smartPointers/SmartPsiElementPointersTest.java index 27c2bceb8e5b..b0ae8e2f8a4f 100644 --- a/java/java-tests/testSrc/com/intellij/psi/impl/smartPointers/SmartPsiElementPointersTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/impl/smartPointers/SmartPsiElementPointersTest.java @@ -24,6 +24,7 @@ import com.intellij.lang.FileASTNode; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.diagnostic.DefaultLogger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.editor.EditorModificationUtil; @@ -41,6 +42,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.impl.source.PostprocessReformattingAspect; import com.intellij.psi.impl.source.PsiFileImpl; +import com.intellij.psi.impl.source.PsiJavaFileImpl; import com.intellij.psi.impl.source.tree.FileElement; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.stubs.StubElement; @@ -971,6 +973,7 @@ public class SmartPsiElementPointersTest extends CodeInsightTestCase { } public void testDoubleRemoveIsAnError() throws Exception { + DefaultLogger.disableStderrDumping(getTestRootDisposable()); SmartPointerEx pointer = createPointer(createFile("a.java", "class A {}")); getPointerManager().removePointer(pointer); try { @@ -982,4 +985,16 @@ public class SmartPsiElementPointersTest extends CodeInsightTestCase { } } + public void testStubSmartPointersAreCreatedEvenInAstPresence() throws Exception { + PsiJavaFileImpl file = (PsiJavaFileImpl)createFile("a.java", "class A {}"); + assertNotNull(file.getNode()); + SmartPointerEx pointer = createPointer(file.getClasses()[0]); + + PlatformTestUtil.tryGcSoftlyReachableObjects(); + assertNull(file.getTreeElement()); + + assertNotNull(pointer.getElement()); + assertNull(file.getTreeElement()); + } + } diff --git a/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SmartPsiElementPointerImpl.java b/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SmartPsiElementPointerImpl.java index a46a47cdc50c..7510d47a1460 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SmartPsiElementPointerImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SmartPsiElementPointerImpl.java @@ -28,10 +28,7 @@ import com.intellij.psi.*; import com.intellij.psi.impl.FreeThreadedFileViewProvider; import com.intellij.psi.impl.PsiManagerEx; import com.intellij.psi.impl.source.PsiFileImpl; -import com.intellij.psi.impl.source.PsiFileWithStubSupport; import com.intellij.psi.impl.source.tree.ForeignLeafPsiElement; -import com.intellij.psi.stubs.IStubElementType; -import com.intellij.psi.stubs.StubTree; import com.intellij.psi.tree.IStubFileElementType; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; @@ -209,18 +206,13 @@ class SmartPsiElementPointerImpl implements SmartPointerEx @Nullable private static SmartPointerElementInfo createAnchorInfo(@NotNull PsiElement element, @NotNull PsiFile containingFile) { - if (element instanceof StubBasedPsiElement && containingFile instanceof PsiFileWithStubSupport) { - PsiFileWithStubSupport stubFile = (PsiFileWithStubSupport)containingFile; - StubTree stubTree = stubFile.getStubTree(); - if (stubTree != null) { - // use stubs when tree is not loaded + if (element instanceof StubBasedPsiElement && containingFile instanceof PsiFileImpl) { + IStubFileElementType stubType = ((PsiFileImpl)containingFile).getElementTypeForStubBuilder(); + if (stubType != null && stubType.shouldBuildStubFor(containingFile.getViewProvider().getVirtualFile())) { StubBasedPsiElement stubPsi = (StubBasedPsiElement)element; int stubId = PsiAnchor.calcStubIndex(stubPsi); - IStubElementType myStubElementType = stubPsi.getElementType(); - - IStubFileElementType elementTypeForStubBuilder = ((PsiFileImpl)containingFile).getElementTypeForStubBuilder(); - if (stubId != -1 && elementTypeForStubBuilder != null) { // TemplateDataElementType is not IStubFileElementType - return new AnchorElementInfo(element, stubFile, stubId, myStubElementType); + if (stubId != -1) { + return new AnchorElementInfo(element, (PsiFileImpl)containingFile, stubId, stubPsi.getElementType()); } } }