Skip to content

Commit 2826aac

Browse files
committed
Make TASTy reflect CaseDef <: Tree and TypeCaseDef <: Tree
1 parent 938c684 commit 2826aac

File tree

7 files changed

+40
-60
lines changed

7 files changed

+40
-60
lines changed

compiler/src/dotty/tools/dotc/tastyreflect/KernelImpl.scala

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -820,12 +820,13 @@ class KernelImpl(val rootContext: core.Contexts.Context, val rootPosition: util.
820820

821821
def WildcardTypeTree_tpe(self: WildcardTypeTree)(implicit ctx: Context): TypeOrBounds = self.tpe.stripTypeVar
822822

823-
//
824-
// CASES
825-
//
826-
827823
type CaseDef = tpd.CaseDef
828824

825+
def matchCaseDef(tree: Tree)(implicit ctx: Context): Option[CaseDef] = tree match {
826+
case tree: tpd.CaseDef if tree.body.isTerm => Some(tree)
827+
case _ => None
828+
}
829+
829830
def CaseDef_pattern(self: CaseDef)(implicit ctx: Context): Pattern = self.pat
830831
def CaseDef_guard(self: CaseDef)(implicit ctx: Context): Option[Term] = optional(self.guard)
831832
def CaseDef_rhs(self: CaseDef)(implicit ctx: Context): Term = self.body
@@ -838,6 +839,11 @@ class KernelImpl(val rootContext: core.Contexts.Context, val rootPosition: util.
838839

839840
type TypeCaseDef = tpd.CaseDef
840841

842+
def matchTypeCaseDef(tree: Tree)(implicit ctx: Context): Option[TypeCaseDef] = tree match {
843+
case tree: tpd.CaseDef if tree.body.isType => Some(tree)
844+
case _ => None
845+
}
846+
841847
def TypeCaseDef_pattern(self: TypeCaseDef)(implicit ctx: Context): TypeTree = self.pat
842848
def TypeCaseDef_rhs(self: TypeCaseDef)(implicit ctx: Context): TypeTree = self.body
843849

docs/docs/reference/other-new-features/tasty-reflect.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,8 @@ TASTy Reflect provides the following types:
130130
|
131131
+- TypeBoundsTree
132132
+- SyntheticBounds
133-
134-
+- CaseDef
135-
+- TypeCaseDef
133+
+- CaseDef
134+
+- TypeCaseDef
136135
137136
+- Pattern --+- Value
138137
+- Bind

library/src/scala/tasty/reflect/CaseDefOps.scala

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,31 +10,41 @@ trait CaseDefOps extends Core {
1010
def rhs(implicit ctx: Context): Term = kernel.CaseDef_rhs(caseDef)
1111
}
1212

13+
object IsCaseDef {
14+
def unapply(self: Tree)(implicit ctx: Context): Option[CaseDef] =
15+
kernel.matchCaseDef(self)
16+
}
17+
1318
object CaseDef {
1419
def apply(pattern: Pattern, guard: Option[Term], rhs: Term)(implicit ctx: Context): CaseDef =
1520
kernel.CaseDef_module_apply(pattern, guard, rhs)
1621

1722
def copy(original: CaseDef)(pattern: Pattern, guard: Option[Term], rhs: Term)(implicit ctx: Context): CaseDef =
1823
kernel.CaseDef_module_copy(original)(pattern, guard, rhs)
1924

20-
def unapply(x: CaseDef)(implicit ctx: Context): Option[(Pattern, Option[Term], Term)] =
21-
Some((x.pattern, x.guard, x.rhs))
25+
def unapply(tree: Tree)(implicit ctx: Context): Option[(Pattern, Option[Term], Term)] =
26+
kernel.matchCaseDef(tree).map( x => (x.pattern, x.guard, x.rhs))
2227
}
2328

2429
implicit class TypeCaseDefAPI(caseDef: TypeCaseDef) {
2530
def pattern(implicit ctx: Context): TypeTree = kernel.TypeCaseDef_pattern(caseDef)
2631
def rhs(implicit ctx: Context): TypeTree = kernel.TypeCaseDef_rhs(caseDef)
2732
}
2833

34+
object TypeIsCaseDef {
35+
def unapply(self: Tree)(implicit ctx: Context): Option[TypeCaseDef] =
36+
kernel.matchTypeCaseDef(self)
37+
}
38+
2939
object TypeCaseDef {
3040
def apply(pattern: TypeTree, rhs: TypeTree)(implicit ctx: Context): TypeCaseDef =
3141
kernel.TypeCaseDef_module_apply(pattern, rhs)
3242

3343
def copy(original: TypeCaseDef)(pattern: TypeTree, rhs: TypeTree)(implicit ctx: Context): TypeCaseDef =
3444
kernel.TypeCaseDef_module_copy(original)(pattern, rhs)
3545

36-
def unapply(x: TypeCaseDef)(implicit ctx: Context): Option[(TypeTree, TypeTree)] =
37-
Some((x.pattern, x.rhs))
46+
def unapply(tree: Tree)(implicit ctx: Context): Option[(TypeTree, TypeTree)] =
47+
kernel.matchTypeCaseDef(tree).map( x => (x.pattern, x.rhs))
3848
}
3949

4050
}

library/src/scala/tasty/reflect/Core.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,8 @@ package scala.tasty.reflect
5353
* |
5454
* +- TypeBoundsTree
5555
* +- WildcardTypeTree
56-
*
57-
* +- CaseDef
58-
* +- TypeCaseDef
56+
* +- CaseDef
57+
* +- TypeCaseDef
5958
*
6059
* +- Pattern --+- Value
6160
* +- Bind

library/src/scala/tasty/reflect/Kernel.scala

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,8 @@ package scala.tasty.reflect
5252
* |
5353
* +- TypeBoundsTree
5454
* +- WildcardTypeTree
55-
*
56-
* +- CaseDef
57-
* +- TypeCaseDef
55+
* +- CaseDef
56+
* +- TypeCaseDef
5857
*
5958
* +- Pattern --+- Value
6059
* +- Bind
@@ -670,12 +669,10 @@ trait Kernel {
670669

671670
def WildcardTypeTree_tpe(self: WildcardTypeTree)(implicit ctx: Context): TypeOrBounds
672671

673-
//
674-
// CASES
675-
//
676-
677672
/** Branch of a pattern match or catch clause */
678-
type CaseDef <: AnyRef
673+
type CaseDef <: Tree
674+
675+
def matchCaseDef(tree: Tree)(implicit ctx: Context): Option[CaseDef]
679676

680677
def CaseDef_pattern(self: CaseDef)(implicit ctx: Context): Pattern
681678
def CaseDef_guard(self: CaseDef)(implicit ctx: Context): Option[Term]
@@ -685,7 +682,9 @@ trait Kernel {
685682
def CaseDef_module_copy(original: CaseDef)(pattern: Pattern, guard: Option[Term], body: Term)(implicit ctx: Context): CaseDef
686683

687684
/** Branch of a type pattern match */
688-
type TypeCaseDef <: AnyRef
685+
type TypeCaseDef <: Tree
686+
687+
def matchTypeCaseDef(tree: Tree)(implicit ctx: Context): Option[TypeCaseDef]
689688

690689
def TypeCaseDef_pattern(self: TypeCaseDef)(implicit ctx: Context): TypeTree
691690
def TypeCaseDef_rhs(self: TypeCaseDef)(implicit ctx: Context): TypeTree

library/src/scala/tasty/reflect/Printers.scala

Lines changed: 4 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,6 @@ trait Printers
3838
def showCode(implicit ctx: Context): String = new SourceCodePrinter().showTypeOrBounds(tpe)
3939
}
4040

41-
/** Adds `show` as an extension method of a `CaseDef` */
42-
implicit class CaseDefShowDeco(caseDef: CaseDef) {
43-
/** Shows the tree as extractors */
44-
def show(implicit ctx: Context): String = new ExtractorsPrinter().showCaseDef(caseDef)
45-
/** Shows the tree as source code */
46-
def showCode(implicit ctx: Context): String = new SourceCodePrinter().showCaseDef(caseDef)
47-
}
48-
4941
/** Adds `show` as an extension method of a `Pattern` */
5042
implicit class PatternShowDeco(pattern: Pattern) {
5143
/** Shows the tree as extractors */
@@ -82,8 +74,6 @@ trait Printers
8274

8375
def showTree(tree: Tree)(implicit ctx: Context): String
8476

85-
def showCaseDef(caseDef: CaseDef)(implicit ctx: Context): String
86-
8777
def showPattern(pattern: Pattern)(implicit ctx: Context): String
8878

8979
def showTypeOrBounds(tpe: TypeOrBounds)(implicit ctx: Context): String
@@ -101,9 +91,6 @@ trait Printers
10191
def showTree(tree: Tree)(implicit ctx: Context): String =
10292
new Buffer().visitTree(tree).result()
10393

104-
def showCaseDef(caseDef: CaseDef)(implicit ctx: Context): String =
105-
new Buffer().visitCaseDef(caseDef).result()
106-
10794
def showPattern(pattern: Pattern)(implicit ctx: Context): String =
10895
new Buffer().visitPattern(pattern).result()
10996

@@ -251,16 +238,10 @@ trait Printers
251238
this += s"WildcardTypeTree()"
252239
case TypeTree.MatchType(bound, selector, cases) =>
253240
this += "TypeTree.MatchType(" += bound += ", " += selector += ", " ++= cases += ")"
254-
}
255-
256-
def visitCaseDef(x: CaseDef): Buffer = {
257-
val CaseDef(pat, guard, body) = x
258-
this += "CaseDef(" += pat += ", " += guard += ", " += body += ")"
259-
}
260-
261-
def visitTypeCaseDef(x: TypeCaseDef): Buffer = {
262-
val TypeCaseDef(pat, body) = x
263-
this += "TypeCaseDef(" += pat += ", " += body += ")"
241+
case CaseDef(pat, guard, body) =>
242+
this += "CaseDef(" += pat += ", " += guard += ", " += body += ")"
243+
case TypeCaseDef(pat, body) =>
244+
this += "TypeCaseDef(" += pat += ", " += body += ")"
264245
}
265246

266247
def visitPattern(x: Pattern): Buffer = x match {
@@ -382,16 +363,6 @@ trait Printers
382363
def +++=(x: List[List[Tree]]): Buffer = { visitList(x, ++=); buff }
383364
}
384365

385-
private implicit class CaseDefOps(buff: Buffer) {
386-
def +=(x: CaseDef): Buffer = { visitCaseDef(x); buff }
387-
def ++=(x: List[CaseDef]): Buffer = { visitList(x, visitCaseDef); buff }
388-
}
389-
390-
private implicit class TypeCaseDefOps(buff: Buffer) {
391-
def +=(x: TypeCaseDef): Buffer = { visitTypeCaseDef(x); buff }
392-
def ++=(x: List[TypeCaseDef]): Buffer = { visitList(x, visitTypeCaseDef); buff }
393-
}
394-
395366
private implicit class PatternOps(buff: Buffer) {
396367
def +=(x: Pattern): Buffer = { visitPattern(x); buff }
397368
def ++=(x: List[Pattern]): Buffer = { visitList(x, visitPattern); buff }
@@ -459,9 +430,6 @@ trait Printers
459430
def showTree(tree: Tree)(implicit ctx: Context): String =
460431
(new Buffer).printTree(tree).result()
461432

462-
def showCaseDef(caseDef: CaseDef)(implicit ctx: Context): String =
463-
(new Buffer).printCaseDef(caseDef).result()
464-
465433
def showPattern(pattern: Pattern)(implicit ctx: Context): String =
466434
(new Buffer).printPattern(pattern).result()
467435

tests/run/tasty-custom-show/quoted_1.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ object Macros {
4242
import reflect._
4343
new Printer {
4444
def showTree(tree: Tree)(implicit ctx: Context): String = "Tree"
45-
def showCaseDef(caseDef: CaseDef)(implicit ctx: Context): String = "CaseDef"
4645
def showPattern(pattern: Pattern)(implicit ctx: Context): String = "Pattern"
4746
def showTypeOrBounds(tpe: TypeOrBounds)(implicit ctx: Context): String = "TypeOrBounds"
4847
def showConstant(const: Constant)(implicit ctx: Context): String = "Constant"

0 commit comments

Comments
 (0)