diff --git a/java/java-structure-view/src/com/intellij/lang/java/logical/ClassOwnerLogicalStructureElementsProvider.kt b/java/java-structure-view/src/com/intellij/lang/java/logical/ClassOwnerLogicalStructureElementsProvider.kt index 43be1457c0da..6d91a26cbb1d 100644 --- a/java/java-structure-view/src/com/intellij/lang/java/logical/ClassOwnerLogicalStructureElementsProvider.kt +++ b/java/java-structure-view/src/com/intellij/lang/java/logical/ClassOwnerLogicalStructureElementsProvider.kt @@ -1,13 +1,30 @@ // Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.lang.java.logical +import com.intellij.ide.structureView.logical.ConvertElementsProvider import com.intellij.ide.structureView.logical.LogicalStructureElementsProvider import com.intellij.psi.PsiClass import com.intellij.psi.PsiClassOwner -class ClassOwnerLogicalStructureElementsProvider: LogicalStructureElementsProvider { - override fun getElements(parent: PsiClassOwner): List { - return parent.classes.toList() +class ClassOwnerLogicalStructureElementsProvider: LogicalStructureElementsProvider { + override fun getElements(parent: PsiClassOwner): List { + val result = mutableListOf() + var convertedAtLeastOne = false + for (psiClass in parent.classes) { + val convertedModels = LogicalStructureElementsProvider.getProviders(psiClass) + .filterIsInstance>() + .map { it.convert(psiClass) } + .filterNotNull() + if (convertedModels.count() > 0) { + convertedModels.forEach { result.add(it) } + convertedAtLeastOne = true + } + else { + result.add(psiClass) + } + } + if (convertedAtLeastOne) return result + return emptyList() } override fun forLogicalModelClass(): Class = PsiClassOwner::class.java } diff --git a/platform/structure-view-impl/api-dump.txt b/platform/structure-view-impl/api-dump.txt index f3b91b953b39..7af63088aaee 100644 --- a/platform/structure-view-impl/api-dump.txt +++ b/platform/structure-view-impl/api-dump.txt @@ -77,12 +77,6 @@ f:com.intellij.ide.structureView.logical.impl.LogicalStructureViewService - f:getLogicalStructureBuilder(com.intellij.psi.PsiFile):com.intellij.ide.structureView.StructureViewBuilder f:com.intellij.ide.structureView.logical.impl.LogicalStructureViewService$Companion - f:getInstance(com.intellij.openapi.project.Project):com.intellij.ide.structureView.logical.impl.LogicalStructureViewService -com.intellij.ide.structureView.logical.impl.LogicalStructureViewTreeElement -- com.intellij.ide.structureView.StructureViewTreeElement -- a:getLogicalAssembledModel():com.intellij.ide.structureView.logical.model.LogicalStructureAssembledModel -f:com.intellij.ide.structureView.logical.impl.LogicalStructureViewTreeElementsKt -- sf:createViewTreeElement(com.intellij.ide.structureView.logical.model.LogicalStructureAssembledModel,java.lang.String):com.intellij.ide.structureView.StructureViewTreeElement -- bs:createViewTreeElement$default(com.intellij.ide.structureView.logical.model.LogicalStructureAssembledModel,java.lang.String,I,java.lang.Object):com.intellij.ide.structureView.StructureViewTreeElement f:com.intellij.ide.structureView.logical.model.LogicalStructureAssembledModel - sf:Companion:com.intellij.ide.structureView.logical.model.LogicalStructureAssembledModel$Companion - f:getChildren():java.util.List 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 500094fe7ddc..e7a4714273da 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 @@ -19,10 +19,14 @@ */ package com.intellij.ide.highlighter; +import com.intellij.ide.structureView.StructureView; import com.intellij.ide.structureView.StructureViewBuilder; import com.intellij.ide.structureView.StructureViewBuilderProvider; +import com.intellij.ide.structureView.impl.StructureViewComposite; +import com.intellij.ide.structureView.logical.impl.LogicalStructureViewService; import com.intellij.lang.LanguageStructureViewBuilder; import com.intellij.lang.PsiStructureViewFactory; +import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.project.Project; @@ -44,6 +48,19 @@ public class LanguageFileTypeStructureViewBuilderProvider implements StructureVi if (psiFile == null) return null; final PsiStructureViewFactory factory = LanguageStructureViewBuilder.getInstance().forLanguage(psiFile.getLanguage()); - return factory == null ? null : factory.getStructureViewBuilder(psiFile); + if (factory == null) return null; + StructureViewBuilder physicalBuilder = factory.getStructureViewBuilder(psiFile); + if (physicalBuilder == null) return null; + StructureViewBuilder logicalBuilder = LogicalStructureViewService.Companion.getInstance(project).getLogicalStructureBuilder(psiFile); + if (logicalBuilder == null) return physicalBuilder; + return new StructureViewBuilder() { + @Override + public @NotNull StructureView createStructureView(@Nullable FileEditor fileEditor, @NotNull Project project) { + return new StructureViewComposite( + new StructureViewComposite.StructureViewDescriptor("Logical", logicalBuilder.createStructureView(fileEditor, project), null), + new StructureViewComposite.StructureViewDescriptor("Physical", physicalBuilder.createStructureView(fileEditor, project), null) + ); + } + }; } } \ No newline at end of file diff --git a/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/impl/LogicalStructureViewTreeElements.kt b/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/impl/LogicalStructureViewModel.kt similarity index 86% rename from platform/structure-view-impl/src/com/intellij/ide/structureView/logical/impl/LogicalStructureViewTreeElements.kt rename to platform/structure-view-impl/src/com/intellij/ide/structureView/logical/impl/LogicalStructureViewModel.kt index dd8818dfcce1..885cd36273d0 100644 --- a/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/impl/LogicalStructureViewTreeElements.kt +++ b/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/impl/LogicalStructureViewModel.kt @@ -2,29 +2,43 @@ package com.intellij.ide.structureView.logical.impl import com.intellij.ide.TypePresentationService +import com.intellij.ide.structureView.StructureViewModel +import com.intellij.ide.structureView.StructureViewModelBase import com.intellij.ide.structureView.StructureViewTreeElement import com.intellij.ide.structureView.impl.common.PsiTreeElementBase import com.intellij.ide.structureView.logical.LogicalStructureTreeElementProvider import com.intellij.ide.structureView.logical.PropertyElementProvider import com.intellij.ide.structureView.logical.model.LogicalStructureAssembledModel import com.intellij.ide.util.treeView.smartTree.TreeElement -import com.intellij.navigation.ColoredItemPresentation import com.intellij.navigation.ItemPresentation -import com.intellij.openapi.editor.HighlighterColors -import com.intellij.openapi.editor.colors.TextAttributesKey -import com.intellij.openapi.editor.markup.TextAttributes +import com.intellij.openapi.editor.Editor import com.intellij.psi.PsiElement +import com.intellij.psi.PsiFile import com.intellij.psi.PsiTarget -import java.awt.Font import javax.swing.Icon -/** - * @param parentKey is needed to distinguish similar nodes in different branches. - * Because the logical model may be recursive or the same element can be present a few times (e.g: two controllers depend on the same service) -* @return structure tree element basing on logical model - * The model's children will be transformed into child tree elements - */ -fun createViewTreeElement(assembledModel: LogicalStructureAssembledModel, parentKey: String = "root"): StructureViewTreeElement { +internal class LogicalStructureViewModel(psiFile: PsiFile, editor: Editor?, assembledModel: LogicalStructureAssembledModel<*>) + : StructureViewModelBase(psiFile, editor, createViewTreeElement(assembledModel, "root")), + StructureViewModel.ElementInfoProvider, StructureViewModel.ExpandInfoProvider { + + override fun isAlwaysShowsPlus(element: StructureViewTreeElement?): Boolean { + return element is LogicalGroupStructureElement + } + + override fun isAlwaysLeaf(element: StructureViewTreeElement?): Boolean { + return element is PropertyPsiElementStructureElement<*> || element is PropertyStructureElement + } + + override fun isAutoExpand(element: StructureViewTreeElement): Boolean { + return false //(element as? LogicalStructureViewTreeElement<*>)?.getLogicalAssembledModel()?.model !is BackReferenceLogicalModel + } + + override fun isSmartExpand(): Boolean { + return false + } +} + +private fun createViewTreeElement(assembledModel: LogicalStructureAssembledModel, parentKey: String): StructureViewTreeElement { val model = assembledModel.model val explicitElement = LogicalStructureTreeElementProvider.getTreeElement(model) if (explicitElement != null) return explicitElement @@ -73,7 +87,7 @@ private fun getPsiElement(model: Any?): PsiElement? { } } -interface LogicalStructureViewTreeElement: StructureViewTreeElement { +private interface LogicalStructureViewTreeElement: StructureViewTreeElement { fun getLogicalAssembledModel(): LogicalStructureAssembledModel diff --git a/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/impl/LogicalStructureViewService.kt b/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/impl/LogicalStructureViewService.kt index c23faa2b045a..3c08850ed7b5 100644 --- a/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/impl/LogicalStructureViewService.kt +++ b/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/impl/LogicalStructureViewService.kt @@ -3,7 +3,6 @@ package com.intellij.ide.structureView.logical.impl import com.intellij.ide.structureView.logical.model.LogicalStructureAssembledModel import com.intellij.ide.structureView.* -import com.intellij.ide.util.treeView.smartTree.Grouper import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.components.Service import com.intellij.openapi.editor.Editor @@ -37,29 +36,4 @@ class LogicalStructureViewService( } } -} - -private class LogicalStructureViewModel(psiFile: PsiFile, editor: Editor?, assembledModel: LogicalStructureAssembledModel<*>) - : StructureViewModelBase(psiFile, editor, createViewTreeElement(assembledModel)), - StructureViewModel.ElementInfoProvider, StructureViewModel.ExpandInfoProvider { - - override fun isAlwaysShowsPlus(element: StructureViewTreeElement?): Boolean { - return false - } - - override fun isAlwaysLeaf(element: StructureViewTreeElement?): Boolean { - return false - } - - //override fun getGroupers(): Array { - // return arrayOf(LogicalGrouper()) - //} - - override fun isAutoExpand(element: StructureViewTreeElement): Boolean { - return false - } - - override fun isSmartExpand(): Boolean { - return false - } } \ No newline at end of file diff --git a/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/model/LogicalStructureAssembledModel.kt b/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/model/LogicalStructureAssembledModel.kt index cb53746925c5..7d33b3efa029 100644 --- a/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/model/LogicalStructureAssembledModel.kt +++ b/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/model/LogicalStructureAssembledModel.kt @@ -23,8 +23,9 @@ class LogicalStructureAssembledModel private constructor( fun getChildren(): List> { return LogicalStructureElementsProvider.getProviders(model!!) + .filter { it !is ConvertElementsProvider } .flatMap { it.getElements(model) } - .flatMap { ConvertElementsProvider.convert(it) } + //.flatMap { ConvertElementsProvider.convert(it) } .map { LogicalStructureAssembledModel(project, it) } .toList() }