Skip to content

Commit 044c6cd

Browse files
committed
feat(devin-lang): add support for script path configuration in run configurations #101
The commit introduces the ability to specify a script path when creating and editing run configurations for the DevInLanguage plugin. It includes changes to the DevInRunFileAction, AutoDevRunConfigurationProducer, AutoDevConfiguration, and DevInRunLineMarkersProvider classes to support this new feature. The script path is now stored in the run configuration and used to locate the script to be executed during runtime. Additionally, validation and error handling have been added to ensure that the specified script path is valid and exists.
1 parent 9244176 commit 044c6cd

File tree

5 files changed

+58
-23
lines changed

5 files changed

+58
-23
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ class DevInRunFileAction : DumbAwareAction() {
2828
}
2929

3030
override fun actionPerformed(e: AnActionEvent) {
31-
val file =
32-
e.getData(CommonDataKeys.PSI_FILE) ?: return
31+
val file = e.getData(CommonDataKeys.PSI_FILE) ?: return
3332

3433
val project = file.project
3534
val context = ConfigurationContext.getFromContext(e.dataContext, e.place)
@@ -46,6 +45,8 @@ class DevInRunFileAction : DumbAwareAction() {
4645
configurationSettings
4746
}.configuration as AutoDevConfiguration
4847

48+
runConfiguration.setScriptPath(file.virtualFile.path)
49+
4950
val builder =
5051
ExecutionEnvironmentBuilder.createOrNull(DefaultRunExecutor.getRunExecutorInstance(), runConfiguration)
5152
if (builder != null) {
Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,80 @@
11
package cc.unitmesh.devti.language.run
22

3+
import cc.unitmesh.devti.AutoDevBundle
34
import cc.unitmesh.devti.AutoDevIcons
5+
import cc.unitmesh.devti.runconfig.config.readString
6+
import cc.unitmesh.devti.runconfig.config.writeString
47
import com.intellij.execution.Executor
5-
import com.intellij.execution.configurations.ConfigurationFactory
6-
import com.intellij.execution.configurations.RunConfiguration
7-
import com.intellij.execution.configurations.RunConfigurationBase
8-
import com.intellij.execution.configurations.RunProfileState
8+
import com.intellij.execution.configurations.*
99
import com.intellij.execution.runners.ExecutionEnvironment
10+
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory
1011
import com.intellij.openapi.options.SettingsEditor
1112
import com.intellij.openapi.project.Project
13+
import com.intellij.openapi.ui.TextFieldWithBrowseButton
14+
import com.intellij.openapi.util.NlsSafe
15+
import com.intellij.openapi.util.io.FileUtil
1216
import com.intellij.ui.dsl.builder.panel
17+
import org.jdom.Element
18+
import org.jetbrains.annotations.NonNls
1319
import javax.swing.Icon
1420
import javax.swing.JComponent
1521

1622
class AutoDevConfiguration(project: Project, factory: ConfigurationFactory, name: String) :
17-
RunConfigurationBase<ConfigurationFactory>(project, factory, name) {
23+
LocatableConfigurationBase<ConfigurationFactory>(project, factory, name) {
1824
override fun getIcon(): Icon = AutoDevIcons.AI_COPILOT
25+
private var myScriptPath = ""
26+
private val SCRIPT_PATH_TAG: @NonNls String = "SCRIPT_PATH"
1927

20-
override fun getState(executor: Executor, environment: ExecutionEnvironment): RunProfileState? {
28+
override fun getState(executor: Executor, environment: ExecutionEnvironment): RunProfileState {
2129
return DevInRunConfigurationProfileState(project, this)
2230
}
2331

24-
override fun clone(): RunConfiguration {
25-
return super.clone() as AutoDevConfiguration
32+
override fun checkConfiguration() {
33+
if (!FileUtil.exists(myScriptPath)) {
34+
throw RuntimeConfigurationError(AutoDevBundle.message("devin.run.error.script.not.found"))
35+
}
36+
}
37+
38+
override fun writeExternal(element: Element) {
39+
super.writeExternal(element)
40+
element.writeString(SCRIPT_PATH_TAG, myScriptPath)
41+
}
42+
43+
override fun readExternal(element: Element) {
44+
super.readExternal(element)
45+
myScriptPath = element.readString(SCRIPT_PATH_TAG) ?: ""
2646
}
2747

2848
override fun getConfigurationEditor(): SettingsEditor<out RunConfiguration> {
2949
return AutoDevSettingsEditor(project)
3050
}
51+
52+
fun setScriptPath(scriptPath: String) {
53+
myScriptPath = scriptPath.trim { it <= ' ' }
54+
}
55+
56+
fun getScriptPath(): @NlsSafe String {
57+
return myScriptPath
58+
}
3159
}
3260

33-
class AutoDevSettingsEditor(project: Project) : SettingsEditor<AutoDevConfiguration>() {
34-
override fun createEditor(): JComponent = panel {
61+
class AutoDevSettingsEditor(val project: Project) : SettingsEditor<AutoDevConfiguration>() {
62+
private val myScriptSelector: TextFieldWithBrowseButton? = null
3563

64+
override fun createEditor(): JComponent = panel {
65+
myScriptSelector?.addBrowseFolderListener(
66+
AutoDevBundle.message("devin.label.choose.file"),
67+
"",
68+
project,
69+
FileChooserDescriptorFactory.createSingleFileDescriptor()
70+
)
3671
}
3772

3873
override fun resetEditorFrom(configuration: AutoDevConfiguration) {
74+
myScriptSelector!!.setText(configuration.getScriptPath())
3975
}
4076

4177
override fun applyEditorTo(configuration: AutoDevConfiguration) {
78+
configuration.setScriptPath(myScriptSelector!!.text)
4279
}
4380
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class AutoDevRunConfigurationProducer : LazyRunConfigurationProducer<AutoDevConf
2020
val virtualFile = psiFile.virtualFile ?: return false
2121

2222
configuration.name = virtualFile.presentableName
23+
configuration.setScriptPath(virtualFile.path)
2324
return true
2425
}
2526

@@ -30,8 +31,9 @@ class AutoDevRunConfigurationProducer : LazyRunConfigurationProducer<AutoDevConf
3031
val psiLocation = context.psiLocation ?: return false
3132
val psiFile = psiLocation.containingFile as? DevInFile ?: return false
3233
val virtualFile = psiFile.virtualFile ?: return false
34+
val scriptPath = configuration.getScriptPath() ?: return false
3335

34-
return true
36+
return virtualFile.path == scriptPath
3537
}
3638

3739
}

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

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@ import com.intellij.icons.AllIcons
99
import com.intellij.openapi.actionSystem.ActionManager
1010
import com.intellij.openapi.actionSystem.AnAction
1111
import com.intellij.openapi.project.DumbAware
12-
import com.intellij.openapi.util.text.StringUtil
1312
import com.intellij.psi.PsiElement
14-
import com.intellij.util.containers.ContainerUtil
1513

1614
class DevInRunLineMarkersProvider : RunLineMarkerContributor(), DumbAware {
1715
override fun getInfo(element: PsiElement): Info? {
@@ -24,13 +22,8 @@ class DevInRunLineMarkersProvider : RunLineMarkerContributor(), DumbAware {
2422

2523
return Info(
2624
AllIcons.RunConfigurations.TestState.Run,
27-
actions
28-
) { psiElement: PsiElement ->
29-
StringUtil.join(
30-
ContainerUtil.mapNotNull<AnAction, String>(actions) {
31-
AutoDevBundle.message("line.marker.run.0", psiElement.containingFile.name)
32-
}, "\n"
33-
)
34-
}
25+
{ AutoDevBundle.message("line.marker.run.0", psiFile.containingFile.name) },
26+
*actions
27+
)
3528
}
3629
}

src/main/resources/messages/AutoDevBundle.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,3 +149,5 @@ autoarkui.generate.design=Design Page
149149
devin.ref.loading=Loading git revision
150150
line.marker.run.0=Run {0}
151151
autodev.devti=Create property
152+
devin.label.choose.file=Choice DevIn File
153+
devin.run.error.script.not.found=Script Not Found

0 commit comments

Comments
 (0)