diff --git a/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/LogicalStructureElementsProvider.kt b/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/LogicalStructureElementsProvider.kt index dea7749c34b4..3ef3042d669b 100644 --- a/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/LogicalStructureElementsProvider.kt +++ b/platform/structure-view-impl/src/com/intellij/ide/structureView/logical/LogicalStructureElementsProvider.kt @@ -3,6 +3,7 @@ package com.intellij.ide.structureView.logical import com.intellij.openapi.extensions.ExtensionPointName import com.intellij.openapi.util.ClassExtension +import org.jetbrains.annotations.ApiStatus import org.jetbrains.annotations.ApiStatus.Experimental /** @@ -44,6 +45,19 @@ interface ContainerElementsProvider : LogicalStructureElementsProvider : ContainerElementsProvider +/** + * Extension for container provider which allows providing grouped elements + */ +@ApiStatus.Internal +interface ContainerGroupedElementsProvider : ContainerElementsProvider { + + fun getGroupedElements(parent: P): LinkedHashMap> + + override fun getElements(parent: P): List { + return getGroupedElements(parent).flatMap { it.value } + } +} + /** * Provides logical properties with type [C] for logical object [P] */ 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 d6cfa4efb9e1..b525ad173e6d 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 @@ -1,10 +1,7 @@ // 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.ide.structureView.logical.model -import com.intellij.ide.structureView.logical.ContainerElementsProvider -import com.intellij.ide.structureView.logical.ConvertElementsProvider -import com.intellij.ide.structureView.logical.LogicalStructureElementsProvider -import com.intellij.ide.structureView.logical.PropertyElementProvider +import com.intellij.ide.structureView.logical.* import com.intellij.openapi.project.Project /** @@ -35,16 +32,22 @@ class LogicalStructureAssembledModel private constructor( * The grouping element in each pair - Any - can be any object, for which a PresentationProvider is registered */ fun getChildrenGrouped(): List List>>> { - return LogicalStructureElementsProvider.getProviders(model!!) - .mapNotNull { provider -> - if (provider !is ContainerElementsProvider && provider !is PropertyElementProvider) return@mapNotNull null - val children = { - provider.getElements(model) - .map { LogicalStructureAssembledModel(project, it, this) } + val result = mutableListOf List>>>() + for (provider in LogicalStructureElementsProvider.getProviders(model!!)) { + if (provider !is ContainerElementsProvider && provider !is PropertyElementProvider) continue + if (provider is ContainerGroupedElementsProvider<*, *, *>) { + for (groupedElement in (provider as ContainerGroupedElementsProvider).getGroupedElements(model)) { + result.add(Pair(groupedElement.key!!) { groupedElement.value.map { LogicalStructureAssembledModel(project, it, this) } }) } - Pair(provider, children) + continue } - .toList() + val children = { + provider.getElements(model) + .map { LogicalStructureAssembledModel(project, it, this) } + } + result.add(Pair(provider, children)) + } + return result } override fun equals(other: Any?): Boolean {