https://kotlinlang.org logo
#scripting
Title
# scripting
z

zt

02/09/2023, 12:49 AM
is there a way to pass plugin options to a plugin? I want to do the following on the compose plugin that im compiling my script with
Copy code
compose {
    kotlinCompilerPlugin.set("androidx.compose.compiler:compiler:1.4.3-dev-k1.8.20-Beta-15b4f4328eb")
    kotlinCompilerPluginArgs.add("suppressKotlinVersionCompatibilityCheck=${rootProject.libs.versions.kotlin.get()}")
}
i

ilya.chernikov

02/09/2023, 10:05 AM
In the latest Kotlin versions, the scripting plugin accepts compiler plugin configuration via
kotlinc
CLI arguments (
-P
). But I guess you're talking about compiling scripts with Gradle, so, I'm not sure this will work. But you can try it by specifying
freeCompilerArgs
.
z

zt

02/09/2023, 6:16 PM
The former is what im trying to do. I'm not sure what I would pass to be able to set the compose compiler version
@ilya.chernikov does the plugin have to explicitly setup support for arguments? I'm not sure if the compose plugin will allow me to pass the compiler version like that
i

ilya.chernikov

02/10/2023, 7:34 AM
I'm a bit confused. Could you, please, tell, how are you compiling the script? In general, to be able to use a plugin you need to instruct the compiler to load the appropriate jar and then to pass the configuration to it. If the CLI compiler is used for scripts compilation, then the standard CLI args could be used for both (e.g.
-Xplugin
and
-P
). So in this case the plugin will be applied to the script the same way as to a regular Kotlin source file. There is a test in the Kotlin repo that can serve as a minimal example - https://github.com/JetBrains/kotlin/blob/master/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsIT.kt#L145 In case of gradle, the CLI compiler is used too, so the same CLI args should theoretically work, but gradle provides some configuration helpers, that may interfere with proper passing of the args. (Since compiling scripts with gradle and plugins is far from typical, so nobody usually tests this combination.) There is a third variant - using the embedded scripting host for compilation - and it should be handled a bit differently, but I guess this is not your case.
z

zt

02/10/2023, 5:51 PM
I have my own scripting host I made using the jvm-simple-script example and I pass the compiler arguments through the compilation configuration
Copy code
fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> {
    val scriptDefinition = createJvmScriptDefinitionFromTemplate<ComposableScript>(
        compilation = {
            compilerOptions(
                "-Xuse-k2",
                "-Xplugin=/home/nick/.local/share/gradle/caches/jars-9/b77f80709d6a9e24deb7ad7c0b9da20f/compose-gradle-plugin-1.3.0.jar"
            )
        }
    )

    return BasicJvmScriptingHost().eval(
        script = scriptFile.toScriptSource(),
        compilationConfiguration = scriptDefinition.compilationConfiguration,
        evaluationConfiguration = scriptDefinition.evaluationConfiguration
    )
}
Yet I dont get any error, it just stops running when it hits the compose code in my script
i

ilya.chernikov

02/13/2023, 10:49 AM
Well, K2 scripting is unfinished, and it may not work at all, so please try it without
-Xuse-k2
. In general, the plugins should work for embedded hosts too, see e.g. the test https://github.com/JetBrains/kotlin/blob/master/libraries/tools/kotlin-main-kts-test/test/org/jetbrains/kotlin/mainKts/test/mainKtsTest.kt#L247, but to be honest, I never tried it with compose, so there could be problems.
BTW, with k2 (LV 2..0 now) you need to use
-Xcompiler-plugin
cli option instead of
-Xplugin
. But it will not help with scripting for now.
20 Views