Skip to content

Commit a40cb75

Browse files
committed
fix
1 parent 18f51f9 commit a40cb75

File tree

1 file changed

+77
-53
lines changed

1 file changed

+77
-53
lines changed

modules/core/src/main/kotlin/com/github/l34130/mise/core/lang/structure/MiseTomlFileStructureViewElement.kt

Lines changed: 77 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -29,61 +29,85 @@ class MiseTomlFileStructureViewElement(
2929

3030
override fun getPresentation(): ItemPresentation = element.presentation ?: PresentationData()
3131

32-
override fun getChildren(): Array<out TreeElement> {
33-
if (element !is TomlFile) return emptyArray()
34-
if (!MiseTomlFile.isMiseTomlFile(element.project, element.virtualFile)) return emptyArray()
35-
36-
val tools =
37-
treeElement(file = element, name = "Tools") {
38-
val toolsTable =
39-
element.childrenOfType<TomlTable>().firstOrNull { it.header.key?.textMatches("tools") == true }
40-
?: return@treeElement emptyArray()
41-
42-
toolsTable.entries
43-
.mapNotNull {
44-
val keySegment = it.key.segments.firstOrNull() ?: return@mapNotNull null
45-
MiseTomlTableToolStructureViewElement(keySegment, it.value)
46-
}.toTypedArray()
47-
}
48-
49-
val tasks =
50-
treeElement(file = element, name = "Tasks") {
51-
MiseTomlTableTask
52-
.resolveAllFromTomlFile(element)
53-
.map { it.keySegment }
54-
.map { MiseTomlTableTaskStructureViewElement(it) }
55-
.toTypedArray()
56-
}
57-
58-
val envs =
59-
treeElement(file = element, name = "Environments") {
60-
val envTable =
61-
element.childrenOfType<TomlTable>().firstOrNull { it.header.key?.textMatches("env") == true }
62-
?: return@treeElement emptyArray()
63-
64-
envTable.entries
65-
.mapNotNull {
66-
val keySegment = it.key.segments.firstOrNull() ?: return@mapNotNull null
67-
MiseTomlTableEnvStructureViewElement(keySegment, it.value)
68-
}.toTypedArray()
69-
}
70-
71-
return arrayOf(tools, tasks, envs)
72-
}
32+
override fun getChildren(): Array<out TreeElement> = children
33+
34+
private val children =
35+
run {
36+
if (element !is TomlFile) return@run emptyArray()
37+
if (!MiseTomlFile.isMiseTomlFile(element.project, element.virtualFile)) return@run emptyArray()
38+
39+
val tools =
40+
element.childrenOfType<TomlTable>().firstOrNull { it.header.key?.textMatches("tools") == true }?.let { table ->
41+
GroupingStructureViewElement(
42+
element =
43+
table.header.key
44+
?.segments
45+
?.firstOrNull() ?: return@let null,
46+
name = "Tools",
47+
icon = null,
48+
children =
49+
table.entries
50+
.mapNotNull {
51+
val keySegment = it.key.segments.firstOrNull() ?: return@mapNotNull null
52+
MiseTomlTableToolStructureViewElement(keySegment, it.value)
53+
}.toTypedArray(),
54+
)
55+
}
56+
57+
val tasks =
58+
GroupingStructureViewElement(
59+
element = element,
60+
name = "Tasks",
61+
icon = null,
62+
children =
63+
run {
64+
MiseTomlTableTask
65+
.resolveAllFromTomlFile(element as TomlFile)
66+
.map { it.keySegment }
67+
.map { MiseTomlTableTaskStructureViewElement(it) }
68+
.toTypedArray()
69+
},
70+
)
71+
72+
val envs =
73+
element.childrenOfType<TomlTable>().firstOrNull { it.header.key?.textMatches("env") == true }?.let { table ->
74+
GroupingStructureViewElement(
75+
element =
76+
table.header.key
77+
?.segments
78+
?.firstOrNull() ?: return@let null,
79+
name = "Environments",
80+
icon = null,
81+
children =
82+
run {
83+
table.entries
84+
.mapNotNull {
85+
val keySegment = it.key.segments.firstOrNull() ?: return@mapNotNull null
86+
MiseTomlTableEnvStructureViewElement(keySegment, it.value)
87+
}.toTypedArray()
88+
},
89+
)
90+
}
91+
92+
listOfNotNull(tools, tasks, envs).toTypedArray()
93+
}
7394

74-
private fun treeElement(
75-
file: TomlFile,
76-
name: String,
77-
icon: Icon? = null,
78-
children: () -> Array<out TreeElement>,
79-
): StructureViewTreeElement {
80-
val children = children()
81-
return object : StructureViewTreeElement {
82-
override fun getPresentation(): ItemPresentation = PresentationData(name, null, icon, null)
95+
private class GroupingStructureViewElement(
96+
private val element: NavigatablePsiElement,
97+
private val name: String,
98+
private val icon: Icon? = null,
99+
private val children: Array<out TreeElement>,
100+
) : StructureViewTreeElement {
101+
override fun getValue() = element
83102

84-
override fun getChildren(): Array<out TreeElement> = children
103+
override fun navigate(requestFocus: Boolean) = element.navigate(requestFocus)
85104

86-
override fun getValue() = file
87-
}
105+
override fun canNavigate(): Boolean = element.canNavigate()
106+
107+
override fun canNavigateToSource(): Boolean = element.canNavigateToSource()
108+
109+
override fun getPresentation(): ItemPresentation = PresentationData(name, null, icon, null)
110+
111+
override fun getChildren(): Array<out TreeElement> = children
88112
}
89113
}

0 commit comments

Comments
 (0)