From 43a0ab84269dc545e6d145fbc9cf0dcf2f09c592 Mon Sep 17 00:00:00 2001 From: Piotr Chabelski Date: Thu, 20 Apr 2023 14:40:18 +0200 Subject: [PATCH] Support declaring test javaProps from the main scope --- .../preprocessing/ScalaPreprocessor.scala | 4 +-- .../scala/build/tests/DirectiveTests.scala | 13 +++++++ .../preprocessing/directives/JavaProps.scala | 34 ++++++++++++------- website/docs/reference/directives.md | 2 ++ .../reference/scala-command/directives.md | 2 ++ 5 files changed, 40 insertions(+), 15 deletions(-) diff --git a/modules/build/src/main/scala/scala/build/preprocessing/ScalaPreprocessor.scala b/modules/build/src/main/scala/scala/build/preprocessing/ScalaPreprocessor.scala index 478d82591d..5e49871dfe 100644 --- a/modules/build/src/main/scala/scala/build/preprocessing/ScalaPreprocessor.scala +++ b/modules/build/src/main/scala/scala/build/preprocessing/ScalaPreprocessor.scala @@ -67,7 +67,6 @@ case object ScalaPreprocessor extends Preprocessor { val usingDirectiveHandlers: Seq[DirectiveHandler[BuildOptions]] = Seq[DirectiveHandler[_ <: HasBuildOptions]]( directives.CustomJar.handler, - directives.JavaProps.handler, directives.JavaHome.handler, directives.Jvm.handler, directives.MainClass.handler, @@ -94,7 +93,8 @@ case object ScalaPreprocessor extends Preprocessor { Seq[DirectiveHandler[_ <: HasBuildOptionsWithRequirements]]( directives.Dependency.handler, directives.JavaOptions.handler, - directives.JavacOptions.handler + directives.JavacOptions.handler, + directives.JavaProps.handler ).map(_.mapE(_.buildOptionsWithRequirements)) val requireDirectiveHandlers: Seq[DirectiveHandler[BuildRequirements]] = diff --git a/modules/build/src/test/scala/scala/build/tests/DirectiveTests.scala b/modules/build/src/test/scala/scala/build/tests/DirectiveTests.scala index b4692b863b..b5fdcb8d3f 100644 --- a/modules/build/src/test/scala/scala/build/tests/DirectiveTests.scala +++ b/modules/build/src/test/scala/scala/build/tests/DirectiveTests.scala @@ -161,6 +161,19 @@ class DirectiveTests extends munit.FunSuite { expect(if isTestScope then hasTestJavaOpts else !hasTestJavaOpts) } } + test(s"resolve test scope javaProps correctly when building for ${scope.name} scope") { + withProjectFile(projectFileContent = + """//> using javaProp "foo=1" + |//> using test.javaProp "bar=2" + |//> using test.dep "org.scalameta::munit::0.7.29" + |""".stripMargin + ) { (build, isTestScope) => + val javaProps = build.options.javaOptions.javaOpts.toSeq.map(_.value.value) + expect(javaProps.contains("-Dfoo=1")) + val hasTestJavaProps = javaProps.contains("-Dbar=2") + expect(if isTestScope then hasTestJavaProps else !hasTestJavaProps) + } + } } } diff --git a/modules/directives/src/main/scala/scala/build/preprocessing/directives/JavaProps.scala b/modules/directives/src/main/scala/scala/build/preprocessing/directives/JavaProps.scala index 3622b67b51..befca8ab99 100644 --- a/modules/directives/src/main/scala/scala/build/preprocessing/directives/JavaProps.scala +++ b/modules/directives/src/main/scala/scala/build/preprocessing/directives/JavaProps.scala @@ -2,12 +2,14 @@ package scala.build.preprocessing.directives import scala.build.directives.* import scala.build.errors.BuildException -import scala.build.options.{BuildOptions, JavaOpt, ShadowingSeq} +import scala.build.options.{BuildOptions, JavaOpt, Scope, ShadowingSeq, WithBuildRequirements} +import scala.build.preprocessing.directives.JavaProps.buildOptions import scala.build.{Logger, Positioned, options} import scala.cli.commands.SpecificationLevel @DirectiveGroupName("Java properties") @DirectiveExamples("//> using javaProp \"foo1=bar\", \"foo2\"") +@DirectiveExamples("//> using test.javaProp \"foo3=bar\", \"foo4\"") @DirectiveUsage( "//> using javaProp _key=val_", """`//> using javaProp `_key=value_ @@ -15,14 +17,25 @@ import scala.cli.commands.SpecificationLevel ) @DirectiveDescription("Add Java properties") @DirectiveLevel(SpecificationLevel.MUST) -// format: off final case class JavaProps( @DirectiveName("javaProp") - javaProperty: List[Positioned[String]] = Nil -) extends HasBuildOptions { - // format: on - def buildOptions: Either[BuildException, BuildOptions] = { - val javaOpts = javaProperty.map { positioned => + javaProperty: List[Positioned[String]] = Nil, + @DirectiveName("test.javaProp") + testJavaProperty: List[Positioned[String]] = Nil +) extends HasBuildOptionsWithRequirements { + def buildOptionsWithRequirements + : Either[BuildException, List[WithBuildRequirements[BuildOptions]]] = + Right(List( + buildOptions(javaProperty).withEmptyRequirements, + buildOptions(testJavaProperty).withScopeRequirement(Scope.Test) + )) +} + +object JavaProps { + val handler: DirectiveHandler[JavaProps] = DirectiveHandler.derive + + def buildOptions(javaProperties: List[Positioned[String]]): BuildOptions = { + val javaOpts = javaProperties.map { positioned => positioned.map { v => v.split("=") match { case Array(k) => JavaOpt(s"-D$k") @@ -30,15 +43,10 @@ final case class JavaProps( } } } - val buildOpt = BuildOptions( + BuildOptions( javaOptions = options.JavaOptions( javaOpts = ShadowingSeq.from(javaOpts) ) ) - Right(buildOpt) } } - -object JavaProps { - val handler: DirectiveHandler[JavaProps] = DirectiveHandler.derive -} diff --git a/website/docs/reference/directives.md b/website/docs/reference/directives.md index b30ff8708f..26cbfa5f26 100644 --- a/website/docs/reference/directives.md +++ b/website/docs/reference/directives.md @@ -107,6 +107,8 @@ Add Java properties #### Examples `//> using javaProp "foo1=bar", "foo2"` +`//> using test.javaProp "foo3=bar", "foo4"` + ### Javac options Add Javac options which will be passed when compiling sources. diff --git a/website/docs/reference/scala-command/directives.md b/website/docs/reference/scala-command/directives.md index 8e4ca8c573..0479a32ff8 100644 --- a/website/docs/reference/scala-command/directives.md +++ b/website/docs/reference/scala-command/directives.md @@ -69,6 +69,8 @@ Add Java properties #### Examples `//> using javaProp "foo1=bar", "foo2"` +`//> using test.javaProp "foo3=bar", "foo4"` + ### Main class Specify default main class