diff --git a/modules/cli/src/main/scala/scala/cli/commands/doc/Doc.scala b/modules/cli/src/main/scala/scala/cli/commands/doc/Doc.scala index aa7cc96898..e6a6b61435 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/doc/Doc.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/doc/Doc.scala @@ -273,8 +273,19 @@ object Doc extends ScalaCommand[DocOptions] with BuildCommandHelpers { .getOrElse(true) then defaultScaladocArgs(scalaParams.scalaVersion, javaVersion) else Nil + // scaladoc has its own `-scalajs` flag, but passing it on triggers JS backend + // codegen phases (e.g. JUnitBootstrappers) that crash on otherwise valid code + // (VirtusLab/scala-cli#3006). The doc content is platform-agnostic, so drop it. + val (scalaJsScalacOptions, otherScalacOptions) = builds.head.project.scalaCompiler + .map(_.scalacOptions).getOrElse(Nil) + .partition(_ == "-scalajs") + if scalaJsScalacOptions.nonEmpty then + logger.log( + s"Not passing ${scalaJsScalacOptions.mkString(", ")} to scaladoc, " + + "as it can cause it to crash on valid code (VirtusLab/scala-cli#3006)" + ) val args = baseArgs ++ - builds.head.project.scalaCompiler.map(_.scalacOptions).getOrElse(Nil) ++ + otherScalacOptions ++ extraArgs ++ defaultArgs ++ builds.map(_.output.toString) diff --git a/modules/integration/src/test/scala/scala/cli/integration/DocTestDefinitions.scala b/modules/integration/src/test/scala/scala/cli/integration/DocTestDefinitions.scala index ccfaa3f3e0..f80612d740 100644 --- a/modules/integration/src/test/scala/scala/cli/integration/DocTestDefinitions.scala +++ b/modules/integration/src/test/scala/scala/cli/integration/DocTestDefinitions.scala @@ -190,4 +190,26 @@ abstract class DocTestDefinitions } } } + + // `-scalajs` triggers JS codegen phases (e.g. JUnitBootstrappers) that crash on valid code + if (!actualScalaVersion.startsWith("2.")) + test("generate scala doc for a Scala.js project") { + val dest = os.rel / "doc-js" + TestInputs( + os.rel / "Hello.scala" -> + """/** Greeter. */ + |object Hello { + | def greet: String = "hi" + |} + |""".stripMargin + ).fromRoot { root => + os.proc(TestUtil.cli, "doc", extraOptions, "--js", ".", "-o", dest).call( + cwd = root, + stdin = os.Inherit, + stdout = os.Inherit + ) + expect(os.isDir(root / dest)) + expect(os.list(root / dest).exists(_.last.endsWith(".html"))) + } + } }