1+ package lechuck.intellij
2+
3+ import com.intellij.execution.ExecutionException
4+ import com.intellij.execution.ExecutorRegistry
5+ import com.intellij.execution.executors.DefaultRunExecutor
6+ import com.intellij.execution.runners.ExecutionEnvironmentBuilder
7+ import com.intellij.execution.impl.RunManagerImpl
8+ import com.intellij.openapi.actionSystem.AnAction
9+ import com.intellij.openapi.actionSystem.AnActionEvent
10+ import com.intellij.openapi.project.Project
11+ import com.intellij.psi.PsiElement
12+ import com.intellij.execution.lineMarker.RunLineMarkerContributor
13+ import com.intellij.icons.AllIcons
14+ import org.jetbrains.yaml.psi.YAMLKeyValue
15+ import org.jetbrains.yaml.psi.YAMLMapping
16+
17+ class TaskLineMarkerProvider : RunLineMarkerContributor () {
18+ companion object {
19+ val TASKFILE_PATTERN = Regex (" taskfile(?:\\ .dist)?\\ .ya?ml" , RegexOption .IGNORE_CASE )
20+ }
21+
22+ override fun getInfo (element : PsiElement ): Info ? {
23+ // Only process YAML files named: Taskfile.yml, taskfile.yml, Taskfile.yaml, taskfile.yaml,
24+ // Taskfile.dist.yml, taskfile.dist.yml, Taskfile.dist.yaml, taskfile.dist.yaml
25+ val file = element.containingFile
26+ if (! file.name.matches(TASKFILE_PATTERN )) {
27+ return null
28+ }
29+
30+ // We want to match only the key element of a task
31+ if (element.parent !is YAMLKeyValue ) {
32+ return null
33+ }
34+ val keyValue = element.parent as YAMLKeyValue
35+
36+ // Check if this key is directly under the tasks section
37+ val tasksSection = keyValue.parent?.parent
38+ if (tasksSection !is YAMLKeyValue || tasksSection.keyText != " tasks" ) {
39+ return null
40+ }
41+
42+ // Check if the value is a mapping (has child elements)
43+ if (keyValue.value !is YAMLMapping ) {
44+ return null
45+ }
46+
47+ // Check if we're on the key element itself
48+ if (element != keyValue.key) {
49+ return null
50+ }
51+
52+ // This is a task definition, create a run action
53+ val taskName = keyValue.keyText
54+ return Info (
55+ AllIcons .Actions .Execute ,
56+ { " Run Task: $taskName " },
57+ TaskRunAction (taskName, element.project, file.virtualFile.path)
58+ )
59+ }
60+
61+ private class TaskRunAction (
62+ private val taskName : String ,
63+ private val project : Project ,
64+ private val taskfilePath : String
65+ ) : AnAction() {
66+ override fun actionPerformed (e : AnActionEvent ) {
67+ val runManager = RunManagerImpl .getInstanceImpl(project)
68+ val configurationType = TaskRunConfigurationType ()
69+
70+ val configurationName = " Task: $taskName "
71+ val existingConfiguration = runManager.findConfigurationByName(configurationName)
72+
73+ val configuration = if (existingConfiguration != null ) {
74+ existingConfiguration
75+ } else {
76+ val factory = configurationType.configurationFactories[0 ]
77+ runManager.createConfiguration(configurationName, factory)
78+ }
79+
80+ val runConfig = configuration.configuration as TaskRunConfiguration
81+ runConfig.task = taskName
82+ runConfig.filename = taskfilePath
83+
84+ if (existingConfiguration == null ) {
85+ runManager.addConfiguration(configuration)
86+ }
87+
88+ runManager.selectedConfiguration = configuration
89+
90+ try {
91+ val executor = ExecutorRegistry .getInstance().getExecutorById(DefaultRunExecutor .EXECUTOR_ID )
92+ if (executor != null ) {
93+ ExecutionEnvironmentBuilder .create(executor, configuration)?.buildAndExecute()
94+ }
95+ } catch (ex: ExecutionException ) {
96+ ex.printStackTrace()
97+ }
98+ }
99+ }
100+ }
0 commit comments