mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-16 14:23:28 +07:00
use stubs for Structure TW when selecting lib classes
This commit is contained in:
@@ -51,6 +51,7 @@ import com.intellij.psi.util.CachedValuesManager;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.reference.SoftReference;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.AstLoadingFilter;
|
||||
import com.intellij.util.BitUtil;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import com.intellij.util.cls.ClsFormatException;
|
||||
@@ -332,6 +333,8 @@ public class ClsFileImpl extends PsiBinaryFileImpl
|
||||
synchronized (myMirrorLock) {
|
||||
mirrorTreeElement = SoftReference.dereference(myMirrorFileElement);
|
||||
if (mirrorTreeElement == null) {
|
||||
AstLoadingFilter.assertTreeLoadingAllowed(getVirtualFile());
|
||||
|
||||
VirtualFile file = getVirtualFile();
|
||||
PsiClass[] classes = getClasses();
|
||||
String fileName = (classes.length > 0 ? classes[0].getName() : file.getNameWithoutExtension()) + JavaFileType.DOT_DEFAULT_EXTENSION;
|
||||
@@ -398,6 +401,12 @@ public class ClsFileImpl extends PsiBinaryFileImpl
|
||||
return (PsiFile)getMirror();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public PsiFile getCachedMirror() {
|
||||
TreeElement mirrorTreeElement = SoftReference.dereference(myMirrorFileElement);
|
||||
return mirrorTreeElement == null ? null : (PsiFile)mirrorTreeElement.getPsi();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(@NotNull PsiElementVisitor visitor) {
|
||||
if (visitor instanceof JavaElementVisitor) {
|
||||
@@ -505,7 +514,7 @@ public class ClsFileImpl extends PsiBinaryFileImpl
|
||||
|
||||
@Override
|
||||
public boolean isContentsLoaded() {
|
||||
return myStub != null;
|
||||
return getCachedMirror() != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -22,9 +22,9 @@ import com.intellij.lang.PsiStructureViewFactory;
|
||||
import com.intellij.openapi.fileTypes.FileType;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiCompiledFile;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiManager;
|
||||
import com.intellij.psi.impl.compiled.ClsFileImpl;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -38,8 +38,9 @@ public class JavaClsStructureViewBuilderProvider implements StructureViewBuilder
|
||||
if (fileType == JavaClassFileType.INSTANCE) {
|
||||
PsiFile psiFile = PsiManager.getInstance(project).findFile(file);
|
||||
|
||||
if (psiFile instanceof PsiCompiledFile) {
|
||||
psiFile = ((PsiCompiledFile)psiFile).getDecompiledPsiFile();
|
||||
if (psiFile instanceof ClsFileImpl) {
|
||||
PsiFile mirror = ((ClsFileImpl)psiFile).getCachedMirror();
|
||||
if (mirror != null) psiFile = mirror;
|
||||
}
|
||||
|
||||
if (psiFile != null) {
|
||||
|
||||
@@ -18,5 +18,6 @@
|
||||
<orderEntry type="library" name="automaton" level="project" />
|
||||
<orderEntry type="module" module-name="intellij.platform.projectModel" exported="" />
|
||||
<orderEntry type="module" module-name="intellij.platform.ide" />
|
||||
<orderEntry type="module" module-name="intellij.platform.core.impl" />
|
||||
</component>
|
||||
</module>
|
||||
@@ -11,6 +11,7 @@ import com.intellij.lang.folding.LanguageFolding;
|
||||
import com.intellij.openapi.progress.ProgressManager;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.PsiFileEx;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -24,8 +25,8 @@ public class CustomRegionStructureUtil {
|
||||
|
||||
public static Collection<StructureViewTreeElement> groupByCustomRegions(@NotNull PsiElement rootElement,
|
||||
@NotNull Collection<StructureViewTreeElement> originalElements) {
|
||||
if (rootElement instanceof StubBasedPsiElement &&
|
||||
((StubBasedPsiElement)rootElement).getStub() != null) {
|
||||
if (rootElement instanceof PsiFileEx && !((PsiFileEx)rootElement).isContentsLoaded() ||
|
||||
rootElement instanceof StubBasedPsiElement && ((StubBasedPsiElement)rootElement).getStub() != null) {
|
||||
return originalElements;
|
||||
}
|
||||
Set<TextRange> childrenRanges = ContainerUtil.map2SetNotNull(originalElements, element -> {
|
||||
|
||||
Reference in New Issue
Block a user