1+ package org.c3lang.intellij
2+
3+ import com.intellij.codeInsight.daemon.LineMarkerInfo
4+ import com.intellij.codeInsight.daemon.LineMarkerProvider
5+ import com.intellij.execution.RunManager
6+ import com.intellij.execution.configurations.ConfigurationTypeUtil
7+ import com.intellij.execution.executors.DefaultRunExecutor
8+ import com.intellij.execution.runners.ExecutionEnvironmentBuilder
9+ import com.intellij.icons.AllIcons
10+ import com.intellij.openapi.editor.markup.GutterIconRenderer
11+ import com.intellij.openapi.project.Project
12+ import com.intellij.psi.PsiElement
13+ import org.c3lang.intellij.psi.C3FuncDefinition
14+
15+ class C3LineMarkerProvider : LineMarkerProvider
16+ {
17+ override fun getLineMarkerInfo (element : PsiElement ): LineMarkerInfo <* >?
18+ {
19+ if (element !is C3FuncDefinition ) return null
20+
21+ val type = element.funcDef.funcHeader.optionalType.type.text
22+ val name = element.funcDef.fqName.name
23+
24+ if (name != " main" ) return null
25+ if (type !in listOf (" int" , " void" )) return null
26+
27+ return LineMarkerInfo (
28+ element,
29+ element.textRange,
30+ AllIcons .Actions .Execute ,
31+ { " Run main" },
32+ { _, elt -> createAndRunCustomConfig(elt.project) },
33+ GutterIconRenderer .Alignment .RIGHT ,
34+ { " Click to open context menu" }
35+ )
36+ }
37+
38+ private fun createAndRunCustomConfig (project : Project )
39+ {
40+ val runManager = RunManager .getInstance(project)
41+ val configType = ConfigurationTypeUtil .findConfigurationType(C3BuildRunConfigurationType ::class .java)
42+ val factory = configType.configurationFactories.first()
43+ val uniqueName = " main"
44+ val settings = runManager.createConfiguration(uniqueName, factory)
45+ val config = settings.configuration as C3BuildRunConfiguration
46+
47+ config.workingDirectory = project.basePath
48+ config.args = " "
49+
50+ runManager.addConfiguration(settings)
51+ runManager.selectedConfiguration = settings
52+
53+ val executor = DefaultRunExecutor .getRunExecutorInstance()
54+ val environment = ExecutionEnvironmentBuilder .create(executor, settings).build()
55+
56+ environment.runner.execute(environment)
57+ }
58+ }
0 commit comments