diff --git a/check/src/main/scala/rsc/checkscalasig/Checker.scala b/check/src/main/scala/rsc/checkscalasig/Checker.scala index dce2c974..a88a98f1 100644 --- a/check/src/main/scala/rsc/checkscalasig/Checker.scala +++ b/check/src/main/scala/rsc/checkscalasig/Checker.scala @@ -4,7 +4,7 @@ import better.files._ import java.nio.file.Path import rsc.checkbase.{CheckerBase, DiffUtil, DifferentProblem} import scala.collection.mutable -import scala.meta.scalasig.highlevel.{ParsedScalasig, ScalasigResult, Scalasigs} +import scala.meta.scalasig.highlevel._ /** * @@ -21,16 +21,20 @@ class Checker(settings: Settings, nscResult: Path, rscResult: Path) val nscFilenameDefaultBase = "nsc_scalasigs" val rscFilenameDefaultBase = "rsc_scalasigs" - private def resStr(sig: ScalasigResult): Option[(String, String)] = { + private def symbols(scalasig: Scalasig): Map[Id, EmbeddedSymbol] = + scalasig.symbols.map(sym => sym.id -> sym).toMap + + private def resultSyms(sig: ScalasigResult): Option[(String, Map[Id, EmbeddedSymbol])] = { sig match { - case ParsedScalasig(_, _, scalasig) => Some(scalasig.name -> scalasig.toString) + case ParsedScalasig(_, _, scalasig) => Some(scalasig.name -> symbols(scalasig)) case _ => None } } def check(): Unit = { - val nscSigs = Scalasigs.list(nscResult).flatMap(resStr).toMap - val rscSigs = Scalasigs.list(rscResult).flatMap(resStr).toMap + + val nscSigs = Scalasigs.list(nscResult).flatMap(resultSyms).toMap + val rscSigs = Scalasigs.list(rscResult).flatMap(resultSyms).toMap assert(nscSigs.keySet == rscSigs.keySet) @@ -38,18 +42,26 @@ class Checker(settings: Settings, nscResult: Path, rscResult: Path) val rscTexts = mutable.ListBuffer.empty[String] nscSigs.foreach { - case (k, nscText) => - val rscText = rscSigs(k) + case (k, nscSyms) => + val rscSyms = rscSigs(k) + + val nscSymStrs = nscSyms.mapValues(_.toString) + val rscSymStrs = rscSyms.mapValues(_.toString) if (settings.saveOutput) { - nscTexts.prepend(nscText) - rscTexts.prepend(rscText) + nscTexts.prepend(nscSymStrs.mkString("\n")) + rscTexts.prepend(rscSymStrs.mkString("\n")) } - val unifiedDiff = diff(nscResult.toString, nscText, rscText.toString, rscText) + val relevant_ids = (nscSymStrs.keySet ++ rscSymStrs.keySet).toList.sorted + + relevant_ids.foreach { id => + val nscString = nscSymStrs.getOrElse(id, "") + val rscString = rscSymStrs.getOrElse(id, "") - unifiedDiff.foreach { d => - problems += DifferentProblem(d) + if (nscString != rscString) { + problems += DifferentProblem(s"$k: $id", nscString, rscString) + } } } diff --git a/check/src/main/scala/rsc/checkscalasig/Main.scala b/check/src/main/scala/rsc/checkscalasig/Main.scala index 1d8e9889..5b44d785 100644 --- a/check/src/main/scala/rsc/checkscalasig/Main.scala +++ b/check/src/main/scala/rsc/checkscalasig/Main.scala @@ -8,6 +8,10 @@ import _root_.rsc.checkbase.{SimpleBase, ToolResult} * check/runMain rsc.checkscalasig.Main --classpath $JAVALIB:SCALALIB C.scala * * Replace $JAVALIB:SCALALIB with the actual paths + * + * Or in --classfiles mode to check output + * + * check/runMain rsc.checkscalasig.Main --classfiles rsc_output.jar nsc_output.jar */ object Main extends SimpleBase[Settings, Path, Path] { @@ -16,11 +20,11 @@ object Main extends SimpleBase[Settings, Path, Path] { } def nscResult(settings: Settings): ToolResult[Path] = { - nsc(settings.cp, settings.ins) + settings.classfiles.nsc.map(Right(_)).getOrElse(nsc(settings.cp, settings.ins)) } def rscResult(settings: Settings): ToolResult[Path] = { - rsc(settings.cp, settings.ins) + settings.classfiles.rsc.map(Right(_)).getOrElse(rsc(settings.cp, settings.ins)) } def checker(settings: Settings, nscResult: Path, rscResult: Path): Checker = { diff --git a/check/src/main/scala/rsc/checkscalasig/Settings.scala b/check/src/main/scala/rsc/checkscalasig/Settings.scala index 1c9418a8..0ff60e37 100644 --- a/check/src/main/scala/rsc/checkscalasig/Settings.scala +++ b/check/src/main/scala/rsc/checkscalasig/Settings.scala @@ -3,15 +3,23 @@ package rsc.checkscalasig import java.io.File.pathSeparator import java.nio.file.{Path, Paths} import rsc.checkbase.SettingsBase +import rsc.checkscalasig.Settings.ClassfilesPath final case class Settings( cp: List[Path] = Nil, ins: List[Path] = Nil, quiet: Boolean = false, - saveOutput: Boolean = false + saveOutput: Boolean = false, + classfiles: ClassfilesPath = ClassfilesPath(None, None) ) extends SettingsBase object Settings { + + final case class ClassfilesPath(rsc: Option[Path], nsc: Option[Path]) + + private def pathsFor(pathStr: String): List[Path] = + pathStr.split(pathSeparator).map(s => Paths.get(s)).toList + def parse(args: List[String]): Either[List[String], Settings] = { def loop( settings: Settings, @@ -20,8 +28,15 @@ object Settings { args match { case "--" +: rest => loop(settings, false, rest) + case "--classfiles" +: rsc_path +: nsc_path +: Nil => + val rsc_files = Paths.get(rsc_path) + val nsc_files = Paths.get(nsc_path) + loop( + settings.copy(classfiles = ClassfilesPath(Some(rsc_files), Some(nsc_files))), + true, + Nil) case "--classpath" +: s_cp +: rest if allowOptions => - val cp = s_cp.split(pathSeparator).map(s => Paths.get(s)).toList + val cp = pathsFor(s_cp) loop(settings.copy(cp = settings.cp ++ cp), true, rest) case "--save-output" +: rest if allowOptions => loop(settings.copy(saveOutput = true), true, rest)