create stub-based smart pointers even when AST is loaded

This commit is contained in:
peter
2017-04-06 18:35:58 +02:00
parent c96866a636
commit 03c39c23bc
2 changed files with 20 additions and 13 deletions
@@ -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<PsiFile> 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<PsiClass> pointer = createPointer(file.getClasses()[0]);
PlatformTestUtil.tryGcSoftlyReachableObjects();
assertNull(file.getTreeElement());
assertNotNull(pointer.getElement());
assertNull(file.getTreeElement());
}
}
@@ -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<E extends PsiElement> 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());
}
}
}