Skip to content

Commit 561d646

Browse files
committed
feat(structure): enhance file structure retrieval and presentation #309
Refactor `StructureInCommand` to improve the retrieval and presentation of file structures. Added a new method `getFileStructure` to handle file structure extraction and a helper method `traverseStructure` for formatting the structure tree. Removed redundant imports and cleaned up code in `VueRelatedClassProvider`.
1 parent fb9c427 commit 561d646

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

exts/devins-lang/src/main/kotlin/cc/unitmesh/devti/language/compiler/exec/StructureShireCommand.kt

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
package cc.unitmesh.devti.language.compiler.exec
22

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
39
import com.intellij.openapi.application.ApplicationManager
410
import com.intellij.openapi.application.runReadAction
511
import com.intellij.openapi.diagnostic.logger
12+
import com.intellij.openapi.fileEditor.FileEditorManager
613
import com.intellij.openapi.project.Project
714
import com.intellij.openapi.vfs.VirtualFile
815
import com.intellij.psi.PsiFile
916
import com.intellij.psi.PsiManager
1017
import kotlinx.coroutines.Dispatchers
1118
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+
1620

1721
class StructureInCommand(val myProject: Project, val prop: String) : InsCommand {
1822
override val commandName: BuiltinCommand = BuiltinCommand.STRUCTURE
@@ -33,9 +37,38 @@ class StructureInCommand(val myProject: Project, val prop: String) : InsCommand
3337
}.get()
3438
} ?: return null
3539

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()
3855
}
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
3972
}
4073

4174
fun file(project: Project, path: String): VirtualFile? {

exts/ext-vue/src/main/kotlin/cc/unitmesh/vue/provider/VueRelatedClassProvider.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import com.intellij.psi.PsiElement
1616
import com.intellij.psi.PsiFile
1717
import com.intellij.psi.impl.source.html.HtmlFileImpl
1818
import com.intellij.util.asSafely
19-
import com.intellij.webSymbols.SymbolKind
2019
import org.jetbrains.vuejs.index.findModule
2120
import org.jetbrains.vuejs.index.findScriptTag
2221
import org.jetbrains.vuejs.lang.html.VueFile
@@ -62,7 +61,6 @@ class VueRelatedClassProvider : RelatedClassesProvider {
6261

6362
logger<VueRelatedClassProvider>().info("imports: $localImports")
6463
println("imports: $localImports")
65-
/// resolve file in local
6664
return emptyList()
6765
}
6866

0 commit comments

Comments
 (0)