From 8e2c5f8ccb05d80ca803b87e60bdb0fc41364e88 Mon Sep 17 00:00:00 2001 From: Anton Kozub Date: Wed, 26 Feb 2025 17:46:00 +0100 Subject: [PATCH] IDEA-367518 Spring Structure: no logical structure for decompiled library class GitOrigin-RevId: 8fa8264394ddb82391d62fbe414eed96c55ebe5a --- .../JavaClsStructureViewBuilderProvider.java | 4 +++- ...guageFileTypeStructureViewBuilderProvider.java | 13 +------------ .../PhysicalAndLogicalStructureViewBuilder.kt | 15 +++++++++++++++ 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/java/java-structure-view/src/com/intellij/ide/highlighter/JavaClsStructureViewBuilderProvider.java b/java/java-structure-view/src/com/intellij/ide/highlighter/JavaClsStructureViewBuilderProvider.java index 1c180c2c73cc..440031c06ced 100644 --- a/java/java-structure-view/src/com/intellij/ide/highlighter/JavaClsStructureViewBuilderProvider.java +++ b/java/java-structure-view/src/com/intellij/ide/highlighter/JavaClsStructureViewBuilderProvider.java @@ -3,6 +3,7 @@ package com.intellij.ide.highlighter; import com.intellij.ide.structureView.StructureViewBuilder; import com.intellij.ide.structureView.StructureViewBuilderProvider; +import com.intellij.ide.structureView.logical.PhysicalAndLogicalStructureViewBuilder; import com.intellij.lang.LanguageStructureViewBuilder; import com.intellij.lang.PsiStructureViewFactory; import com.intellij.openapi.fileTypes.FileType; @@ -28,7 +29,8 @@ public class JavaClsStructureViewBuilderProvider implements StructureViewBuilder if (psiFile != null) { PsiStructureViewFactory factory = LanguageStructureViewBuilder.getInstance().forLanguage(psiFile.getLanguage()); if (factory != null) { - return factory.getStructureViewBuilder(psiFile); + StructureViewBuilder physicalBuilder = factory.getStructureViewBuilder(psiFile); + return PhysicalAndLogicalStructureViewBuilder.Companion.wrapPhysicalBuilderIfPossible(physicalBuilder, psiFile); } } } diff --git a/platform/structure-view-impl/src/com/intellij/ide/highlighter/LanguageFileTypeStructureViewBuilderProvider.java b/platform/structure-view-impl/src/com/intellij/ide/highlighter/LanguageFileTypeStructureViewBuilderProvider.java index 2f76f6a7fd6e..aaff2e23f5ed 100644 --- a/platform/structure-view-impl/src/com/intellij/ide/highlighter/LanguageFileTypeStructureViewBuilderProvider.java +++ b/platform/structure-view-impl/src/com/intellij/ide/highlighter/LanguageFileTypeStructureViewBuilderProvider.java @@ -4,16 +4,12 @@ package com.intellij.ide.highlighter; import com.intellij.ide.structureView.StructureViewBuilder; import com.intellij.ide.structureView.StructureViewBuilderProvider; -import com.intellij.ide.structureView.TreeBasedStructureViewBuilder; import com.intellij.ide.structureView.logical.PhysicalAndLogicalStructureViewBuilder; -import com.intellij.idea.AppMode; import com.intellij.lang.LanguageStructureViewBuilder; import com.intellij.lang.PsiStructureViewFactory; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; @@ -31,13 +27,6 @@ class LanguageFileTypeStructureViewBuilderProvider implements StructureViewBuild PsiStructureViewFactory factory = LanguageStructureViewBuilder.getInstance().forLanguage(psiFile.getLanguage()); if (factory == null) return null; StructureViewBuilder physicalBuilder = factory.getStructureViewBuilder(psiFile); - if (!(physicalBuilder instanceof TreeBasedStructureViewBuilder treeBasedStructureViewBuilder)) return physicalBuilder; - if (ApplicationManager.getApplication().isUnitTestMode() - || !Registry.is("logical.structure.enabled", true) - || AppMode.isRemoteDevHost()) { - return physicalBuilder; - } - - return new PhysicalAndLogicalStructureViewBuilder(treeBasedStructureViewBuilder, psiFile); + return PhysicalAndLogicalStructureViewBuilder.Companion.wrapPhysicalBuilderIfPossible(physicalBuilder, psiFile); } } \ No newline at end of file diff --git a/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/PhysicalAndLogicalStructureViewBuilder.kt b/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/PhysicalAndLogicalStructureViewBuilder.kt index ccef6c2b47f4..5581ac0b408d 100644 --- a/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/PhysicalAndLogicalStructureViewBuilder.kt +++ b/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/PhysicalAndLogicalStructureViewBuilder.kt @@ -4,12 +4,15 @@ package com.intellij.ide.structureView.logical import com.intellij.ide.structureView.* import com.intellij.ide.structureView.impl.StructureViewComposite import com.intellij.ide.structureView.logical.impl.LogicalStructureViewService.Companion.getInstance +import com.intellij.idea.AppMode +import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.EDT import com.intellij.openapi.application.readAction import com.intellij.openapi.application.writeIntentReadAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.fileEditor.FileEditor import com.intellij.openapi.project.Project +import com.intellij.openapi.util.registry.Registry import com.intellij.psi.PsiFile import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -19,6 +22,18 @@ class PhysicalAndLogicalStructureViewBuilder( private val psiFile: PsiFile, ): TreeBasedStructureViewBuilder() { + companion object { + fun wrapPhysicalBuilderIfPossible(physicalBuilder: StructureViewBuilder?, psiFile: PsiFile): StructureViewBuilder? { + if (physicalBuilder !is TreeBasedStructureViewBuilder) return physicalBuilder + if (ApplicationManager.getApplication().isUnitTestMode() + || !Registry.`is`("logical.structure.enabled", true) + || AppMode.isRemoteDevHost()) { + return physicalBuilder + } + return PhysicalAndLogicalStructureViewBuilder(physicalBuilder, psiFile) + } + } + override fun createStructureView(fileEditor: FileEditor?, project: Project): StructureView { val logicalBuilder = getInstance(psiFile.project).getLogicalStructureBuilder(psiFile) return createStructureView(logicalBuilder, fileEditor, project)