Skip to content

Commit

Permalink
Read CLI args in scripts execution
Browse files Browse the repository at this point in the history
Now it is poosible to run

```
echo "println(args)" > a.sc && scala-cli run ./a.sc -- foo bar
```

closes VirtusLab#157
  • Loading branch information
tpasternak committed Oct 4, 2021
1 parent 1ebc99d commit 46af204
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 159 deletions.
Empty file removed core
Empty file.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,25 +1,47 @@
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,
pkgName: Seq[Name],
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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
)
}

}
60 changes: 43 additions & 17 deletions modules/build/src/test/scala/scala/build/tests/BuildTests.scala
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
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.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._

class BuildTests extends munit.FunSuite {

Expand Down Expand Up @@ -59,7 +57,9 @@ class BuildTests extends munit.FunSuite {
if (checkResults) {
maybeBuild.orThrow.assertGeneratedEquals(
"simple.class",
"simple$.class"
"simple$.class",
"simple_sc.class",
"simple_sc$.class"
)
}
}
Expand All @@ -86,7 +86,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"
)
}
}
Expand All @@ -108,6 +111,8 @@ class BuildTests extends munit.FunSuite {
build.assertGeneratedEquals(
"simple.class",
"simple$.class",
"simple_sc.class",
"simple_sc$.class",
"META-INF/semanticdb/simple.sc.semanticdb"
)

Expand Down Expand Up @@ -137,6 +142,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"
)

Expand All @@ -160,7 +168,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"
)
}
}
Expand All @@ -178,7 +190,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"
)
}
}
Expand All @@ -199,7 +215,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"
)
}
}
Expand All @@ -215,7 +233,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"
)
}
}
Expand All @@ -231,7 +251,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"
)
}
}
Expand All @@ -249,7 +271,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"
)
}
}
Expand All @@ -267,7 +291,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"
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -713,6 +713,32 @@ 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 =>
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 {
Expand Down

0 comments on commit 46af204

Please sign in to comment.