mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
create stub-based smart pointers even when AST is loaded
This commit is contained in:
+15
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+5
-13
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user