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 {