Skip to content

Commit

Permalink
Merge pull request #479 from wiwa/f/checkscalasig-output
Browse files Browse the repository at this point in the history
Better checkscalasig
  • Loading branch information
olafurpg committed Aug 23, 2019
2 parents 8df1e01 + 90d63a1 commit 2a6764c
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 16 deletions.
36 changes: 24 additions & 12 deletions check/src/main/scala/rsc/checkscalasig/Checker.scala
Expand Up @@ -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._

/**
*
Expand All @@ -21,35 +21,47 @@ 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)

val nscTexts = mutable.ListBuffer.empty[String]
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)
}
}
}

Expand Down
8 changes: 6 additions & 2 deletions check/src/main/scala/rsc/checkscalasig/Main.scala
Expand Up @@ -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] {

Expand All @@ -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 = {
Expand Down
19 changes: 17 additions & 2 deletions check/src/main/scala/rsc/checkscalasig/Settings.scala
Expand Up @@ -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,
Expand All @@ -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)
Expand Down

0 comments on commit 2a6764c

Please sign in to comment.