Skip to content

Commit 2177ffb

Browse files
committed
WIP
1 parent a8367c7 commit 2177ffb

File tree

5 files changed

+81
-4
lines changed

5 files changed

+81
-4
lines changed

tests/neg/tasty-macro-assert/quoted_1.scala renamed to tests/neg/tasty-macro-assert-1/quoted_1.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ object Asserts {
3333
}
3434

3535
tree match {
36-
case Term.Inlined(_, Nil, Term.Apply(Term.Select(OpsTree(left), op), right :: Nil)) =>
36+
case Term.Apply(Term.Select(OpsTree(left), op), right :: Nil) =>
3737
'(assertTrue(~left.seal[Boolean])) // Buggy code. To generate the errors
3838
case _ =>
3939
'(assertTrue(~cond))
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
import Asserts._
3+
4+
object Test {
5+
def main(args: Array[String]): Unit = {
6+
macroAssert(true === "cde")
7+
macroAssert("acb" === "cde") // error
8+
}
9+
10+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import scala.quoted._
2+
3+
import scala.tasty._
4+
5+
object Asserts {
6+
7+
implicit class Ops[T](left: T) {
8+
def ===(right: T): Boolean = left == right
9+
def !==(right: T): Boolean = left != right
10+
}
11+
12+
object Ops
13+
14+
inline def macroAssert(cond: => Boolean): Unit =
15+
~impl('(cond))
16+
17+
def impl(cond: Expr[Boolean])(implicit reflect: Reflection): Expr[Unit] = {
18+
import reflect._
19+
20+
val tree = cond.unseal
21+
22+
def isOps(tpe: TypeOrBounds): Boolean = tpe match {
23+
case Type.SymRef(IsDefSymbol(sym), _) => sym.name == "Ops" // TODO check that the parent is Asserts
24+
case _ => false
25+
}
26+
27+
object OpsTree {
28+
def unapply(arg: Term): Option[Term] = arg match {
29+
case Term.Apply(Term.TypeApply(term, _), left :: Nil) if isOps(term.tpe) =>
30+
Some(left)
31+
case _ => None
32+
}
33+
}
34+
35+
tree match {
36+
case Term.Apply(Term.Select(OpsTree(left), op), right :: Nil) =>
37+
'(assertTrue(~left.seal[Boolean])) // Buggy code. To generate the errors
38+
case _ =>
39+
'(assertTrue(~cond))
40+
}
41+
42+
}
43+
44+
def assertEquals[T](left: T, right: T): Unit = {
45+
if (left != right) {
46+
println(
47+
s"""Error left did not equal right:
48+
| left = $left
49+
| right = $right""".stripMargin)
50+
}
51+
52+
}
53+
54+
def assertNotEquals[T](left: T, right: T): Unit = {
55+
if (left == right) {
56+
println(
57+
s"""Error left was equal to right:
58+
| left = $left
59+
| right = $right""".stripMargin)
60+
}
61+
62+
}
63+
64+
def assertTrue(cond: Boolean): Unit = {
65+
if (!cond)
66+
println("Condition was false")
67+
}
68+
69+
}

tests/neg/tasty-macro-assert/quoted_2.scala renamed to tests/neg/tasty-macro-assert-2/quoted_2.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ import Asserts._
33

44
object Test {
55
def main(args: Array[String]): Unit = {
6-
macroAssert(true === "cde")
7-
macroAssert("acb" === "cde") // error
86
macroAssert(false !== "acb")
97
macroAssert("acb" !== "acb") // error
108
}

tests/run/tasty-macro-assert/quoted_1.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ object Asserts {
3333
}
3434

3535
tree match {
36-
case Term.Inlined(_, Nil, Term.Apply(Term.Select(OpsTree(left), op), right :: Nil)) =>
36+
case Term.Apply(Term.Select(OpsTree(left), op), right :: Nil) =>
3737
op match {
3838
case "===" => '(assertEquals(~left.seal[Any], ~right.seal[Any]))
3939
case "!==" => '(assertNotEquals(~left.seal[Any], ~right.seal[Any]))

0 commit comments

Comments
 (0)