use stubs for Structure TW when selecting lib classes

This commit is contained in:
Gregory.Shrago
2018-10-17 21:48:46 +03:00
parent 99ab89837d
commit cf443a822d
4 changed files with 18 additions and 6 deletions

View File

@@ -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

View File

@@ -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) {

View File

@@ -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>

View File

@@ -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 -> {