Scripting: support compiler plugins in hosted script compiler
Now the plugin-related compiler arguments are respected then used in the compiler configuration (only in the static part, not supported if set in a refinement callback) Note that the "embeddable" version of the plugin should be used if embeddable compiler is used. #KT-54095 fixed
This commit is contained in:
@@ -5,6 +5,8 @@ plugins {
|
||||
kotlin("jvm")
|
||||
}
|
||||
|
||||
val kotlinxSerializationGradlePluginClasspath by configurations.creating
|
||||
|
||||
dependencies {
|
||||
testApi(project(":kotlin-main-kts"))
|
||||
testCompileOnly(project(":compiler:cli"))
|
||||
@@ -13,6 +15,7 @@ dependencies {
|
||||
testApi(commonDependency("junit"))
|
||||
testApi(projectTests(":kotlin-scripting-compiler")) { isTransitive = false }
|
||||
testImplementation(project(":kotlin-compiler-embeddable"))
|
||||
kotlinxSerializationGradlePluginClasspath(project(":kotlin-serialization")) { isTransitive = false }
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
@@ -21,7 +24,11 @@ sourceSets {
|
||||
}
|
||||
|
||||
projectTest(parallel = true) {
|
||||
dependsOn(":dist")
|
||||
dependsOn(":dist", ":kotlin-serialization:jar")
|
||||
val localKotlinxSerializationPluginClasspath: FileCollection = kotlinxSerializationGradlePluginClasspath
|
||||
doFirst {
|
||||
systemProperty("kotlin.script.test.kotlinx.serialization.plugin.classpath", localKotlinxSerializationPluginClasspath.asPath)
|
||||
}
|
||||
workingDir = rootDir
|
||||
}
|
||||
|
||||
|
||||
+51
-16
@@ -5,15 +5,17 @@
|
||||
package org.jetbrains.kotlin.mainKts.test
|
||||
|
||||
import org.jetbrains.kotlin.mainKts.COMPILED_SCRIPTS_CACHE_DIR_PROPERTY
|
||||
import org.jetbrains.kotlin.mainKts.impl.Directories
|
||||
import org.jetbrains.kotlin.mainKts.MainKtsScript
|
||||
import org.jetbrains.kotlin.mainKts.SCRIPT_FILE_LOCATION_DEFAULT_VARIABLE_NAME
|
||||
import org.jetbrains.kotlin.mainKts.impl.Directories
|
||||
import org.jetbrains.kotlin.scripting.compiler.plugin.assertTrue
|
||||
import org.junit.Assert
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Ignore
|
||||
import org.junit.Test
|
||||
import java.io.*
|
||||
import java.io.ByteArrayOutputStream
|
||||
import java.io.File
|
||||
import java.io.PrintStream
|
||||
import java.util.*
|
||||
import kotlin.script.experimental.api.*
|
||||
import kotlin.script.experimental.host.toScriptSource
|
||||
@@ -24,21 +26,31 @@ import kotlin.script.experimental.jvmhost.createJvmScriptDefinitionFromTemplate
|
||||
|
||||
fun evalFile(scriptFile: File, cacheDir: File? = null): ResultWithDiagnostics<EvaluationResult> =
|
||||
withProperty(COMPILED_SCRIPTS_CACHE_DIR_PROPERTY, cacheDir?.absolutePath ?: "") {
|
||||
val scriptDefinition = createJvmScriptDefinitionFromTemplate<MainKtsScript>(
|
||||
evaluation = {
|
||||
jvm {
|
||||
baseClassLoader(null)
|
||||
}
|
||||
constructorArgs(emptyArray<String>())
|
||||
enableScriptsInstancesSharing()
|
||||
}
|
||||
)
|
||||
|
||||
BasicJvmScriptingHost().eval(
|
||||
scriptFile.toScriptSource(), scriptDefinition.compilationConfiguration, scriptDefinition.evaluationConfiguration
|
||||
)
|
||||
evalFileWithConfigurations(scriptFile)
|
||||
}
|
||||
|
||||
fun evalFileWithConfigurations(
|
||||
scriptFile: File,
|
||||
compilation: ScriptCompilationConfiguration.Builder.() -> Unit = {},
|
||||
evaluation: ScriptEvaluationConfiguration.Builder.() -> Unit = {}
|
||||
): ResultWithDiagnostics<EvaluationResult> {
|
||||
val scriptDefinition = createJvmScriptDefinitionFromTemplate<MainKtsScript>(
|
||||
compilation = compilation,
|
||||
evaluation = {
|
||||
evaluation()
|
||||
jvm {
|
||||
baseClassLoader(null)
|
||||
}
|
||||
constructorArgs(emptyArray<String>())
|
||||
enableScriptsInstancesSharing()
|
||||
}
|
||||
)
|
||||
|
||||
return BasicJvmScriptingHost().eval(
|
||||
scriptFile.toScriptSource(), scriptDefinition.compilationConfiguration, scriptDefinition.evaluationConfiguration
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
const val TEST_DATA_ROOT = "libraries/tools/kotlin-main-kts-test/testData"
|
||||
val OUT_FROM_IMPORT_TEST = listOf("Hi from common", "Hi from middle", "Hi from main", "sharedVar == 5")
|
||||
@@ -231,9 +243,32 @@ class MainKtsTest {
|
||||
assertSucceeded(res)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testHelloSerialization() {
|
||||
// the embeddable plugin is needed for this test, because embeddable compiler is used.
|
||||
// furtunately appropriate gradle plugin can serve as an embeddable compiler plugin now
|
||||
// so, the path to it is prepared in the build file
|
||||
val serializationPluginClasspath = System.getProperty("kotlin.script.test.kotlinx.serialization.plugin.classpath")!!
|
||||
val out = captureOut {
|
||||
val res = evalFileWithConfigurations(
|
||||
File("$TEST_DATA_ROOT/hello-kotlinx-serialization.main.kts"),
|
||||
compilation = {
|
||||
compilerOptions(
|
||||
"-Xplugin", serializationPluginClasspath
|
||||
)
|
||||
}
|
||||
)
|
||||
assertSucceeded(res)
|
||||
}.lines()
|
||||
assertEquals(
|
||||
listOf("""{"firstName":"James","lastName":"Bond"}""", "User(firstName=James, lastName=Bond)"),
|
||||
out
|
||||
)
|
||||
}
|
||||
|
||||
private fun assertSucceeded(res: ResultWithDiagnostics<EvaluationResult>) {
|
||||
Assert.assertTrue(
|
||||
"test failed:\n ${res.reports.joinToString("\n ") { it.message + if (it.exception == null) "" else ": ${it.exception}" }}",
|
||||
"test failed:\n ${res.reports.joinToString("\n ") { it.severity.name + ": " + it.message + if (it.exception == null) "" else ": ${it.exception}" }}",
|
||||
res is ResultWithDiagnostics.Success
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user