-
Notifications
You must be signed in to change notification settings - Fork 51
/
Parser.kt
43 lines (37 loc) · 1.7 KB
/
Parser.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package kastree.ast.psi
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.com.intellij.openapi.util.Disposer
import org.jetbrains.kotlin.com.intellij.psi.PsiErrorElement
import org.jetbrains.kotlin.com.intellij.psi.PsiManager
import org.jetbrains.kotlin.com.intellij.testFramework.LightVirtualFile
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType
open class Parser(val converter: Converter = Converter) {
protected val proj by lazy {
KotlinCoreEnvironment.createForProduction(
Disposer.newDisposable(),
CompilerConfiguration(),
EnvironmentConfigFiles.JVM_CONFIG_FILES
).project
}
fun parseFile(code: String, throwOnError: Boolean = true) = converter.convertFile(parsePsiFile(code).also { file ->
if (throwOnError) file.collectDescendantsOfType<PsiErrorElement>().let {
if (it.isNotEmpty()) throw ParseError(file, it)
}
})
fun parsePsiFile(code: String) =
PsiManager.getInstance(proj).findFile(LightVirtualFile("temp.kt", KotlinFileType.INSTANCE, code)) as KtFile
data class ParseError(
val file: KtFile,
val errors: List<PsiErrorElement>
) : IllegalArgumentException("Failed with ${errors.size} errors, first: ${errors.first().errorDescription}")
companion object : Parser() {
init {
// To hide annoying warning on Windows
System.setProperty("idea.use.native.fs.for.win", "false")
}
}
}