Skip to content

Commit

Permalink
feat(devin-lang): add AutoDevRunConfigurationProducer and related cla…
Browse files Browse the repository at this point in the history
…sses #101

Adds a new producer for AutoDev run configurations, along with necessary classes for setting up and editing these configurations. This includes the `AutoDevConfigurationType`, `AutoDevConfiguration`, `AutoDevRunConfigurationProducer`, and `AutoDevSettingsEditor`. The changes also involve modifications to the `DevInRunLineMarkersProvider` to provide run actions for DevIn files, and the addition of new strings to `AutoDevBundle.properties` for localization.
  • Loading branch information
phodal committed Mar 15, 2024
1 parent 035a3cb commit 6e9efac
Show file tree
Hide file tree
Showing 7 changed files with 127 additions and 30 deletions.
@@ -1,7 +1,15 @@
package cc.unitmesh.devti.language.actions

import cc.unitmesh.devti.AutoDevNotifications
import cc.unitmesh.devti.language.psi.DevInFile
import cc.unitmesh.devti.language.run.AutoDevConfiguration
import cc.unitmesh.devti.language.run.AutoDevConfigurationFactory
import cc.unitmesh.devti.language.run.AutoDevConfigurationType
import cc.unitmesh.devti.language.run.AutoDevRunConfigurationProducer
import com.intellij.execution.ExecutionManager
import com.intellij.execution.actions.ConfigurationContext
import com.intellij.execution.actions.RunConfigurationProducer
import com.intellij.execution.executors.DefaultRunExecutor
import com.intellij.execution.runners.ExecutionEnvironmentBuilder
import com.intellij.openapi.actionSystem.ActionUpdateThread
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.CommonDataKeys
Expand All @@ -13,6 +21,7 @@ class DevInRunFileAction : DumbAwareAction() {

override fun update(e: AnActionEvent) {
val file = e.getData(CommonDataKeys.PSI_FILE) ?: return
e.presentation.isEnabledAndVisible = file is DevInFile
if (e.presentation.text.isNullOrBlank()) {
e.presentation.text = "Run DevIn file: ${file.name}"
}
Expand All @@ -27,7 +36,26 @@ class DevInRunFileAction : DumbAwareAction() {
val project = file.project
val context = ConfigurationContext.getFromContext(e.dataContext, e.place)

AutoDevNotifications.notify(project, "Run file action")
val configProducer = RunConfigurationProducer.getInstance(
AutoDevRunConfigurationProducer::class.java
)

val configurationSettings = configProducer.findExistingConfiguration(context)
val runConfiguration = if (configurationSettings == null) {
val configurationFactory = AutoDevConfigurationFactory(AutoDevConfigurationType.getInstance())
val runConfiguration = configurationFactory.createTemplateConfiguration(project) as AutoDevConfiguration
runConfiguration.name = "Run DevIn file: ${virtualFile.name}"
runConfiguration
} else {
configurationSettings.configuration as AutoDevConfiguration
}

val builder =
ExecutionEnvironmentBuilder.createOrNull(DefaultRunExecutor.getRunExecutorInstance(), runConfiguration)
if (builder != null) {
ExecutionManager.getInstance(project).restartRunProfile(builder.build())
}

}

companion object {
Expand Down
@@ -0,0 +1,42 @@
package cc.unitmesh.devti.language.run

import cc.unitmesh.devti.AutoDevIcons
import com.intellij.execution.Executor
import com.intellij.execution.configurations.RunConfiguration
import com.intellij.execution.configurations.RunConfigurationBase
import com.intellij.execution.configurations.RunProfileState
import com.intellij.execution.runners.ExecutionEnvironment
import com.intellij.openapi.options.SettingsEditor
import com.intellij.openapi.project.Project
import com.intellij.ui.dsl.builder.panel
import javax.swing.Icon
import javax.swing.JComponent

class AutoDevConfiguration(project: Project, name: String, factory: AutoDevConfigurationFactory) :
RunConfigurationBase<AutoDevConfigurationOptions>(project, factory, name) {
override fun getIcon(): Icon = AutoDevIcons.AI_COPILOT

override fun getState(executor: Executor, environment: ExecutionEnvironment): RunProfileState? {
return null
}

override fun clone(): RunConfiguration {
return super.clone() as AutoDevConfiguration
}

override fun getConfigurationEditor(): SettingsEditor<out RunConfiguration> {
return AutoDevSettingsEditor(project)
}
}

class AutoDevSettingsEditor(project: Project) : SettingsEditor<AutoDevConfiguration>() {
override fun createEditor(): JComponent = panel {

}

override fun resetEditorFrom(configuration: AutoDevConfiguration) {
}

override fun applyEditorTo(configuration: AutoDevConfiguration) {
}
}
Expand Up @@ -2,17 +2,13 @@ package cc.unitmesh.devti.language.run

import cc.unitmesh.devti.AutoDevBundle
import cc.unitmesh.devti.AutoDevIcons
import com.intellij.execution.Executor
import com.intellij.execution.configurations.*
import com.intellij.execution.runners.ExecutionEnvironment
import com.intellij.openapi.components.BaseState
import com.intellij.openapi.options.SettingsEditor
import com.intellij.openapi.project.Project
import javax.swing.Icon

class AutoDevConfigurationType : ConfigurationTypeBase(
AutoDevConfigurationFactory.ID,
AutoDevBundle.message("autodev.crud"),
AutoDevBundle.message("autodev.devti"),
"AutoDev DevIn Language executor",
AutoDevIcons.AI_COPILOT
) {
Expand All @@ -37,24 +33,7 @@ class AutoDevConfigurationFactory(type: AutoDevConfigurationType) : Configuratio
override fun getOptionsClass(): Class<out BaseState?> = AutoDevConfigurationOptions::class.java

companion object {
const val ID: String = "AutoCRUDRunConfiguration"
}
}

class AutoDevConfiguration(project: Project, name: String, factory: AutoDevConfigurationFactory) :
RunConfigurationBase<AutoDevConfigurationOptions>(project, factory, name) {
override fun getIcon(): Icon = AutoDevIcons.AI_COPILOT

override fun getState(executor: Executor, environment: ExecutionEnvironment): RunProfileState? {
TODO("Not yet implemented")
}

override fun clone(): RunConfiguration {
TODO("Not yet implemented")
}

override fun getConfigurationEditor(): SettingsEditor<out RunConfiguration> {
TODO("Not yet implemented")
const val ID: String = "AutoDevRunConfiguration"
}
}

Expand Down
@@ -0,0 +1,38 @@
package cc.unitmesh.devti.language.run

import cc.unitmesh.devti.language.psi.DevInFile
import com.intellij.execution.actions.ConfigurationContext
import com.intellij.execution.actions.LazyRunConfigurationProducer
import com.intellij.openapi.util.Ref
import com.intellij.psi.PsiElement

class AutoDevRunConfigurationProducer : LazyRunConfigurationProducer<AutoDevConfiguration>() {
override fun getConfigurationFactory(): AutoDevConfigurationFactory {
return AutoDevConfigurationFactory(AutoDevConfigurationType.getInstance())
}

override fun setupConfigurationFromContext(
configuration: AutoDevConfiguration,
context: ConfigurationContext,
sourceElement: Ref<PsiElement>,
): Boolean {
val psiFile = sourceElement.get().containingFile as? DevInFile ?: return false
val virtualFile = psiFile.virtualFile ?: return false

configuration.name = "Run DevIn file: ${virtualFile.name}"

return true
}

override fun isConfigurationFromContext(
configuration: AutoDevConfiguration,
context: ConfigurationContext,
): Boolean {
val psiLocation = context.psiLocation ?: return false
val psiFile = psiLocation.containingFile as? DevInFile ?: return false
val virtualFile = psiFile.virtualFile ?: return false

return configuration.name == "Run DevIn file: ${virtualFile.name}"
}

}
@@ -1,13 +1,16 @@
package cc.unitmesh.devti.language.run

import cc.unitmesh.devti.AutoDevBundle
import cc.unitmesh.devti.language.DevInLanguage
import cc.unitmesh.devti.language.actions.DevInRunFileAction
import cc.unitmesh.devti.language.psi.DevInFile
import com.intellij.execution.lineMarker.RunLineMarkerContributor
import com.intellij.icons.AllIcons
import com.intellij.openapi.actionSystem.ActionManager
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.util.text.StringUtil
import com.intellij.psi.PsiElement
import com.intellij.util.containers.ContainerUtil

class DevInRunLineMarkersProvider : RunLineMarkerContributor() {
override fun getInfo(element: PsiElement): Info? {
Expand All @@ -19,7 +22,14 @@ class DevInRunLineMarkersProvider : RunLineMarkerContributor() {
val actions = arrayOf<AnAction>(ActionManager.getInstance().getAction(DevInRunFileAction.ID))

return Info(
AllIcons.RunConfigurations.TestState.Run, { "Run DevIn file: ${psiFile.name}" }, *actions
)
AllIcons.RunConfigurations.TestState.Run,
actions
) { psiElement: PsiElement ->
StringUtil.join(
ContainerUtil.mapNotNull<AnAction, String>(actions) {
AutoDevBundle.message("line.marker.run.0", psiElement.containingFile.name)
}, "\n"
)
}
}
}
Expand Up @@ -32,9 +32,8 @@

<runLineMarkerContributor language="DevIn"
implementationClass="cc.unitmesh.devti.language.run.DevInRunLineMarkersProvider"/>

<!-- <configurationType implementation="cc.unitmesh.devti.language.run.AutoDevConfigurationType"/>-->
<!-- <programRunner implementation="cc.unitmesh.devti.language.run.DevInCommandRunner"/>-->
<runConfigurationProducer implementation="cc.unitmesh.devti.language.run.AutoDevRunConfigurationProducer"/>
<configurationType implementation="cc.unitmesh.devti.language.run.AutoDevConfigurationType"/>
</extensions>

<actions>
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages/AutoDevBundle.properties
Expand Up @@ -148,3 +148,4 @@ autoarkui.generate.clarify=Clarify Requirements
autoarkui.generate.design=Design Page
devin.ref.loading=Loading git revision
line.marker.run.0=Run {0}
autodev.devti=Create property

0 comments on commit 6e9efac

Please sign in to comment.