Skip to content

Commit 429e2ee

Browse files
committed
feat(devti): generate domain dictionary and display in editor #358
- Create domain.csv file if it doesn't exist - Open file in editor and select text editor - Stream AI-generated content to the editor in real-time - Update editor content and scroll to the end as new content is generated
1 parent 1fbcf9d commit 429e2ee

File tree

1 file changed

+29
-9
lines changed

1 file changed

+29
-9
lines changed

core/src/main/kotlin/cc/unitmesh/devti/indexer/DomainDictGenerateAction.kt

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ import kotlinx.coroutines.flow.Flow
2323
import kotlinx.coroutines.flow.cancellable
2424
import kotlin.io.path.createDirectories
2525
import kotlin.io.path.exists
26+
import com.intellij.openapi.application.ApplicationManager
27+
import com.intellij.openapi.command.WriteCommandAction
28+
import com.intellij.openapi.fileEditor.FileEditorManager
29+
import com.intellij.openapi.fileEditor.FileEditor
30+
import com.intellij.openapi.editor.ScrollType
31+
import com.intellij.openapi.vfs.LocalFileSystem
2632

2733
class DomainDictGenerateAction : AnAction() {
2834
init {
@@ -47,21 +53,35 @@ class DomainDictGenerateAction : AnAction() {
4753

4854
logger<DomainDictGenerateAction>().debug("Prompt: $prompt")
4955

50-
val result = StringBuilder()
51-
val stream: Flow<String> = LlmFactory.create(project).stream(prompt, "")
52-
stream.cancellable().collect {
53-
result.append(it)
54-
}
55-
56-
val dict = result.toString()
57-
5856
val file = promptDir.resolve("domain.csv").toFile()
5957
if (!file.exists()) {
6058
file.createNewFile()
6159
}
6260

61+
val fileEditorManager = FileEditorManager.getInstance(project)
62+
var editors: Array<FileEditor> = emptyArray()
63+
ApplicationManager.getApplication().invokeAndWait {
64+
val virtualFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file)
65+
if (virtualFile != null) {
66+
editors = fileEditorManager.openFile(virtualFile, true)
67+
fileEditorManager.setSelectedEditor(virtualFile, "text-editor")
68+
}
69+
}
70+
71+
val editor = fileEditorManager.selectedTextEditor
72+
val stream: Flow<String> = LlmFactory.create(project).stream(prompt, "")
73+
val result = StringBuilder()
74+
75+
stream.cancellable().collect { chunk ->
76+
result.append(chunk)
77+
WriteCommandAction.writeCommandAction(project).compute<Any, RuntimeException> {
78+
editor?.document?.setText(result.toString())
79+
editor?.caretModel?.moveToOffset(editor?.document?.textLength ?: 0)
80+
editor?.scrollingModel?.scrollToCaret(ScrollType.RELATIVE)
81+
}
82+
}
83+
6384
AutoDevStatusService.notifyApplication(AutoDevStatus.Done)
64-
file.writeText(dict)
6585
} catch (e: Exception) {
6686
AutoDevStatusService.notifyApplication(AutoDevStatus.Error)
6787
e.printStackTrace()

0 commit comments

Comments
 (0)