All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scala.build.internal.ClassCodeWrapper.scala Maven / Gradle / Ivy

package scala.build.internal

/** Script code wrapper that solves problem of deadlocks when using threads. The code is placed in a
  * class instance constructor, the created object is kept in 'mainObjectCode'.script to support
  * running interconnected scripts using Scala CLI 

Incompatible with Scala 2 - it uses * Scala 3 feature 'export'
Incompatible with native JS members - the wrapper is a class */ case object ClassCodeWrapper extends CodeWrapper { override def mainClassObject(className: Name): Name = Name(className.raw ++ "_sc") def apply( code: String, pkgName: Seq[Name], indexedWrapperName: Name, extraCode: String, scriptPath: String ) = { val name = mainClassObject(indexedWrapperName).backticked val wrapperClassName = Name(indexedWrapperName.raw ++ "$_").backticked val mainObjectCode = AmmUtil.normalizeNewlines(s"""|object $name { | private var args$$opt0 = Option.empty[Array[String]] | def args$$set(args: Array[String]): Unit = { | args$$opt0 = Some(args) | } | def args$$opt: Option[Array[String]] = args$$opt0 | def args$$: Array[String] = args$$opt.getOrElse { | sys.error("No arguments passed to this script") | } | | lazy val script = new $wrapperClassName | | def main(args: Array[String]): Unit = { | args$$set(args) | val _ = script.hashCode() // hashCode to clear scalac warning about pure expression in statement position | } |} | |export $name.script as `${indexedWrapperName.raw}` |""".stripMargin) val packageDirective = if (pkgName.isEmpty) "" else s"package ${AmmUtil.encodeScalaSourcePath(pkgName)}" + "\n" val top = AmmUtil.normalizeNewlines( s"""$packageDirective | |final class $wrapperClassName { |def args = $name.args$$ |def scriptPath = \"\"\"$scriptPath\"\"\" |""".stripMargin ) val bottom = AmmUtil.normalizeNewlines( s"""$extraCode |} | |$mainObjectCode |""".stripMargin ) (top, bottom) } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy