Skip to content

Commit 6e9efac

Browse files
committed
feat(devin-lang): add AutoDevRunConfigurationProducer and related classes #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.
1 parent 035a3cb commit 6e9efac

File tree

7 files changed

+127
-30
lines changed

7 files changed

+127
-30
lines changed

exts/devin-lang/src/main/kotlin/cc/unitmesh/devti/language/actions/DevInRunFileAction.kt

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
11
package cc.unitmesh.devti.language.actions
22

3-
import cc.unitmesh.devti.AutoDevNotifications
3+
import cc.unitmesh.devti.language.psi.DevInFile
4+
import cc.unitmesh.devti.language.run.AutoDevConfiguration
5+
import cc.unitmesh.devti.language.run.AutoDevConfigurationFactory
6+
import cc.unitmesh.devti.language.run.AutoDevConfigurationType
7+
import cc.unitmesh.devti.language.run.AutoDevRunConfigurationProducer
8+
import com.intellij.execution.ExecutionManager
49
import com.intellij.execution.actions.ConfigurationContext
10+
import com.intellij.execution.actions.RunConfigurationProducer
11+
import com.intellij.execution.executors.DefaultRunExecutor
12+
import com.intellij.execution.runners.ExecutionEnvironmentBuilder
513
import com.intellij.openapi.actionSystem.ActionUpdateThread
614
import com.intellij.openapi.actionSystem.AnActionEvent
715
import com.intellij.openapi.actionSystem.CommonDataKeys
@@ -13,6 +21,7 @@ class DevInRunFileAction : DumbAwareAction() {
1321

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

30-
AutoDevNotifications.notify(project, "Run file action")
39+
val configProducer = RunConfigurationProducer.getInstance(
40+
AutoDevRunConfigurationProducer::class.java
41+
)
42+
43+
val configurationSettings = configProducer.findExistingConfiguration(context)
44+
val runConfiguration = if (configurationSettings == null) {
45+
val configurationFactory = AutoDevConfigurationFactory(AutoDevConfigurationType.getInstance())
46+
val runConfiguration = configurationFactory.createTemplateConfiguration(project) as AutoDevConfiguration
47+
runConfiguration.name = "Run DevIn file: ${virtualFile.name}"
48+
runConfiguration
49+
} else {
50+
configurationSettings.configuration as AutoDevConfiguration
51+
}
52+
53+
val builder =
54+
ExecutionEnvironmentBuilder.createOrNull(DefaultRunExecutor.getRunExecutorInstance(), runConfiguration)
55+
if (builder != null) {
56+
ExecutionManager.getInstance(project).restartRunProfile(builder.build())
57+
}
58+
3159
}
3260

