testUtils.sbt (53 lines of code) (raw):
import sbt.internal.util.complete.Parsers.spaceDelimited
/**
* ''NOTE'': Modify `src/sbt-test/kotlin/kotlin-x.y-compat/src/main/kotlin/demo/simple.kt` file to actually test compatibility.
*/
lazy val generateCompatTestSkeleton = inputKey[Unit]("Generates a compatibility test skeleton for a given Kotlin version (x.y or x.y.z).")
generateCompatTestSkeleton := {
val log = streams.value.log
val versionRegex = "^(\\d+\\.\\d+)(\\.\\d+)?$".r
spaceDelimited("<arg>").parsed.headOption match {
case Some(versionRegex(version, patch)) =>
val fullVersion = version + Option(patch).getOrElse(".0")
log.info(s"Generating compatibility test skeleton for Kotlin $version ($fullVersion)")
val baseDir = (Compile / baseDirectory).value / "src" / "sbt-test" / "kotlin" / s"kotlin-$version-compat"
IO.write(baseDir / "build.sbt",
s"""import kotlin.Keys._
|
|kotlinLib("stdlib")
|
|kotlinVersion := "$fullVersion"
|
|val listClasses = taskKey[Unit]("listClasses")
|
|listClasses := {
| val classes = (Compile / classDirectory).value.listFiles()
| streams.value.log.info("classes: " + classes.mkString("Array(", ", ", ")"))
|}
|""".stripMargin)
IO.write(baseDir / "test",
"""> compile
|> listClasses
|$ exists target/scala-2.12/classes/demo/SimpleKt.class
|$ exists target/scala-2.12/classes/SimpleScript.class
|""".stripMargin)
IO.write(baseDir / "project" / "plugins.sbt",
// Note: `s` interpolator is needed to print multiline string correctly
s"""sys.props.get("plugin.version") match {
| case Some(version) => addSbtPlugin("org.jetbrains.scala" % "sbt-kotlin-plugin" % version)
| case _ => sys.error(
| ""\"The system property 'plugin.version' is not defined.
| |Specify this property using the scriptedLaunchOpts -Dplugin.version.""\".stripMargin)
|}
|""".stripMargin)
val baseSourceDir = baseDir / "src" / "main" / "kotlin"
IO.write(baseSourceDir / "demo" / "simple.kt",
s"""package demo
|
|fun main(args: Array<String>) {
| // Test some Kotlin $version features
|}
|""".stripMargin)
IO.write(baseSourceDir / "SimpleScript.kts",
s"""println("Hello world!")
|""".stripMargin)
log.info(s"Generated test directory: $baseDir")
case _ => log.error("no version. examples are 1.8 or 1.8.22")
}
}