Skip to content

Commit 9967bce

Browse files
authored
Added LineMarkerProvider (#21)
* Added C3LineMarkerProvider - added line marker provider to run main from editor
1 parent 1de6610 commit 9967bce

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
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+
}

src/main/resources/META-INF/plugin.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@
7272
<newProjectWizard.languageGenerator implementation="org.c3lang.intellij.wizard.C3NewProjectWizard"/>
7373
<newProjectWizard.languageGenerator implementation="org.c3lang.intellij.wizard.C3NewLibraryWizard"/>
7474

75+
<codeInsight.lineMarkerProvider language="C3"
76+
implementationClass="org.c3lang.intellij.C3LineMarkerProvider" />
77+
7578
<!--<gotoDeclarationHandler implementation="org.c3lang.intellij.actions.C3GotoDeclarationHandler"/>-->
7679

7780
<lang.findUsagesProvider language="C3" implementationClass="org.c3lang.intellij.findUsages.C3FindUsagesProvider"/>

0 commit comments

Comments
 (0)