1
1
package cc.unitmesh.devti.language.compiler.exec
2
2
3
+ import cc.unitmesh.devti.devin.InsCommand
4
+ import cc.unitmesh.devti.devin.dataprovider.BuiltinCommand
5
+ import cc.unitmesh.devti.language.utils.lookupFile
6
+ import com.intellij.ide.structureView.StructureView
7
+ import com.intellij.ide.structureView.StructureViewTreeElement
8
+ import com.intellij.lang.LanguageStructureViewBuilder
3
9
import com.intellij.openapi.application.ApplicationManager
4
10
import com.intellij.openapi.application.runReadAction
5
11
import com.intellij.openapi.diagnostic.logger
12
+ import com.intellij.openapi.fileEditor.FileEditorManager
6
13
import com.intellij.openapi.project.Project
7
14
import com.intellij.openapi.vfs.VirtualFile
8
15
import com.intellij.psi.PsiFile
9
16
import com.intellij.psi.PsiManager
10
17
import kotlinx.coroutines.Dispatchers
11
18
import kotlinx.coroutines.withContext
12
- import cc.unitmesh.devti.language.utils.lookupFile
13
- import cc.unitmesh.devti.context.FileContextProvider
14
- import cc.unitmesh.devti.devin.InsCommand
15
- import cc.unitmesh.devti.devin.dataprovider.BuiltinCommand
19
+
16
20
17
21
class StructureInCommand (val myProject : Project , val prop : String ) : InsCommand {
18
22
override val commandName: BuiltinCommand = BuiltinCommand .STRUCTURE
@@ -33,9 +37,38 @@ class StructureInCommand(val myProject: Project, val prop: String) : InsCommand
33
37
}.get()
34
38
} ? : return null
35
39
36
- return FileContextProvider ().from(psiFile)?.let {
37
- return it?.format()
40
+ return getFileStructure(myProject, virtualFile, psiFile)
41
+ }
42
+
43
+ fun getFileStructure (project : Project , file : VirtualFile , psiFile : PsiFile ): String {
44
+ val openFile = FileEditorManager .getInstance(myProject).openFile(file, true )
45
+ val fileEditor = openFile.firstOrNull() ? : return " No FileEditor found."
46
+
47
+ val factory = LanguageStructureViewBuilder .INSTANCE .forLanguage(psiFile.language)
48
+
49
+ if (factory != null ) {
50
+ val view: StructureView = factory.getStructureViewBuilder(psiFile)!!
51
+ .createStructureView(fileEditor, project)
52
+
53
+ val root: StructureViewTreeElement = view.treeModel.root
54
+ return traverseStructure(root, 0 , StringBuilder ()).toString()
38
55
}
56
+
57
+ return " No StructureViewModel found."
58
+ }
59
+
60
+ private fun traverseStructure (element : StructureViewTreeElement , depth : Int , sb : StringBuilder ): StringBuilder {
61
+ val indent = " " .repeat(depth)
62
+ // / todo: add element line
63
+ sb.append(indent).append(element.presentation.presentableText).append(" \n " )
64
+
65
+ for (child in element.children) {
66
+ if (child is StructureViewTreeElement ) {
67
+ traverseStructure(child, depth + 1 , sb)
68
+ }
69
+ }
70
+
71
+ return sb
39
72
}
40
73
41
74
fun file (project : Project , path : String ): VirtualFile ? {
0 commit comments