diff --git a/core b/core deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/modules/build/src/main/scala/scala/build/internal/CustomCodeWrapper.scala b/modules/build/src/main/scala/scala/build/internal/CustomCodeWrapper.scala index a027be1f89..b2c1306da7 100644 --- a/modules/build/src/main/scala/scala/build/internal/CustomCodeWrapper.scala +++ b/modules/build/src/main/scala/scala/build/internal/CustomCodeWrapper.scala @@ -1,6 +1,10 @@ package scala.build.internal case object CustomCodeWrapper extends CodeWrapper { + def mainClassObject(className: Name): Name = { + Name(className.raw ++ "_sc") + } + private val userCodeNestingLevel = 1 def apply( code: String, @@ -8,18 +12,36 @@ case object CustomCodeWrapper extends CodeWrapper { indexedWrapperName: Name, extraCode: String ) = { + val name = mainClassObject(indexedWrapperName).backticked + val mainObjectCode = s"""|object ${name} { + | private var argsOpt0 = Option.empty[Seq[String]] + | def setArgs(args: Seq[String]): Unit = { + | argsOpt0 = Some(args) + | } + | def argsOpt: Option[Seq[String]] = argsOpt0 + | def args: Seq[String] = argsOpt.getOrElse { + | sys.error("No arguments passed to this script") + | } + | def main(args: Array[String]): Unit = { + | setArgs(args) + | ${indexedWrapperName.raw} + | } + |} + |""".stripMargin + val packageDirective = if (pkgName.isEmpty) "" else s"package ${AmmUtil.encodeScalaSourcePath(pkgName)}" + "\n" // indentation is important in the generated code, so we don't want scalafmt to touch that // format: off val top = AmmUtil.normalizeNewlines(s"""$packageDirective - -object ${indexedWrapperName.backticked}{\n""" + |object ${indexedWrapperName.backticked}{\n + |""".stripMargin ) - val bottom = AmmUtil.normalizeNewlines(s"""\ndef main(args: _root_.scala.Array[String]) = {} + val bottom = AmmUtil.normalizeNewlines(s"""\ndef args = ${name}.args $extraCode } +$mainObjectCode """) // format: on diff --git a/modules/build/src/main/scala/scala/build/preprocessing/ScriptPreprocessor.scala b/modules/build/src/main/scala/scala/build/preprocessing/ScriptPreprocessor.scala index 3d9c84ce00..1133e110fe 100644 --- a/modules/build/src/main/scala/scala/build/preprocessing/ScriptPreprocessor.scala +++ b/modules/build/src/main/scala/scala/build/preprocessing/ScriptPreprocessor.scala @@ -4,7 +4,7 @@ import java.nio.charset.StandardCharsets import scala.build.EitherCps.{either, value} import scala.build.errors.BuildException -import scala.build.internal.{AmmUtil, CodeWrapper} +import scala.build.internal.{AmmUtil, CodeWrapper, CustomCodeWrapper, Name} import scala.build.options.{BuildOptions, BuildRequirements} import scala.build.{Inputs, Os} import scala.util.matching.Regex @@ -107,14 +107,13 @@ object ScriptPreprocessor { PreprocessedSource.InMemory( reportingPath, relPath, - code, + code + s"\n", topWrapperLen, Some(options), Some(requirements), scopedRequirements, - Some(className), + Some(CustomCodeWrapper.mainClassObject(Name(className)).backticked), scopePath ) } - } diff --git a/modules/build/src/test/scala/scala/build/tests/BuildTests.scala b/modules/build/src/test/scala/scala/build/tests/BuildTests.scala index a5104c5da0..5811529811 100644 --- a/modules/build/src/test/scala/scala/build/tests/BuildTests.scala +++ b/modules/build/src/test/scala/scala/build/tests/BuildTests.scala @@ -1,20 +1,20 @@ package scala.build.tests -import java.io.IOException - import ch.epfl.scala.bsp4j import com.eed3si9n.expecty.Expecty.expect +import java.io.IOException + +import scala.build.Ops._ +import scala.build.internal.Name import scala.build.blooprifle.BloopRifleConfig -import scala.build.{Bloop, Build, BuildThreads, Directories, Inputs} -import scala.build.options.{BuildOptions, ClassPathOptions, InternalOptions, ScalaOptions} +import scala.build.options.{BuildOptions, InternalOptions, ScalaOptions} +import scala.build.tastylib.TastyData import scala.build.tests.TestUtil._ +import scala.build.{Bloop, BuildThreads, Directories, LocalRepo, Logger} import scala.meta.internal.semanticdb.TextDocuments import scala.util.Properties -import scala.build.tastylib.TastyData -import scala.build.Logger -import scala.build.LocalRepo -import scala.build.Ops._ +import scala.build.internal.CustomCodeWrapper class BuildTests extends munit.FunSuite { @@ -59,7 +59,9 @@ class BuildTests extends munit.FunSuite { if (checkResults) { maybeBuild.orThrow.assertGeneratedEquals( "simple.class", - "simple$.class" + "simple$.class", + "simple.class", + "simple_sc$.class" ) } } @@ -86,7 +88,10 @@ class BuildTests extends munit.FunSuite { maybeBuild.orThrow.assertGeneratedEquals( "simple.class", "simple$.class", - "simple.tasty" + "simple.tasty", + "simple_sc.class", + "simple_sc$.class", + "simple_sc.tasty" ) } } @@ -108,6 +113,8 @@ class BuildTests extends munit.FunSuite { build.assertGeneratedEquals( "simple.class", "simple$.class", + "simple_sc.class", + "simple_sc$.class", "META-INF/semanticdb/simple.sc.semanticdb" ) @@ -137,6 +144,9 @@ class BuildTests extends munit.FunSuite { "simple.class", "simple$.class", "simple.tasty", + "simple_sc.class", + "simple_sc$.class", + "simple_sc.tasty", "META-INF/semanticdb/simple.sc.semanticdb" ) @@ -160,7 +170,11 @@ class BuildTests extends munit.FunSuite { "simple.class", "simple$.class", "simple.sjsir", - "simple$.sjsir" + "simple$.sjsir", + "simple_sc.class", + "simple_sc$.class", + "simple_sc.sjsir", + "simple_sc$.sjsir" ) } } @@ -178,7 +192,11 @@ class BuildTests extends munit.FunSuite { "simple.class", "simple$.class", // "simple.nir", // not sure why Scala Native doesn't generate this one. - "simple$.nir" + "simple$.nir", + "simple_sc.class", + "simple_sc$.class", + "simple_sc$.nir", + "simple_sc$$$Lambda$1.nir" ) } } @@ -199,7 +217,9 @@ class BuildTests extends munit.FunSuite { testInputs.withBuild(defaultOptions, buildThreads, bloopConfig) { (root, inputs, maybeBuild) => maybeBuild.orThrow.assertGeneratedEquals( "simple.class", - "simple$.class" + "simple$.class", + "simple_sc.class", + "simple_sc$.class" ) } } @@ -215,7 +235,9 @@ class BuildTests extends munit.FunSuite { testInputs.withBuild(defaultOptions, buildThreads, bloopConfig) { (root, inputs, maybeBuild) => maybeBuild.orThrow.assertGeneratedEquals( "simple.class", - "simple$.class" + "simple$.class", + "simple_sc.class", + "simple_sc$.class" ) } } @@ -231,7 +253,9 @@ class BuildTests extends munit.FunSuite { testInputs.withBuild(defaultOptions, buildThreads, bloopConfig) { (root, inputs, maybeBuild) => maybeBuild.orThrow.assertGeneratedEquals( "simple.class", - "simple$.class" + "simple$.class", + "simple_sc.class", + "simple_sc$.class" ) } } @@ -249,7 +273,9 @@ class BuildTests extends munit.FunSuite { testInputs.withBuild(defaultOptions, buildThreads, bloopConfig) { (root, inputs, maybeBuild) => maybeBuild.orThrow.assertGeneratedEquals( "simple.class", - "simple$.class" + "simple$.class", + "simple_sc.class", + "simple_sc$.class" ) } } @@ -267,7 +293,9 @@ class BuildTests extends munit.FunSuite { testInputs.withBuild(defaultOptions, buildThreads, bloopConfig) { (root, inputs, maybeBuild) => maybeBuild.orThrow.assertGeneratedEquals( "simple.class", - "simple$.class" + "simple$.class", + "simple_sc.class", + "simple_sc$.class" ) } } diff --git a/modules/integration/src/test/scala/scala/cli/integration/BspTestDefinitions.scala b/modules/integration/src/test/scala/scala/cli/integration/BspTestDefinitions.scala index 9e9ddd90e3..0bc5b81840 100644 --- a/modules/integration/src/test/scala/scala/cli/integration/BspTestDefinitions.scala +++ b/modules/integration/src/test/scala/scala/cli/integration/BspTestDefinitions.scala @@ -713,6 +713,35 @@ abstract class BspTestDefinitions(val scalaVersionOpt: Option[String]) } } } + + test("interconnection between scripts".only) { + val inputs = TestInputs( + Seq( + os.rel / "f.sc" -> "def f(x: String) = println(x + x + x)", + os.rel / "main0.sc" -> "f.f(args(0))" + ) + ) + inputs.fromRoot { root => + //todo remove --main-class option here + // todo handle --class-wrap=true + // todo test file of name `main.sc` (might conflict with name main) + val p = + os.proc(TestUtil.cli, "main0.sc", "f.sc", "--", "20").call(cwd = root, stdout = os.Pipe) + val res = p.out.text.trim + expect(res == "202020") + } + } + test("CLI args passed to script") { + val inputs = TestInputs( + Seq( + os.rel / "f.sc" -> "println(args(0))" + ) + ) + inputs.fromRoot { root => + val p = os.proc(TestUtil.cli, "f.sc", "--", "16").call(cwd = root, stdout = os.Pipe) + expect(p.out.text.trim == "16") + } + } } object BspTestDefinitions {