Skip to content

Commit 1b8b4e9

Browse files
committed
refactor(terminal): execute sketch code in coroutine scope
- Move code execution to coroutine scope to improve performance - Use PooledThreadExecutor for asynchronous execution - Update UI components in the EDT thread
1 parent f029612 commit 1b8b4e9

File tree

1 file changed

+37
-23
lines changed

1 file changed

+37
-23
lines changed

exts/ext-terminal/src/main/kotlin/cc/unitmesh/terminal/sketch/TerminalSketchProvider.kt

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import cc.unitmesh.devti.sketch.run.ProcessExecutor
88
import cc.unitmesh.devti.sketch.ui.ExtensionLangSketch
99
import cc.unitmesh.devti.sketch.ui.LanguageSketchProvider
1010
import cc.unitmesh.devti.sketch.ui.code.CodeHighlightSketch
11+
import cc.unitmesh.devti.util.AutoDevCoroutineScope
1112
import cc.unitmesh.devti.util.parser.CodeFence
1213
import com.intellij.icons.AllIcons
1314
import com.intellij.lang.Language
@@ -28,6 +29,9 @@ import com.intellij.ui.components.panels.VerticalLayout
2829
import com.intellij.ui.components.panels.Wrapper
2930
import com.intellij.util.ui.JBUI
3031
import com.intellij.util.ui.UIUtil
32+
import kotlinx.coroutines.asCoroutineDispatcher
33+
import kotlinx.coroutines.launch
34+
import org.jetbrains.ide.PooledThreadExecutor
3135
import org.jetbrains.plugins.terminal.LocalTerminalDirectRunner
3236
import java.awt.BorderLayout
3337
import java.awt.Dimension
@@ -66,10 +70,10 @@ class TerminalSketchProvider : LanguageSketchProvider {
6670
val resultPanel = JPanel(BorderLayout()).apply {
6771
add(resultSketch.getComponent(), BorderLayout.CENTER)
6872
}
69-
73+
7074
val isSingleLine = content.lines().filter { it.trim().isNotEmpty() }.size <= 1
7175
val collapsibleCodePanel = CollapsiblePanel("Shell Code", codePanel, initiallyCollapsed = isSingleLine)
72-
76+
7377
val collapsibleResultPanel = CollapsiblePanel("Execution Results", resultPanel, initiallyCollapsed = true)
7478

7579
val toolbarPanel = JPanel(BorderLayout()).apply {
@@ -91,7 +95,7 @@ class TerminalSketchProvider : LanguageSketchProvider {
9195

9296
codeSketch.getComponent().border = JBUI.Borders.empty()
9397
resultSketch.getComponent().border = JBUI.Borders.empty()
94-
98+
9599
mainPanel = object : JPanel(VerticalLayout(JBUI.scale(0))) {
96100
init {
97101
add(toolbarWrapper)
@@ -109,24 +113,31 @@ class TerminalSketchProvider : LanguageSketchProvider {
109113
val executeAction = object :
110114
AnAction("Execute", AutoDevBundle.message("sketch.terminal.execute"), AllIcons.Actions.Execute) {
111115
override fun actionPerformed(e: AnActionEvent) {
112-
val runResult = ProcessExecutor(project).executeCode(getViewText())
113-
ApplicationManager.getApplication().invokeLater {
114-
val resultText = if (runResult.exitCode != 0) {
115-
"${runResult.stdOutput}\n${runResult.errOutput}".trim()
116-
} else {
117-
runResult.stdOutput
118-
}
119-
120-
resultSketch.updateViewText(resultText, true)
121-
122-
if (collapsibleResultPanel.isCollapsed()) {
123-
collapsibleResultPanel.expand()
124-
}
125-
126-
if (runResult.exitCode != 0) {
127-
collapsibleResultPanel.setTitle("Execution Results (Error: ${runResult.exitCode})")
128-
} else {
129-
collapsibleResultPanel.setTitle("Execution Results")
116+
AutoDevCoroutineScope.scope(project).launch {
117+
val executor = ProcessExecutor(project)
118+
val runResult = executor.executeCode(
119+
getViewText(),
120+
PooledThreadExecutor.INSTANCE.asCoroutineDispatcher()
121+
)
122+
123+
ApplicationManager.getApplication().invokeLater {
124+
val resultText = if (runResult.exitCode != 0) {
125+
"${runResult.stdOutput}\n${runResult.errOutput}".trim()
126+
} else {
127+
runResult.stdOutput
128+
}
129+
130+
resultSketch.updateViewText(resultText, true)
131+
132+
if (collapsibleResultPanel.isCollapsed()) {
133+
collapsibleResultPanel.expand()
134+
}
135+
136+
if (runResult.exitCode != 0) {
137+
collapsibleResultPanel.setTitle("Execution Results (Error: ${runResult.exitCode})")
138+
} else {
139+
collapsibleResultPanel.setTitle("Execution Results")
140+
}
130141
}
131142
}
132143
}
@@ -155,7 +166,11 @@ class TerminalSketchProvider : LanguageSketchProvider {
155166
}
156167

157168
val popupAction = object :
158-
AnAction("Popup", AutoDevBundle.message("sketch.terminal.popup"), AllIcons.Ide.External_link_arrow) {
169+
AnAction(
170+
"Popup",
171+
AutoDevBundle.message("sketch.terminal.popup"),
172+
AllIcons.Ide.External_link_arrow
173+
) {
159174
override fun displayTextInToolbar(): Boolean = true
160175

161176
override fun actionPerformed(e: AnActionEvent) {
@@ -239,4 +254,3 @@ class TerminalSketchProvider : LanguageSketchProvider {
239254
}
240255
}
241256
}
242-

0 commit comments

Comments
 (0)