From 89de09f520425b92dd0568b593cc284669401cbf Mon Sep 17 00:00:00 2001 From: Chua Chee Seng Date: Fri, 7 Oct 2022 22:43:34 +0800 Subject: [PATCH 1/2] Updated diagrams macro for scala 2 and 3 to render xml literal consistently between scala versions. --- .../scalatest/diagrams/DiagramsMacro.scala | 18 ++++++++-- .../org/scalatest/diagrams/DiagramsSpec.scala | 28 +++++++--------- .../DirectDiagrammedAssertionsSpec.scala | 28 +++++++--------- .../diagrams/DiagrammedExprMacro.scala | 33 ++++++++++++++----- 4 files changed, 64 insertions(+), 43 deletions(-) diff --git a/dotty/diagrams/src/main/scala/org/scalatest/diagrams/DiagramsMacro.scala b/dotty/diagrams/src/main/scala/org/scalatest/diagrams/DiagramsMacro.scala index ee7f5aa0db..9e60b56759 100644 --- a/dotty/diagrams/src/main/scala/org/scalatest/diagrams/DiagramsMacro.scala +++ b/dotty/diagrams/src/main/scala/org/scalatest/diagrams/DiagramsMacro.scala @@ -42,6 +42,17 @@ object DiagramsMacro { case '{ $x: t } => '{ DiagrammedExpr.simpleExpr[t]($x, ${ getAnchor(term) } ) }.asTerm } + def xmlSugarExpr(term: Term): Term = term.asExpr match { + case '{ $x: t } => '{ + DiagrammedExpr.simpleExpr[t]($x, ${ + // https://docs.scala-lang.org/scala3/reference/metaprogramming/reflection.html#positions + val anchor = expr.pos.startColumn - Position.ofMacroExpansion.startColumn + val c = expr.pos.sourceCode.getOrElse("").head + Expr(anchor - (if (c == '<') 0 else 1)) + } ) + }.asTerm + } + def getAnchorForSelect(sel: Select): Expr[Int] = { if (sel.name == "unary_!") Expr(sel.pos.startColumn - Position.ofMacroExpansion.startColumn) @@ -54,7 +65,8 @@ object DiagramsMacro { def getAnchor(expr: Term): Expr[Int] = { // -1 to match scala2 position // Expr((expr.asTerm.pos.endColumn + expr.asTerm.pos.startColumn - 1) / 2 - Position.ofMacroExpansion.startColumn) - Expr(expr.pos.startColumn - Position.ofMacroExpansion.startColumn) + //val line = expr.pos.sourceCode.getOrElse("").split('\n').apply(expr.pos.startLine - 1) + Expr(expr.pos.startColumn - Position.ofMacroExpansion.startColumn)// - adjustment } def handleArgs(argTps: List[TypeRepr], args: List[Term]): (List[Term], List[Term]) = @@ -71,9 +83,9 @@ object DiagramsMacro { } expr match { - case Apply(Select(New(_), _), _) => default(expr) + case apply: Apply if isXmlSugar(apply) => xmlSugarExpr(expr) - case apply: Apply if isXmlSugar(apply) => default(expr) + case Apply(Select(New(_), _), _) => default(expr) case apply: Apply if isJavaStatic(apply) => default(expr) diff --git a/jvm/diagrams-test/src/test/scala/org/scalatest/diagrams/DiagramsSpec.scala b/jvm/diagrams-test/src/test/scala/org/scalatest/diagrams/DiagramsSpec.scala index 4c8ccb2428..024497f360 100644 --- a/jvm/diagrams-test/src/test/scala/org/scalatest/diagrams/DiagramsSpec.scala +++ b/jvm/diagrams-test/src/test/scala/org/scalatest/diagrams/DiagramsSpec.scala @@ -2455,10 +2455,9 @@ class DiagramsSpec extends AnyFunSpec with Matchers with Diagrams { """ | |assert(Dude == Mary) - | | | | - | | | Mary - | | false - | Dude + | | | | + | Dude | Mary + | false |""".stripMargin ) ) @@ -4918,10 +4917,9 @@ class DiagramsSpec extends AnyFunSpec with Matchers with Diagrams { """this is a clue | |assert(Dude == Mary, "this is a clue") - | | | | - | | | Mary - | | false - | Dude + | | | | + | Dude | Mary + | false |""".stripMargin ) ) @@ -7384,10 +7382,9 @@ class DiagramsSpec extends AnyFunSpec with Matchers with Diagrams { """ | |assume(Dude == Mary) - | | | | - | | | Mary - | | false - | Dude + | | | | + | Dude | Mary + | false |""".stripMargin ) ) @@ -9849,10 +9846,9 @@ class DiagramsSpec extends AnyFunSpec with Matchers with Diagrams { """this is a clue | |assume(Dude == Mary, "this is a clue") - | | | | - | | | Mary - | | false - | Dude + | | | | + | Dude | Mary + | false |""".stripMargin ) ) diff --git a/jvm/diagrams-test/src/test/scala/org/scalatest/diagrams/DirectDiagrammedAssertionsSpec.scala b/jvm/diagrams-test/src/test/scala/org/scalatest/diagrams/DirectDiagrammedAssertionsSpec.scala index 4e6d8275ab..18a321b03d 100644 --- a/jvm/diagrams-test/src/test/scala/org/scalatest/diagrams/DirectDiagrammedAssertionsSpec.scala +++ b/jvm/diagrams-test/src/test/scala/org/scalatest/diagrams/DirectDiagrammedAssertionsSpec.scala @@ -2455,10 +2455,9 @@ class DirectDiagrammedAssertionsSpec extends AnyFunSpec with org.scalatest.match """ | |org.scalatest.diagrams.Diagrams.assert(Dude == Mary) - | | | | - | | | Mary - | | false - | Dude + | | | | + | Dude | Mary + | false |""".stripMargin ) ) @@ -4914,10 +4913,9 @@ class DirectDiagrammedAssertionsSpec extends AnyFunSpec with org.scalatest.match """this is a clue | |org.scalatest.diagrams.Diagrams.assert(Dude == Mary, "this is a clue") - | | | | - | | | Mary - | | false - | Dude + | | | | + | Dude | Mary + | false |""".stripMargin ) ) @@ -7373,10 +7371,9 @@ class DirectDiagrammedAssertionsSpec extends AnyFunSpec with org.scalatest.match """ | |org.scalatest.diagrams.Diagrams.assume(Dude == Mary) - | | | | - | | | Mary - | | false - | Dude + | | | | + | Dude | Mary + | false |""".stripMargin ) ) @@ -9832,10 +9829,9 @@ class DirectDiagrammedAssertionsSpec extends AnyFunSpec with org.scalatest.match """this is a clue | |org.scalatest.diagrams.Diagrams.assume(Dude == Mary, "this is a clue") - | | | | - | | | Mary - | | false - | Dude + | | | | + | Dude | Mary + | false |""".stripMargin ) ) diff --git a/jvm/diagrams/src/main/scala/org/scalatest/diagrams/DiagrammedExprMacro.scala b/jvm/diagrams/src/main/scala/org/scalatest/diagrams/DiagrammedExprMacro.scala index 718d19dde1..74e2052e13 100644 --- a/jvm/diagrams/src/main/scala/org/scalatest/diagrams/DiagrammedExprMacro.scala +++ b/jvm/diagrams/src/main/scala/org/scalatest/diagrams/DiagrammedExprMacro.scala @@ -38,14 +38,31 @@ private[diagrams] class DiagrammedExprMacro[C <: Context](val context: C) { private[this] def getPosition(expr: Tree) = expr.pos.asInstanceOf[scala.reflect.internal.util.Position] // this is taken from expecty and modified, the purpose is to get the anchor for the given expression - private[this] def getAnchor(expr: Tree): Int = expr match { - case Apply(x, ys) => getAnchor(x) + 0 - case TypeApply(x, ys) => getAnchor(x) + 0 - case _ => { - getPosition(expr) match { - case NoPosition => -1 - case pos => pos.point - pos.source.lineToOffset(pos.line - 1) - } + private[this] def getAnchor(expr: Tree): Int = { + expr match { + case apply @ Apply(x, ys) if isXmlSugar(apply) => + val anchor = getAnchor(x) + val adjustment = + getPosition(expr) match { + case NoPosition => 0 + case pos => + val line = pos.source.lineToString(pos.line - 1) + val c = line.charAt(anchor) + if (c == '<') 0 else 1 + } + //val p = getPosition(expr) + //val line = p.source.lineToString(p.line - 1) + //val anchor = getAnchor(x) + //val c = line.charAt(anchor) + anchor - adjustment + case Apply(x, ys) => getAnchor(x) + 0 + case TypeApply(x, ys) => ;getAnchor(x) + 0 + case _ => + getPosition(expr) match { + case NoPosition => -1 + case pos => + pos.point - pos.source.lineToOffset(pos.line - 1) + } } } From ae8581f4d1dcf6917dc62120af5fcf8dbca5b21c Mon Sep 17 00:00:00 2001 From: Chua Chee Seng Date: Fri, 7 Oct 2022 23:55:26 +0800 Subject: [PATCH 2/2] Removed commentted code. --- .../src/main/scala/org/scalatest/diagrams/DiagramsMacro.scala | 3 +-- .../scala/org/scalatest/diagrams/DiagrammedExprMacro.scala | 4 ---- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/dotty/diagrams/src/main/scala/org/scalatest/diagrams/DiagramsMacro.scala b/dotty/diagrams/src/main/scala/org/scalatest/diagrams/DiagramsMacro.scala index 9e60b56759..6b311089b2 100644 --- a/dotty/diagrams/src/main/scala/org/scalatest/diagrams/DiagramsMacro.scala +++ b/dotty/diagrams/src/main/scala/org/scalatest/diagrams/DiagramsMacro.scala @@ -65,8 +65,7 @@ object DiagramsMacro { def getAnchor(expr: Term): Expr[Int] = { // -1 to match scala2 position // Expr((expr.asTerm.pos.endColumn + expr.asTerm.pos.startColumn - 1) / 2 - Position.ofMacroExpansion.startColumn) - //val line = expr.pos.sourceCode.getOrElse("").split('\n').apply(expr.pos.startLine - 1) - Expr(expr.pos.startColumn - Position.ofMacroExpansion.startColumn)// - adjustment + Expr(expr.pos.startColumn - Position.ofMacroExpansion.startColumn) } def handleArgs(argTps: List[TypeRepr], args: List[Term]): (List[Term], List[Term]) = diff --git a/jvm/diagrams/src/main/scala/org/scalatest/diagrams/DiagrammedExprMacro.scala b/jvm/diagrams/src/main/scala/org/scalatest/diagrams/DiagrammedExprMacro.scala index 74e2052e13..eb94fa6135 100644 --- a/jvm/diagrams/src/main/scala/org/scalatest/diagrams/DiagrammedExprMacro.scala +++ b/jvm/diagrams/src/main/scala/org/scalatest/diagrams/DiagrammedExprMacro.scala @@ -50,10 +50,6 @@ private[diagrams] class DiagrammedExprMacro[C <: Context](val context: C) { val c = line.charAt(anchor) if (c == '<') 0 else 1 } - //val p = getPosition(expr) - //val line = p.source.lineToString(p.line - 1) - //val anchor = getAnchor(x) - //val c = line.charAt(anchor) anchor - adjustment case Apply(x, ys) => getAnchor(x) + 0 case TypeApply(x, ys) => ;getAnchor(x) + 0