意为 kotlin compiler api wrapper,对 kotlin 编译器进行简单 (草率) 封装,使其能够快速从 String
源代码编译到 class 文件。
本项目核心内容包括两部分:
Analyzer
Compiler
在两者的配合下能够对源码进行解析、编译。两者都为工具类,由静态函数组成。
- Gradle
- Maven
- Bintray
您需要将其添加至 仓库和依赖 中。
repositories {
jcenter()
}
dependencies {
compile 'org.mechdancer:kotlinw:0.1.0'
}
<repositories>
<repository>
<id>jcenter</id>
<name>JCenter</name>
<url>https://jcenter.bintray.com/</url>
</repository>
</repositories>
<dependency>
<groupId>org.mechdancer</groupId>
<artifactId>kotlinw</artifactId>
<version>0.1.0</version>
<type>pom</type>
</dependency>
该工具类下有 parse
和 analyze
两个函数。
想要对一个 String
源码,首先要将其解析为 KtFile
实例。该函数接收字符串源码,并调用 PsiFileFactory
完成这项工作,将 KtFile
返回。
将源码解析到 KtFile
后,使用 AnalyzingUtils
和 TopDownAnalyzerFacadeForJVM
检查代码静态错误,将分析结果返回。
该工具类下有三个函数 compile
、writeToFile
、loadClasses
。
该函数会将参数传入的 KtFile
实例调用 Analyzer.analyze
,获得分析结果。在这之后创建 GenerationState
,并使用 KotlinCodegenFacade
进行编译,返回 GenerationState
,其中包含着编译结果。
该函数接收 GenerationState
编译结果和一个文件夹,将编译完成的类写入该文件夹。
该函数接收 GenerationState
编译结果,将编译完成的类使用内部类加载器加载,返回 List<Class<*>>
。
源码 (String
) -> KtFile
-> KtFile
+ AnalysisResult
-> GenerationState
-> Class
部分函数调用需要
KotlinCoreEnvironment
作为参数传入。它附带了一些编译信息和编译配置,只需使用EnvironmentUtil.createEnvironment()
创建一个即可。
val src = """
fun a() = run {
"ok"
}
""".trimIndent()
val environment = EnvironmentUtil.createEnvironment()
val ktFile = Analyzer.parse(src, environment)
val result = Compiler.compile(ktFile, environment)
val classes = Compiler.loadClasses(result)
classes[0].getMethod("a")(null).let(::println)
这样会在屏幕上打印 "ok"。您可以在 这里 找到完整代码。