@@ -29,61 +29,85 @@ class MiseTomlFileStructureViewElement(
29
29
30
30
override fun getPresentation (): ItemPresentation = element.presentation ? : PresentationData ()
31
31
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
+ }
73
94
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
83
102
84
- override fun getChildren (): Array < out TreeElement > = children
103
+ override fun navigate ( requestFocus : Boolean ) = element.navigate(requestFocus)
85
104
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
88
112
}
89
113
}
0 commit comments