From 585ed58461b79eaae01e6179664dd6f509647936 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Sun, 29 May 2022 21:10:02 +0000 Subject: [PATCH 01/14] Try re-enabling PluginCoverageScalaJsTest --- build.sbt | 5 ++++- .../src/test/scala/scoverage/PluginCoverageScalaJsTest.scala | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index 9dac23df..b8f49172 100644 --- a/build.sbt +++ b/build.sbt @@ -152,7 +152,10 @@ lazy val plugin = crossTarget := target.value / s"scala-${scalaVersion.value}", crossScalaVersions := bin212 ++ bin213, crossVersion := CrossVersion.full, - libraryDependencies += "org.scala-lang" % "scala-compiler" % scalaVersion.value % Provided, + libraryDependencies ++= Seq( + "org.scala-lang" % "scala-compiler" % scalaVersion.value % Provided, + "org.scala-js" %% "scalajs-compiler" % scalaJSVersion % Test cross CrossVersion.full + ), sharedSettings ) .settings( diff --git a/plugin/src/test/scala/scoverage/PluginCoverageScalaJsTest.scala b/plugin/src/test/scala/scoverage/PluginCoverageScalaJsTest.scala index a767202c..205d94ea 100644 --- a/plugin/src/test/scala/scoverage/PluginCoverageScalaJsTest.scala +++ b/plugin/src/test/scala/scoverage/PluginCoverageScalaJsTest.scala @@ -6,7 +6,7 @@ import munit.FunSuite */ class PluginCoverageScalaJsTest extends FunSuite with MacroSupport { - test("scoverage should ignore default undefined parameter".ignore) { + test("scoverage should ignore default undefined parameter") { val compiler = ScoverageCompiler.default compiler.compileCodeSnippet( """import scala.scalajs.js From 61be139ab8cf31a065a1593da1c5cd851e17c1ab Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 31 May 2022 05:32:23 +0000 Subject: [PATCH 02/14] ScoverageCompiler refactoring to support SJS --- build.sbt | 11 +++- .../scala/scoverage/ScoverageCompiler.scala | 60 +++++++++++++++---- project/plugins.sbt | 2 + 3 files changed, 62 insertions(+), 11 deletions(-) diff --git a/build.sbt b/build.sbt index b8f49172..a7d70cbd 100644 --- a/build.sbt +++ b/build.sbt @@ -161,7 +161,7 @@ lazy val plugin = .settings( Test / unmanagedSourceDirectories += (Test / sourceDirectory).value / "scala-2.12+" ) - .dependsOn(domain, reporter % "test->compile", serializer) + .dependsOn(domain, reporter % "test->compile", serializer, buildInfo % Test) lazy val reporter = project @@ -182,6 +182,15 @@ lazy val reporter = ) .dependsOn(domain, serializer) +lazy val buildInfo = + project + .settings( + buildInfoKeys += BuildInfoKey("scalaJSVersion", scalaJSVersion), + publishArtifact := false, + publishLocal := {} + ) + .enablePlugins(BuildInfoPlugin) + lazy val domain = project .settings( diff --git a/plugin/src/test/scala/scoverage/ScoverageCompiler.scala b/plugin/src/test/scala/scoverage/ScoverageCompiler.scala index 0bf79338..d37dcf8e 100644 --- a/plugin/src/test/scala/scoverage/ScoverageCompiler.scala +++ b/plugin/src/test/scala/scoverage/ScoverageCompiler.scala @@ -11,6 +11,7 @@ import scala.tools.nsc.plugins.PluginComponent import scala.tools.nsc.transform.Transform import scala.tools.nsc.transform.TypingTransformers +import buildinfo.BuildInfo import scoverage.reporter.IOUtils private[scoverage] object ScoverageCompiler { @@ -24,9 +25,17 @@ private[scoverage] object ScoverageCompiler { def classPath: Seq[String] = getScalaJars.map( _.getAbsolutePath - ) :+ sbtCompileDir.getAbsolutePath :+ runtimeClasses.getAbsolutePath + ) :+ sbtCompileDir.getAbsolutePath :+ runtimeClasses("jvm").getAbsolutePath - def settings: Settings = { + def jsClassPath: Seq[String] = + getScalaJsJars.map( + _.getAbsolutePath + ) :+ sbtCompileDir.getAbsolutePath :+ runtimeClasses("js").getAbsolutePath + + def settings: Settings = settings(classPath) + def jsSettings: Settings = settings(jsClassPath) + + def settings(classPath: Seq[String]): Settings = { val s = new scala.tools.nsc.Settings s.Xprint.value = List("all", "_") s.deprecation.value = true @@ -46,6 +55,11 @@ private[scoverage] object ScoverageCompiler { new ScoverageCompiler(settings, reporter) } + def defaultScalaJs: ScoverageCompiler = { + val reporter = new scala.tools.nsc.reporters.ConsoleReporter(jsSettings) + new ScoverageCompiler(jsSettings, reporter) + } + def locationCompiler: LocationCompiler = { val reporter = new scala.tools.nsc.reporters.ConsoleReporter(settings) new LocationCompiler(settings, reporter) @@ -56,6 +70,23 @@ private[scoverage] object ScoverageCompiler { scalaJars.map(findScalaJar) } + private def getScalaJsJars: List[File] = { + List( + findJar("org.scala-lang", "scala-compiler", ScalaVersion), + findJar("org.scala-lang", "scala-reflect", ScalaVersion), + findJar( + "org.scala-js", + s"scalajs-compiler_$ScalaVersion", + BuildInfo.scalaJSVersion + ), + findJar( + "org.scala-js", + s"scalajs-library_$ScalaVersion", + BuildInfo.scalaJSVersion + ) + ) + } + private def sbtCompileDir: File = { val dir = new File( s"./plugin/target/scala-$ScalaVersion/classes" @@ -67,20 +98,28 @@ private[scoverage] object ScoverageCompiler { dir } - private def runtimeClasses: File = new File( - s"./runtime/jvm/target/scala-$ScalaVersion/classes" + private def runtimeClasses(platform: String): File = new File( + s"./runtime/$platform/target/scala-$ScalaVersion/classes" ) private def findScalaJar(artifactId: String): File = - findIvyJar("org.scala-lang", artifactId, ScalaVersion) - .orElse(findCoursierJar(artifactId, ScalaVersion)) + findJar("org.scala-lang", artifactId, ScalaVersion) + + private def findJar( + groupId: String, + artifactId: String, + version: String + ): File = + findIvyJar(groupId, artifactId, version) + .orElse(findCoursierJar(groupId, artifactId, version)) .getOrElse { throw new FileNotFoundException( - s"Could not locate $artifactId/$ScalaVersion" + s"Could not locate $groupId:$artifactId:$version" ) } private def findCoursierJar( + groupId: String, artifactId: String, version: String ): Option[File] = { @@ -89,9 +128,10 @@ private[scoverage] object ScoverageCompiler { ".cache/coursier", // Linux "Library/Caches/Coursier", // MacOSX "AppData/Local/Coursier/cache" // Windows - ).map(loc => - s"$userHome/$loc/v1/https/repo1.maven.org/maven2/org/scala-lang/$artifactId/$version/$artifactId-$version.jar" - ) + ).map { loc => + val gid = groupId.replace('.', '/') + s"$userHome/$loc/v1/https/repo1.maven.org/maven2/$gid/$artifactId/$version/$artifactId-$version.jar" + } jarPaths.map(new File(_)).find(_.exists()) } diff --git a/project/plugins.sbt b/project/plugins.sbt index 54d4cc8d..f7e8a8e4 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -6,4 +6,6 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6") addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.9.33") +addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0") + libraryDependencies += "org.scala-js" %% "scalajs-env-jsdom-nodejs" % "1.1.0" From e5bbd1413e928eb0ccf49ad7d0ac0b72bc14b8c5 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 31 May 2022 06:12:19 +0000 Subject: [PATCH 03/14] Scala.js test is working again --- .../test/scala/scoverage/PluginCoverageScalaJsTest.scala | 2 +- plugin/src/test/scala/scoverage/ScoverageCompiler.scala | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/plugin/src/test/scala/scoverage/PluginCoverageScalaJsTest.scala b/plugin/src/test/scala/scoverage/PluginCoverageScalaJsTest.scala index 205d94ea..28376ea3 100644 --- a/plugin/src/test/scala/scoverage/PluginCoverageScalaJsTest.scala +++ b/plugin/src/test/scala/scoverage/PluginCoverageScalaJsTest.scala @@ -7,7 +7,7 @@ import munit.FunSuite class PluginCoverageScalaJsTest extends FunSuite with MacroSupport { test("scoverage should ignore default undefined parameter") { - val compiler = ScoverageCompiler.default + val compiler = ScoverageCompiler.defaultJS compiler.compileCodeSnippet( """import scala.scalajs.js | diff --git a/plugin/src/test/scala/scoverage/ScoverageCompiler.scala b/plugin/src/test/scala/scoverage/ScoverageCompiler.scala index d37dcf8e..c325c9a2 100644 --- a/plugin/src/test/scala/scoverage/ScoverageCompiler.scala +++ b/plugin/src/test/scala/scoverage/ScoverageCompiler.scala @@ -55,7 +55,7 @@ private[scoverage] object ScoverageCompiler { new ScoverageCompiler(settings, reporter) } - def defaultScalaJs: ScoverageCompiler = { + def defaultJS: ScoverageCompiler = { val reporter = new scala.tools.nsc.reporters.ConsoleReporter(jsSettings) new ScoverageCompiler(jsSettings, reporter) } @@ -71,9 +71,7 @@ private[scoverage] object ScoverageCompiler { } private def getScalaJsJars: List[File] = { - List( - findJar("org.scala-lang", "scala-compiler", ScalaVersion), - findJar("org.scala-lang", "scala-reflect", ScalaVersion), + getScalaJars ++ List( findJar( "org.scala-js", s"scalajs-compiler_$ScalaVersion", @@ -81,7 +79,7 @@ private[scoverage] object ScoverageCompiler { ), findJar( "org.scala-js", - s"scalajs-library_$ScalaVersion", + s"scalajs-library_$ShortScalaVersion", BuildInfo.scalaJSVersion ) ) From 8da1f0132236c44016018b8242d9eec06d266a7b Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 31 May 2022 06:14:21 +0000 Subject: [PATCH 04/14] Remove unneeded dep --- build.sbt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/build.sbt b/build.sbt index a7d70cbd..b0dbdbd3 100644 --- a/build.sbt +++ b/build.sbt @@ -152,10 +152,7 @@ lazy val plugin = crossTarget := target.value / s"scala-${scalaVersion.value}", crossScalaVersions := bin212 ++ bin213, crossVersion := CrossVersion.full, - libraryDependencies ++= Seq( - "org.scala-lang" % "scala-compiler" % scalaVersion.value % Provided, - "org.scala-js" %% "scalajs-compiler" % scalaJSVersion % Test cross CrossVersion.full - ), + libraryDependencies += "org.scala-lang" % "scala-compiler" % scalaVersion.value % Provided, sharedSettings ) .settings( From 66de56527e95969d09065e56b4f63b2c4f4b13a9 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 31 May 2022 07:06:18 +0000 Subject: [PATCH 05/14] Try adding buildInfo to root --- build.sbt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index b0dbdbd3..4c50cfb2 100644 --- a/build.sbt +++ b/build.sbt @@ -101,7 +101,8 @@ lazy val root = Project("scalac-scoverage", file(".")) runtimeJSDOMTest, reporter, domain, - serializer + serializer, + buildInfo ) lazy val runtime = CrossProject( From c13a0680da1ab6c2f42cfc8a0ba2c6723bbedb1f Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 31 May 2022 07:13:56 +0000 Subject: [PATCH 06/14] Set crossScalaVersions for buildinfo project --- build.sbt | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sbt b/build.sbt index 4c50cfb2..1fd94345 100644 --- a/build.sbt +++ b/build.sbt @@ -183,6 +183,7 @@ lazy val reporter = lazy val buildInfo = project .settings( + crossScalaVersions := bin212 ++ bin213, buildInfoKeys += BuildInfoKey("scalaJSVersion", scalaJSVersion), publishArtifact := false, publishLocal := {} From 0c69003ebedada1d67c31c396b7cdf82c47029fd Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 31 May 2022 07:20:53 +0000 Subject: [PATCH 07/14] Revert "Remove unneeded dep" This reverts commit 8da1f0132236c44016018b8242d9eec06d266a7b. --- build.sbt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 1fd94345..6a51d065 100644 --- a/build.sbt +++ b/build.sbt @@ -153,7 +153,10 @@ lazy val plugin = crossTarget := target.value / s"scala-${scalaVersion.value}", crossScalaVersions := bin212 ++ bin213, crossVersion := CrossVersion.full, - libraryDependencies += "org.scala-lang" % "scala-compiler" % scalaVersion.value % Provided, + libraryDependencies ++= Seq( + "org.scala-lang" % "scala-compiler" % scalaVersion.value % Provided, + "org.scala-js" %% "scalajs-compiler" % scalaJSVersion % Test cross CrossVersion.full + ), sharedSettings ) .settings( From 7b9212b05429715b811ab4af6bf5e6ab69d19cf4 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 31 May 2022 07:24:32 +0000 Subject: [PATCH 08/14] Add another sjs test dep --- build.sbt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 6a51d065..7e670ff5 100644 --- a/build.sbt +++ b/build.sbt @@ -155,7 +155,8 @@ lazy val plugin = crossVersion := CrossVersion.full, libraryDependencies ++= Seq( "org.scala-lang" % "scala-compiler" % scalaVersion.value % Provided, - "org.scala-js" %% "scalajs-compiler" % scalaJSVersion % Test cross CrossVersion.full + "org.scala-js" %% "scalajs-compiler" % scalaJSVersion % Test cross CrossVersion.full, + "org.scala-js" %% "scalajs-library" % scalaJSVersion % Test ), sharedSettings ) From d8d2a1c5fa5cb40819e139ef2b0144e2d288b90f Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 31 May 2022 07:38:32 +0000 Subject: [PATCH 09/14] plugin also depends on runtimeJS for tests --- build.sbt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 7e670ff5..ce49e7dc 100644 --- a/build.sbt +++ b/build.sbt @@ -147,7 +147,8 @@ lazy val runtimeJSDOMTest = lazy val plugin = project - .dependsOn(runtimeJVM % Test) + // we need both runtimes compiled prior to running tests + .dependsOn(runtimeJVM % Test, runtimeJS % Test) .settings( name := "scalac-scoverage-plugin", crossTarget := target.value / s"scala-${scalaVersion.value}", From aa833a490920bb1a1f24a65d297e55ea1f80ad5b Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 31 May 2022 09:03:44 +0000 Subject: [PATCH 10/14] Actually enable the sjs compiler plugin :) --- .../scala/scoverage/ScoverageCompiler.scala | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/plugin/src/test/scala/scoverage/ScoverageCompiler.scala b/plugin/src/test/scala/scoverage/ScoverageCompiler.scala index c325c9a2..f06aba2c 100644 --- a/plugin/src/test/scala/scoverage/ScoverageCompiler.scala +++ b/plugin/src/test/scala/scoverage/ScoverageCompiler.scala @@ -33,7 +33,12 @@ private[scoverage] object ScoverageCompiler { ) :+ sbtCompileDir.getAbsolutePath :+ runtimeClasses("js").getAbsolutePath def settings: Settings = settings(classPath) - def jsSettings: Settings = settings(jsClassPath) + + def jsSettings: Settings = { + val s = settings(jsClassPath) + s.plugin.value = List(getScalaJsCompilerJar.getAbsolutePath) + s + } def settings(classPath: Seq[String]): Settings = { val s = new scala.tools.nsc.Settings @@ -70,20 +75,18 @@ private[scoverage] object ScoverageCompiler { scalaJars.map(findScalaJar) } - private def getScalaJsJars: List[File] = { - getScalaJars ++ List( - findJar( - "org.scala-js", - s"scalajs-compiler_$ScalaVersion", - BuildInfo.scalaJSVersion - ), - findJar( - "org.scala-js", - s"scalajs-library_$ShortScalaVersion", - BuildInfo.scalaJSVersion - ) - ) - } + private def getScalaJsJars: List[File] = + findJar( + "org.scala-js", + s"scalajs-library_$ShortScalaVersion", + BuildInfo.scalaJSVersion + ) :: getScalaJars + + private def getScalaJsCompilerJar: File = findJar( + "org.scala-js", + s"scalajs-compiler_$ScalaVersion", + BuildInfo.scalaJSVersion + ) private def sbtCompileDir: File = { val dir = new File( From 09f3673d613a13427743f83f13b6642b65597ba8 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 31 May 2022 09:40:15 +0000 Subject: [PATCH 11/14] Fix expected measured statements 4 -> 2 --- plugin/src/test/scala/scoverage/PluginCoverageScalaJsTest.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/src/test/scala/scoverage/PluginCoverageScalaJsTest.scala b/plugin/src/test/scala/scoverage/PluginCoverageScalaJsTest.scala index 28376ea3..e4f94054 100644 --- a/plugin/src/test/scala/scoverage/PluginCoverageScalaJsTest.scala +++ b/plugin/src/test/scala/scoverage/PluginCoverageScalaJsTest.scala @@ -16,6 +16,6 @@ class PluginCoverageScalaJsTest extends FunSuite with MacroSupport { |}""".stripMargin ) assert(!compiler.reporter.hasErrors) - compiler.assertNMeasuredStatements(4) + compiler.assertNMeasuredStatements(2) } } From 695ce2d6a8af8ccd37782a71d3e0d77179e27202 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 31 May 2022 09:42:51 +0000 Subject: [PATCH 12/14] Only catch non-fatals --- plugin/src/main/scala/scoverage/ScoveragePlugin.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugin/src/main/scala/scoverage/ScoveragePlugin.scala b/plugin/src/main/scala/scoverage/ScoveragePlugin.scala index e11cbbe3..ff5b5c54 100644 --- a/plugin/src/main/scala/scoverage/ScoveragePlugin.scala +++ b/plugin/src/main/scala/scoverage/ScoveragePlugin.scala @@ -10,6 +10,7 @@ import scala.tools.nsc.plugins.Plugin import scala.tools.nsc.plugins.PluginComponent import scala.tools.nsc.transform.Transform import scala.tools.nsc.transform.TypingTransformers +import scala.util.control.NonFatal import scoverage.domain.Coverage import scoverage.domain.Statement @@ -102,7 +103,7 @@ class ScoverageInstrumentationComponent( try { rootMirror.getClassIfDefined("scala.scalajs.js.Any") != NoSymbol } catch { - case _: Throwable => false + case NonFatal(_) => false } } From 775828fc637a56fa8b3b4c772ed1735967ff4b42 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 31 May 2022 10:07:33 +0000 Subject: [PATCH 13/14] Make isScalaJsEnabled a lazy val --- plugin/src/main/scala/scoverage/ScoveragePlugin.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/src/main/scala/scoverage/ScoveragePlugin.scala b/plugin/src/main/scala/scoverage/ScoveragePlugin.scala index ff5b5c54..90235d7e 100644 --- a/plugin/src/main/scala/scoverage/ScoveragePlugin.scala +++ b/plugin/src/main/scala/scoverage/ScoveragePlugin.scala @@ -99,7 +99,7 @@ class ScoverageInstrumentationComponent( private var options: ScoverageOptions = ScoverageOptions.default() private var coverageFilter: CoverageFilter = AllCoverageFilter - private val isScalaJsEnabled: Boolean = { + private lazy val isScalaJsEnabled: Boolean = { try { rootMirror.getClassIfDefined("scala.scalajs.js.Any") != NoSymbol } catch { From 96136e51ac03198981350b769e7a101c4a53eb22 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 31 May 2022 10:12:45 +0000 Subject: [PATCH 14/14] I think these deps are unneeded now --- build.sbt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/build.sbt b/build.sbt index ce49e7dc..c4ff00d3 100644 --- a/build.sbt +++ b/build.sbt @@ -154,11 +154,7 @@ lazy val plugin = crossTarget := target.value / s"scala-${scalaVersion.value}", crossScalaVersions := bin212 ++ bin213, crossVersion := CrossVersion.full, - libraryDependencies ++= Seq( - "org.scala-lang" % "scala-compiler" % scalaVersion.value % Provided, - "org.scala-js" %% "scalajs-compiler" % scalaJSVersion % Test cross CrossVersion.full, - "org.scala-js" %% "scalajs-library" % scalaJSVersion % Test - ), + libraryDependencies += "org.scala-lang" % "scala-compiler" % scalaVersion.value % Provided, sharedSettings ) .settings(