如何在IntelliJ插件中执行Kotlin代码?

我想要构建一个IntelliJ Idea插件,

  • 检测到某个Kotlin类出现在源代码文件(如SomeGraph )中
  • 如果存在这样的类,则执行代码并将结果显示在侧窗格中。

Kotlin代码作为低端DSL。

小样

例如,假设我有以下一段代码:

 val vertex1 = GraphElement() val vertex2 = GraphElement() fun main(args : Array<String>) { val myGraph = SomeGraph() // Initialize graph, add data to it myGraph.addEdge(vertex1, vertex2) // Now myGraph.toDot() will return a Graphviz dot diagram in text form } 

myGraph.toDot()将返回Graphviz点图的代码( digraph G {... )。

我的插件需要这个文本,让Dot渲染图形并显示图形。

技术上可行吗? 如果是的话,我怎样才能从一个IntelliJ插件执行一段Kotlin代码?

笔记:

  1. DSL文件不需要具有main功能。 如果它能让事情变得更容易,我可以改变SomeGraph创建的地方。

例如, 这将是上述DSL代码的完美替代方案:

 class SpecialCaseGraph : SomeGraph() { fun init() { val vertex1 = GraphElement() val vertex2 = GraphElement() myGraph.addEdge(vertex1, vertex2) } fun toDot():String { // Returns the Dot representation of the graph } } 
  1. PlantUML插件做了类似的事情。 与我想要做的唯一区别是,图必须基于所显示的代码生成(与将图描述语言转换为Dot代码的PlantUML相反)。

显示与PlantUML不同的图像

更新1(02.09.2017 19:53 MSK):

试图从Kotlin论坛中使用以下代码获取Kotlin的ScriptEngine

 ScriptEngineManager mgr = new ScriptEngineManager(); List<ScriptEngineFactory> factories = mgr.getEngineFactories(); for (ScriptEngineFactory factory : factories) { System.out.println("ScriptEngineFactory Info"); String engName = factory.getEngineName(); String engVersion = factory.getEngineVersion(); String langName = factory.getLanguageName(); String langVersion = factory.getLanguageVersion(); System.out.printf("\tScript Engine: %s (%s)%n", engName, engVersion); List<String> engNames = factory.getNames(); for(String name : engNames) { System.out.printf("\tEngine Alias: %s%n", name); } System.out.printf("\tLanguage: %s (%s)%n", langName, langVersion); } 

不幸的是,当我执行这个代码时,没有Kotlin引擎。

屏幕截图显示了我的插件中可用的脚本引擎