Skip to content

Commit 6124562

Browse files
Merge pull request #11025 from dotty-staging/fix-#10914
Add regression tests
2 parents 437d02a + e9b5c88 commit 6124562

File tree

4 files changed

+94
-0
lines changed

4 files changed

+94
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import scala.quoted._
2+
3+
case class Entity(value: String)
4+
case class Input(ent: Entity)
5+
case class Container(ents: List[Entity])
6+
7+
object Dsl {
8+
inline def container(inline c: Input):Container = ${ containerImpl('c) }
9+
def containerImpl(c: Expr[Input])(using Quotes): Expr[Container] =
10+
import quotes.reflect._
11+
val entExpr = c match
12+
case '{ Input($ent) } => ent
13+
case _ => report.throwError("Cannot Extract Entity from Input")
14+
'{ Container(List($entExpr)) }
15+
16+
17+
given FromExpr[Entity] with
18+
def unapply(expr: Expr[Entity])(using Quotes) = expr match
19+
case '{ Entity(${Expr(value)}) } => Some(Entity(value))
20+
case _ => None
21+
22+
inline def pull(inline c: Container): Entity = ${ pullImpl('c) }
23+
def pullImpl(c: Expr[Container])(using Quotes): Expr[Entity] =
24+
import quotes.reflect._
25+
val inputs = c match
26+
case '{ Container($list) } =>
27+
list.valueOrError
28+
case _ => report.throwError("Cannot Extract List from Container")
29+
'{ Entity(${Expr(inputs.head.value)}) }
30+
}

tests/run-macros/i10914a/Test_2.scala

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
object Test {
2+
import Dsl._
3+
4+
inline def makeEnt = Entity("foo")
5+
6+
// inline def entity = makeEnt // This case breaks to
7+
//inline def input = Input(entity)
8+
9+
inline def input = Input(makeEnt)
10+
inline def contained = container(input)
11+
inline def output = pull(contained)
12+
13+
def main(args: Array[String]): Unit = {
14+
println( output )
15+
}
16+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import scala.quoted._
2+
3+
case class Entity(value: String)
4+
case class Input(ent: Entity)
5+
case class Container(ents: List[Entity])
6+
7+
object Dsl {
8+
def makeEnt = Entity("foo")
9+
10+
inline def container(inline c: Input):Container = ${ containerImpl('c) }
11+
def containerImpl(c: Expr[Input])(using Quotes): Expr[Container] =
12+
import quotes.reflect._
13+
//println("Getting Input: " + Printer.TreeStructure.show(c.asTerm))
14+
val entExpr = c match
15+
case '{ Input($ent) } => ent
16+
case _ => report.throwError("Cannot Extract Entity from Input")
17+
'{ Container(List($entExpr)) }
18+
19+
20+
given FromExpr[Entity] with
21+
def unapply(expr: Expr[Entity])(using Quotes) = expr match
22+
case '{ Entity(${Expr(value)}) } => Some(Entity(value))
23+
case '{ makeEnt } => Some(makeEnt)
24+
case _ => None
25+
26+
inline def pull(inline c: Container): Entity = ${ pullImpl('c) }
27+
def pullImpl(c: Expr[Container])(using Quotes): Expr[Entity] =
28+
import quotes.reflect._
29+
val inputs = c match
30+
case '{ Container($list) } =>
31+
list.valueOrError
32+
case _ => report.throwError("Cannot Extract List from Container")
33+
'{ Entity(${Expr(inputs.head.value)}) }
34+
}

tests/run-macros/i10914b/Test_2.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
object Test {
2+
import Dsl._
3+
4+
// inline def entity = makeEnt // This case breaks to
5+
//inline def input = Input(entity)
6+
7+
inline def input = Input(makeEnt)
8+
inline def contained = container(input)
9+
inline def output = pull(contained)
10+
11+
def main(args: Array[String]): Unit = {
12+
println( output )
13+
}
14+
}

0 commit comments

Comments
 (0)