Skip to content

Commit

Permalink
feat(devins-language): add DevInsRunListener for handling run events #…
Browse files Browse the repository at this point in the history
…100

Add DevInsRunListener to handle run finish events in DevInsProgramRunner and DevInsRunConfigurationProfileState.

The `DevInsRunListener` interface is added to handle run finish events in `DevInsProgramRunner` and `DevInsRunConfigurationProfileState`. This listener will allow for better control and handling of events related to program execution.
  • Loading branch information
phodal committed Mar 21, 2024
1 parent 2fc3b52 commit e4b4aef
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 10 deletions.
@@ -1,21 +1,26 @@
package cc.unitmesh.devti.language.run

import cc.unitmesh.devti.language.status.DevInsRunListener
import com.intellij.execution.configurations.RunProfile
import com.intellij.execution.configurations.RunProfileState
import com.intellij.execution.configurations.RunnerSettings
import com.intellij.execution.process.ProcessEvent
import com.intellij.execution.runners.ExecutionEnvironment
import com.intellij.execution.runners.GenericProgramRunner
import com.intellij.execution.runners.showRunContent
import com.intellij.execution.ui.RunContentDescriptor
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.fileEditor.FileDocumentManager
import java.util.concurrent.atomic.AtomicReference

open class DevInsProgramRunner : GenericProgramRunner<RunnerSettings>() {
class DevInsProgramRunner : GenericProgramRunner<RunnerSettings>(), Disposable {
companion object {
const val RUNNER_ID: String = "DevInsProgramRunner"
}

private val connection = ApplicationManager.getApplication().messageBus.connect(this)

override fun getRunnerId(): String = RUNNER_ID

override fun canRun(executorId: String, profile: RunProfile) = profile is DevInsConfiguration
Expand All @@ -26,11 +31,21 @@ open class DevInsProgramRunner : GenericProgramRunner<RunnerSettings>() {
val result = AtomicReference<RunContentDescriptor>()
FileDocumentManager.getInstance().saveAllDocuments()

connection.subscribe(DevInsRunListener.TOPIC, object : DevInsRunListener {
override fun runFinish(string: String, event: ProcessEvent) {
// println("runFinish: $string")
// println("event: $event")
// todo: handle for runFinish
}
})

ApplicationManager.getApplication().invokeAndWait {
val showRunContent = showRunContent(state.execute(environment.executor, this), environment)
result.set(showRunContent)
}

return result.get()
}

override fun dispose() {}
}
Expand Up @@ -4,6 +4,7 @@ import cc.unitmesh.devti.agent.CustomAgentExecutor
import cc.unitmesh.devti.agent.model.CustomAgentConfig
import cc.unitmesh.devti.language.compiler.DevInsCompiler
import cc.unitmesh.devti.language.psi.DevInFile
import cc.unitmesh.devti.language.status.DevInsRunListener
import cc.unitmesh.devti.llms.LLMProvider
import cc.unitmesh.devti.llms.LlmFactory
import cc.unitmesh.devti.util.LLMCoroutineScope
Expand All @@ -14,7 +15,6 @@ import com.intellij.execution.ExecutionResult
import com.intellij.execution.Executor
import com.intellij.execution.configurations.RunProfileState
import com.intellij.execution.console.ConsoleViewWrapperBase
import com.intellij.execution.filters.Filter
import com.intellij.execution.impl.ConsoleViewImpl
import com.intellij.execution.process.ProcessAdapter
import com.intellij.execution.process.ProcessEvent
Expand All @@ -26,18 +26,14 @@ import com.intellij.openapi.actionSystem.ActionManager
import com.intellij.openapi.actionSystem.DefaultActionGroup
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Key
import com.intellij.openapi.vcs.changes.Change
import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.psi.PsiManager
import com.intellij.ui.components.panels.NonOpaquePanel
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.future.await
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import java.awt.BorderLayout
import java.io.OutputStream
import java.util.concurrent.CompletableFuture
import javax.swing.JComponent

open class DevInsRunConfigurationProfileState(
Expand All @@ -50,13 +46,12 @@ open class DevInsRunConfigurationProfileState(
val processHandler: ProcessHandler = createProcessHandler(configuration.name)
ProcessTerminatedListener.attach(processHandler)

val future = CompletableFuture<String>()
val sb = StringBuilder()

processHandler.addProcessListener(object : ProcessAdapter() {
override fun onTextAvailable(event: ProcessEvent, outputType: Key<*>) {
// evet done
// Dispatch Event here
override fun onTextAvailable(event: ProcessEvent, outputType: com.intellij.openapi.util.Key<*>) {
ApplicationManager.getApplication().messageBus
.syncPublisher(DevInsRunListener.TOPIC).runFinish(sb.toString(), event)
}
})

Expand Down
@@ -0,0 +1,17 @@
package cc.unitmesh.devti.language.status

import com.intellij.execution.process.ProcessEvent
import com.intellij.util.messages.Topic
import java.util.*

@FunctionalInterface
interface DevInsRunListener : EventListener {
fun runFinish(string: String, event: ProcessEvent)

companion object {
@Topic.AppLevel
val TOPIC: Topic<DevInsRunListener> = Topic(
DevInsRunListener::class.java, Topic.BroadcastDirection.TO_DIRECT_CHILDREN
)
}
}

0 comments on commit e4b4aef

Please sign in to comment.