From 374926c1ce9e787dc39b02a7d4182414d54028eb Mon Sep 17 00:00:00 2001 From: Michal Pawlik Date: Tue, 23 Apr 2024 13:43:50 +0200 Subject: [PATCH] refactor clues --- .../scala-2/munit/internal/MacroCompat.scala | 2 +- .../scala-3/munit/internal/MacroCompat.scala | 2 +- .../src/main/scala/munit/Assertions.scala | 4 +- munit/shared/src/main/scala/munit/Clue.scala | 20 ++++---- munit/shared/src/main/scala/munit/Clues.scala | 47 +++++++++++++++---- .../munit/internal/MacroCompatScala2.scala | 2 +- .../scala/munit/internal/console/Lines.scala | 2 +- .../src/main/scala/munit/diff/Clue.scala | 13 ----- .../src/main/scala/munit/diff/Clues.scala | 11 ----- .../main/scala/munit/diff/NextPrintable.scala | 8 ++++ .../scala/munit/diff/console/Printers.scala | 33 +++---------- .../src/test/scala/munit/TypeCheckSuite.scala | 4 +- 12 files changed, 71 insertions(+), 77 deletions(-) delete mode 100644 scala-diff/shared/src/main/scala/munit/diff/Clue.scala delete mode 100644 scala-diff/shared/src/main/scala/munit/diff/Clues.scala create mode 100644 scala-diff/shared/src/main/scala/munit/diff/NextPrintable.scala diff --git a/munit/shared/src/main/scala-2/munit/internal/MacroCompat.scala b/munit/shared/src/main/scala-2/munit/internal/MacroCompat.scala index 1c15595a..594abdb7 100644 --- a/munit/shared/src/main/scala-2/munit/internal/MacroCompat.scala +++ b/munit/shared/src/main/scala-2/munit/internal/MacroCompat.scala @@ -1,6 +1,6 @@ package munit.internal -import munit.diff.Clue +import munit.Clue import munit.Location import scala.language.experimental.macros import scala.reflect.macros.blackbox.Context diff --git a/munit/shared/src/main/scala-3/munit/internal/MacroCompat.scala b/munit/shared/src/main/scala-3/munit/internal/MacroCompat.scala index a4482204..1e5b3ce3 100644 --- a/munit/shared/src/main/scala-3/munit/internal/MacroCompat.scala +++ b/munit/shared/src/main/scala-3/munit/internal/MacroCompat.scala @@ -1,6 +1,6 @@ package munit.internal -import munit.diff.Clue +import munit.Clue import munit.Location import scala.quoted._ import scala.language.experimental.macros diff --git a/munit/shared/src/main/scala/munit/Assertions.scala b/munit/shared/src/main/scala/munit/Assertions.scala index 970d151f..26fa4214 100644 --- a/munit/shared/src/main/scala/munit/Assertions.scala +++ b/munit/shared/src/main/scala/munit/Assertions.scala @@ -3,8 +3,8 @@ package munit import munit.internal.console.{Lines, StackTraces} import munit.diff.console.Printers import munit.diff.Printer -import munit.diff.Clue -import munit.diff.Clues +import munit.Clue +import munit.Clues import munit.diff.EmptyPrinter import scala.reflect.ClassTag diff --git a/munit/shared/src/main/scala/munit/Clue.scala b/munit/shared/src/main/scala/munit/Clue.scala index d81e322e..028c1aba 100644 --- a/munit/shared/src/main/scala/munit/Clue.scala +++ b/munit/shared/src/main/scala/munit/Clue.scala @@ -2,16 +2,16 @@ package munit import munit.internal.MacroCompat -// class Clue[+T]( -// val source: String, -// val value: T, -// val valueType: String -// ) extends Serializable { -// override def toString(): String = s"Clue($source, $value)" -// } +class Clue[+T]( + val source: String, + val value: T, + val valueType: String +) extends Serializable { + override def toString(): String = s"Clue($source, $value)" +} object Clue extends MacroCompat.ClueMacro { @deprecated("use fromValue instead", "1.0.0") - def empty[T](value: T): munit.diff.Clue[T] = fromValue(value) - def fromValue[T](value: T): munit.diff.Clue[T] = - new munit.diff.Clue("", value, "") + def empty[T](value: T): Clue[T] = fromValue(value) + def fromValue[T](value: T): Clue[T] = + new Clue("", value, "") } diff --git a/munit/shared/src/main/scala/munit/Clues.scala b/munit/shared/src/main/scala/munit/Clues.scala index ae64576a..bd27b662 100644 --- a/munit/shared/src/main/scala/munit/Clues.scala +++ b/munit/shared/src/main/scala/munit/Clues.scala @@ -1,11 +1,40 @@ package munit -import munit.internal.console.Printers - -// class Clues(val values: List[Clue[_]]) { -// override def toString(): String = Printers.print(this) -// } -// object Clues { -// def empty: Clues = new Clues(List()) -// def fromValue[T](value: T): Clues = new Clues(List(Clue.fromValue(value))) -// } +import munit.diff.console.Printers +import munit.diff.NextPrintable + +class Clues(val values: List[Clue[_]]) extends NextPrintable { + + override def print( + out: StringBuilder, + indent: Int, + continue: (Any, Int) => Unit + ): Unit = { + val nextIndent = indent + Printers.indentStep + Printers.printApply( + "Clues", + values.iterator, + out, + indent, + nextIndent, + open = " {", + close = "}", + comma = "" + ) { clue => + if (clue.source.nonEmpty) { + out.append(clue.source) + } + if (clue.valueType.nonEmpty) { + out.append(": ").append(clue.valueType) + } + out.append(" = ") + continue(clue.value, nextIndent) + } + } + + override def toString(): String = Printers.print(this) +} +object Clues { + def empty: Clues = new Clues(List()) + def fromValue[T](value: T): Clues = new Clues(List(Clue.fromValue(value))) +} diff --git a/munit/shared/src/main/scala/munit/internal/MacroCompatScala2.scala b/munit/shared/src/main/scala/munit/internal/MacroCompatScala2.scala index 05f171b5..90c298db 100644 --- a/munit/shared/src/main/scala/munit/internal/MacroCompatScala2.scala +++ b/munit/shared/src/main/scala/munit/internal/MacroCompatScala2.scala @@ -1,6 +1,6 @@ package munit.internal -import munit.diff.Clue +import munit.Clue import munit.Location import scala.reflect.macros.blackbox.Context import scala.reflect.macros.TypecheckException diff --git a/munit/shared/src/main/scala/munit/internal/console/Lines.scala b/munit/shared/src/main/scala/munit/internal/console/Lines.scala index 5dc3ca84..440a55dc 100644 --- a/munit/shared/src/main/scala/munit/internal/console/Lines.scala +++ b/munit/shared/src/main/scala/munit/internal/console/Lines.scala @@ -6,7 +6,7 @@ import munit.Location import scala.collection.JavaConverters._ import scala.collection.mutable import scala.util.control.NonFatal -import munit.diff.Clues +import munit.Clues class Lines extends Serializable { private val filecache = mutable.Map.empty[Path, Array[String]] diff --git a/scala-diff/shared/src/main/scala/munit/diff/Clue.scala b/scala-diff/shared/src/main/scala/munit/diff/Clue.scala deleted file mode 100644 index 9f6702d3..00000000 --- a/scala-diff/shared/src/main/scala/munit/diff/Clue.scala +++ /dev/null @@ -1,13 +0,0 @@ -package munit.diff - -class Clue[+T]( - val source: String, - val value: T, - val valueType: String -) extends Serializable { - override def toString(): String = s"Clue($source, $value)" -} - -object Clue { - def fromValue[T](value: T): Clue[T] = new Clue("", value, "") -} diff --git a/scala-diff/shared/src/main/scala/munit/diff/Clues.scala b/scala-diff/shared/src/main/scala/munit/diff/Clues.scala deleted file mode 100644 index 9616c21d..00000000 --- a/scala-diff/shared/src/main/scala/munit/diff/Clues.scala +++ /dev/null @@ -1,11 +0,0 @@ -package munit.diff - -import munit.diff.console.Printers - -class Clues(val values: List[Clue[_]]) { - override def toString(): String = Printers.print(this) -} -object Clues { - def empty: Clues = new Clues(List()) - def fromValue[T](value: T): Clues = new Clues(List(Clue.fromValue(value))) -} diff --git a/scala-diff/shared/src/main/scala/munit/diff/NextPrintable.scala b/scala-diff/shared/src/main/scala/munit/diff/NextPrintable.scala new file mode 100644 index 00000000..d050c83e --- /dev/null +++ b/scala-diff/shared/src/main/scala/munit/diff/NextPrintable.scala @@ -0,0 +1,8 @@ +package munit.diff + +/** + * Don't override this ever + */ +trait NextPrintable { + def print(out: StringBuilder, indent: Int, continue: (Any, Int) => Unit): Unit +} diff --git a/scala-diff/shared/src/main/scala/munit/diff/console/Printers.scala b/scala-diff/shared/src/main/scala/munit/diff/console/Printers.scala index b6235712..f8e89edd 100644 --- a/scala-diff/shared/src/main/scala/munit/diff/console/Printers.scala +++ b/scala-diff/shared/src/main/scala/munit/diff/console/Printers.scala @@ -1,19 +1,19 @@ // Adaptation of https://github.com/lihaoyi/PPrint/blob/e6a918c259ed7ae1998bbf58c360334a3f0157ca/pprint/src/pprint/Walker.scala package munit.diff.console -import munit.diff.{EmptyPrinter, Printable, Printer} +import munit.diff.{EmptyPrinter, Printable, NextPrintable, Printer} import scala.annotation.switch -import munit.diff.Clues import munit.diff.internal.Compat object Printers { + val indentStep = 2 /** Pretty-prints the value in a format that's optimized for producing diffs */ def print(any: Any, printer: Printer = EmptyPrinter): String = { var height = printer.height val out = new StringBuilder() - val indentStep = 2 + def loop(a: Any, indent: Int): Unit = { height -= 1 if (height < 0) { @@ -24,8 +24,9 @@ object Printers { val isDone = printer.print(a, out, indent) if (!isDone) { a match { - case null => out.append("null") - case x: Printable => x.print(out, indent) + case null => out.append("null") + case x: Printable => x.print(out, indent) + case x: NextPrintable => x.print(out, indent, loop) case x: Char => out.append('\'') if (x == '\'') out.append("\\'") @@ -38,26 +39,6 @@ object Printers { case x: Float => out.append(x.toString()) case x: Double => out.append(x.toString()) case x: String => printString(x, out, printer) - case x: Clues => - printApply( - "Clues", - x.values.iterator, - out, - indent, - nextIndent, - open = " {", - close = "}", - comma = "" - ) { clue => - if (clue.source.nonEmpty) { - out.append(clue.source) - } - if (clue.valueType.nonEmpty) { - out.append(": ").append(clue.valueType) - } - out.append(" = ") - loop(clue.value, nextIndent) - } case None => out.append("None") case Nil => @@ -120,7 +101,7 @@ object Printers { munit.diff.console.AnsiColors.filterAnsi(out.toString()) } - private def printApply[T]( + private[munit] def printApply[T]( prefix: String, it: Iterator[T], out: StringBuilder, diff --git a/tests/shared/src/test/scala/munit/TypeCheckSuite.scala b/tests/shared/src/test/scala/munit/TypeCheckSuite.scala index 7bece05e..3b92ca84 100644 --- a/tests/shared/src/test/scala/munit/TypeCheckSuite.scala +++ b/tests/shared/src/test/scala/munit/TypeCheckSuite.scala @@ -41,7 +41,7 @@ class TypeCheckSuite extends FunSuite { | |The following import might make progress towards fixing the problem: | - | import munit.diff.Clue.generate + | import munit.Clue.generate | |msg.foobar | ^ @@ -84,7 +84,7 @@ class TypeCheckSuite extends FunSuite { | |The following import might make progress towards fixing the problem: | - | import munit.diff.Clue.generate + | import munit.Clue.generate | |val n: Int = msg | ^