3361
companion object {
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package cc.unitmesh.devti.language.run
2+
3+
import cc.unitmesh.devti.AutoDevIcons
4+
import com.intellij.execution.Executor
5+
import com.intellij.execution.configurations.RunConfiguration
6+
import com.intellij.execution.configurations.RunConfigurationBase
7+
import com.intellij.execution.configurations.RunProfileState
8+
import com.intellij.execution.runners.ExecutionEnvironment
9+
import com.intellij.openapi.options.SettingsEditor
10+
import com.intellij.openapi.project.Project
11+
import com.intellij.ui.dsl.builder.panel
12+
import javax.swing.Icon
13+
import javax.swing.JComponent
14+
15+
class AutoDevConfiguration(project: Project, name: String, factory: AutoDevConfigurationFactory) :
16+
RunConfigurationBase<AutoDevConfigurationOptions>(project, factory, name) {
17+
override fun getIcon(): Icon = AutoDevIcons.AI_COPILOT
18+
19+
override fun getState(executor: Executor, environment: ExecutionEnvironment): RunProfileState? {
20+
return null
21+
}
22+
23+
override fun clone(): RunConfiguration {
24+
return super.clone() as AutoDevConfiguration
25+
}
26+
27+
override fun getConfigurationEditor(): SettingsEditor<out RunConfiguration> {
28+
return AutoDevSettingsEditor(project)
29+
}
30+
}
31+
32+
class AutoDevSettingsEditor(project: Project) : SettingsEditor<AutoDevConfiguration>() {
33+
override fun createEditor(): JComponent = panel {
34+
35+
}
36+
37+
override fun resetEditorFrom(configuration: AutoDevConfiguration) {
38+
}
39+
40+
override fun applyEditorTo(configuration: AutoDevConfiguration) {
41+
}
42+
}

exts/devin-lang/src/main/kotlin/cc/unitmesh/devti/language/run/AutoDevConfigurationType.kt

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,13 @@ package cc.unitmesh.devti.language.run
22

33
import cc.unitmesh.devti.AutoDevBundle
44
import cc.unitmesh.devti.AutoDevIcons
5-
import com.intellij.execution.Executor
65
import com.intellij.execution.configurations.*
7-
import com.intellij.execution.runners.ExecutionEnvironment
86
import com.intellij.openapi.components.BaseState
9-
import com.intellij.openapi.options.SettingsEditor
107
import com.intellij.openapi.project.Project
11-
import javax.swing.Icon
128

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

3935
companion object {
40-
const val ID: String = "AutoCRUDRunConfiguration"
41-
}
42-
}
43-
44-
class AutoDevConfiguration(project: Project, name: String, factory: AutoDevConfigurationFactory) :
45-
RunConfigurationBase<AutoDevConfigurationOptions>(project, factory, name) {
46-
override fun getIcon(): Icon = AutoDevIcons.AI_COPILOT
47-
48-
override fun getState(executor: Executor, environment: ExecutionEnvironment): RunProfileState? {
49-
TODO("Not yet implemented")
50-
}
51-
52-
override fun clone(): RunConfiguration {
53-
TODO("Not yet implemented")
54-
}
55-
56-
override fun getConfigurationEditor(): SettingsEditor<out RunConfiguration> {
57-
TODO("Not yet implemented")
36+
const val ID: String = "AutoDevRunConfiguration"
5837
}
5938
}
6039

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package cc.unitmesh.devti.language.run
2+
3+
import cc.unitmesh.devti.language.psi.DevInFile
4+
import com.intellij.execution.actions.ConfigurationContext
5+
import com.intellij.execution.actions.LazyRunConfigurationProducer
6+
import com.intellij.openapi.util.Ref
7+
import com.intellij.psi.PsiElement
8+
9+
class AutoDevRunConfigurationProducer : LazyRunConfigurationProducer<AutoDevConfiguration>() {
10+
override fun getConfigurationFactory(): AutoDevConfigurationFactory {
11+
return AutoDevConfigurationFactory(AutoDevConfigurationType.getInstance())
12+
}
13+
14+
override fun setupConfigurationFromContext(
15+
configuration: AutoDevConfiguration,
16+
context: ConfigurationContext,
17+
sourceElement: Ref<PsiElement>,
18+
): Boolean {
19+
val psiFile = sourceElement.get().containingFile as? DevInFile ?: return false
20+
val virtualFile = psiFile.virtualFile ?: return false
21+
22+
configuration.name = "Run DevIn file: ${virtualFile.name}"
23+
24+
return true
25+
}
26+
27+
override fun isConfigurationFromContext(
28+
configuration: AutoDevConfiguration,
29+
context: ConfigurationContext,
30+
): Boolean {
31+
val psiLocation = context.psiLocation ?: return false
32+
val psiFile = psiLocation.containingFile as? DevInFile ?: return false
33+
val virtualFile = psiFile.virtualFile ?: return false
34+
35+
return configuration.name == "Run DevIn file: ${virtualFile.name}"
36+
}
37+
38+
}

exts/devin-lang/src/main/kotlin/cc/unitmesh/devti/language/run/DevInRunLineMarkersProvider.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package cc.unitmesh.devti.language.run
22

3+
import cc.unitmesh.devti.AutoDevBundle
34
import cc.unitmesh.devti.language.DevInLanguage
45
import cc.unitmesh.devti.language.actions.DevInRunFileAction
56
import cc.unitmesh.devti.language.psi.DevInFile
67
import com.intellij.execution.lineMarker.RunLineMarkerContributor
78
import com.intellij.icons.AllIcons
89
import com.intellij.openapi.actionSystem.ActionManager
910
import com.intellij.openapi.actionSystem.AnAction
11+
import com.intellij.openapi.util.text.StringUtil
1012
import com.intellij.psi.PsiElement
13+
import com.intellij.util.containers.ContainerUtil
1114

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

2124
return Info(
22-
AllIcons.RunConfigurations.TestState.Run, { "Run DevIn file: ${psiFile.name}" }, *actions
23-
)
25+
AllIcons.RunConfigurations.TestState.Run,
26+
actions
27+
) { psiElement: PsiElement ->
28+
StringUtil.join(
29+
ContainerUtil.mapNotNull<AnAction, String>(actions) {
30+
AutoDevBundle.message("line.marker.run.0", psiElement.containingFile.name)
31+
}, "\n"
32+
)
33+
}
2434
}
2535
}

exts/devin-lang/src/main/resources/cc.unitmesh.devti.language.xml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,8 @@
3232

3333
<runLineMarkerContributor language="DevIn"
3434
implementationClass="cc.unitmesh.devti.language.run.DevInRunLineMarkersProvider"/>
35-
36-
<!-- <configurationType implementation="cc.unitmesh.devti.language.run.AutoDevConfigurationType"/>-->
37-
<!-- <programRunner implementation="cc.unitmesh.devti.language.run.DevInCommandRunner"/>-->
35+
<runConfigurationProducer implementation="cc.unitmesh.devti.language.run.AutoDevRunConfigurationProducer"/>
36+
<configurationType implementation="cc.unitmesh.devti.language.run.AutoDevConfigurationType"/>
3837
</extensions>
3938

4039
<actions>

src/main/resources/messages/AutoDevBundle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,3 +148,4 @@ autoarkui.generate.clarify=Clarify Requirements
148148
autoarkui.generate.design=Design Page
149149
devin.ref.loading=Loading git revision
150150
line.marker.run.0=Run {0}
151+
autodev.devti=Create property

0 commit comments

Comments
 (0)