diff --git a/modules/build/src/main/scala/scala/build/CrossSources.scala b/modules/build/src/main/scala/scala/build/CrossSources.scala index 362ad844ba..69cb83f7a0 100644 --- a/modules/build/src/main/scala/scala/build/CrossSources.scala +++ b/modules/build/src/main/scala/scala/build/CrossSources.scala @@ -153,6 +153,29 @@ object CrossSources { val preprocessedInputFromArgs = value(preprocessSources(inputs.flattened())) + val preprocessedWithUsingDirs = + preprocessedInputFromArgs.filter(p => p.options.exists(_ != BuildOptions.monoid.zero)) + + if (preprocessedWithUsingDirs.length > 1) + val projectFilePath = inputs.elements.projectSettingsFiles.headOption match + case Some(s) => s.path + case _ => inputs.workspace / "project.scala" + + preprocessedWithUsingDirs + .filter(p => os.Path(p.scopePath.path, os.root) != projectFilePath) + .foreach { file => + file.scopePath.root match + case Right(base: os.Path) => + val path = os.Path(file.scopePath.path, base) + val linesNumbers = os.read.lines(path).zipWithIndex + .filter((ln, _) => ln.startsWith("//> using")) + .map((_, idx) => idx + 1) + logger.diagnostic( + s"WARNING: using directives detected in $path [Ln: ${linesNumbers.mkString(", ")}]. It is recommended to keep them centralized in the $projectFilePath file." + ) + case _ => () + } + val sourcesFromDirectives = preprocessedInputFromArgs .flatMap(_.options) diff --git a/modules/integration/src/test/scala/scala/cli/integration/RunTestDefinitions.scala b/modules/integration/src/test/scala/scala/cli/integration/RunTestDefinitions.scala index b920801fc3..82e14f073b 100644 --- a/modules/integration/src/test/scala/scala/cli/integration/RunTestDefinitions.scala +++ b/modules/integration/src/test/scala/scala/cli/integration/RunTestDefinitions.scala @@ -683,6 +683,30 @@ abstract class RunTestDefinitions(val scalaVersionOpt: Option[String]) } } + test("multiple using directives warning message") { + val inputs = TestInputs( + os.rel / "Foo.scala" -> + s"""//> using scala "3.2.0" + | + |object Foo extends App { + | println("Foo") + |} + |""".stripMargin, + os.rel / "Bar.scala" -> "", + os.rel / "Hello.java" -> "//> using packaging.output \"out\"" + ) + inputs.fromRoot { root => + val warningMessage = "WARNING: using directives detected in" + val output1 = os.proc(TestUtil.cli, ".").call(cwd = root, stderr = os.Pipe).err.trim() + val output2 = os.proc(TestUtil.cli, "Foo.scala", "Bar.scala").call( + cwd = root, + stderr = os.Pipe + ).err.trim() + expect(output1.contains(warningMessage)) + expect(!output2.contains(warningMessage)) + } + } + def sudoTest(): Unit = { val fileName = "simple.sc" val message = "Hello"