如何在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代码?
笔记:
- 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 } }
- PlantUML插件做了类似的事情。 与我想要做的唯一区别是,图必须基于所显示的代码生成(与将图描述语言转换为Dot代码的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引擎。
- 为什么kotlin错误:val minT:Long = -9223372036854775808L //Long.MIN_VALUE
- 在IntelliJ IDEA中单击“运行”按钮时如何选择不同的模块?
- 安装kotlin后无法打开Android studio项目
- IntelliJ的想法,一次测试多个模块,只有一个模块的文物都包括在内
- 编译调用Kotlin中另一个扩展方法的扩展方法的错误
- kotlin未解决的KDoc链接,但IntelliJ不喜欢导入修复它
- 字符串资源提取kotlin在android studio?
- 查找Kotlin类的主构造函数的用法
- 运行在Kotlin中编写的Apache Tomcat servlet时出错