Skip to content

Commit 605d194

Browse files
committed
Add derived field to Tasty reflect
1 parent fbd6359 commit 605d194

File tree

4 files changed

+32
-18
lines changed

4 files changed

+32
-18
lines changed

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ trait TreeOpsImpl extends scala.tasty.reflect.TreeOps with CoreImpl with Helpers
3232
private def rhs = cdef.rhs.asInstanceOf[tpd.Template]
3333
def constructor(implicit ctx: Context): DefDef = rhs.constr
3434
def parents(implicit ctx: Context): List[TermOrTypeTree] = rhs.parents
35+
def derived(implicit ctx: Context): List[TypeTree] = rhs.derived.asInstanceOf[List[TypeTree]]
3536
def self(implicit ctx: Context): Option[tpd.ValDef] = optional(rhs.self)
3637
def body(implicit ctx: Context): List[Statement] = rhs.body
3738
def symbol(implicit ctx: Context): ClassSymbol = cdef.symbol.asClass
@@ -250,14 +251,14 @@ trait TreeOpsImpl extends scala.tasty.reflect.TreeOps with CoreImpl with Helpers
250251

251252
object ClassDef extends ClassDefModule {
252253

253-
def copy(original: ClassDef)(name: String, constr: DefDef, parents: List[TermOrTypeTree], selfOpt: Option[ValDef], body: List[Statement])(implicit ctx: Context): ClassDef = {
254+
def copy(original: ClassDef)(name: String, constr: DefDef, parents: List[TermOrTypeTree], derived: List[TypeTree], selfOpt: Option[ValDef], body: List[Statement])(implicit ctx: Context): ClassDef = {
254255
val Trees.TypeDef(_, originalImpl: tpd.Template) = original
255-
tpd.cpy.TypeDef(original)(name.toTypeName, tpd.cpy.Template(originalImpl)(constr, parents, selfOpt.getOrElse(tpd.EmptyValDef), body))
256+
tpd.cpy.TypeDef(original)(name.toTypeName, tpd.cpy.Template(originalImpl)(constr, parents, derived, selfOpt.getOrElse(tpd.EmptyValDef), body))
256257
}
257258

258-
def unapply(tree: Tree)(implicit ctx: Context): Option[(String, DefDef, List[TermOrTypeTree], Option[ValDef], List[Statement])] = tree match {
259+
def unapply(tree: Tree)(implicit ctx: Context): Option[(String, DefDef, List[TermOrTypeTree], List[TypeTree], Option[ValDef], List[Statement])] = tree match {
259260
case Trees.TypeDef(name, impl: tpd.Template) =>
260-
Some((name.toString, impl.constr, impl.parents, optional(impl.self), impl.body))
261+
Some((name.toString, impl.constr, impl.parents, impl.derived.asInstanceOf[List[TypeTree]], optional(impl.self), impl.body))
261262
case _ => None
262263
}
263264
}

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

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -186,9 +186,10 @@ trait Printers
186186
this += "DefDef(\"" += name += "\", " ++= typeParams += ", " +++= paramss += ", " += returnTpt += ", " += rhs += ")"
187187
case TypeDef(name, rhs) =>
188188
this += "TypeDef(\"" += name += "\", " += rhs += ")"
189-
case ClassDef(name, constr, parents, self, body) =>
189+
case ClassDef(name, constr, parents, derived, self, body) =>
190190
this += "ClassDef(\"" += name += "\", " += constr += ", "
191191
visitList[TermOrTypeTree](parents, visitTermOrTypeTree)
192+
visitList[TypeTree](derived, visitTypeTree)
192193
this += ", " += self += ", " ++= body += ")"
193194
case PackageDef(name, owner) =>
194195
this += "PackageDef(\"" += name += "\", " += owner += ")"
@@ -569,7 +570,7 @@ trait Printers
569570
this += "."
570571
printImportSelectors(selectors)
571572

572-
case IsClassDef(cdef @ ClassDef(name, DefDef(_, targs, argss, _, _), parents, self, stats)) =>
573+
case IsClassDef(cdef @ ClassDef(name, DefDef(_, targs, argss, _, _), parents, derived, self, stats)) =>
573574
printDefAnnotations(cdef)
574575

575576
val flags = cdef.symbol.flags
@@ -625,6 +626,11 @@ trait Printers
625626
}
626627
printSeparated(parents1)
627628

629+
if (derived.nonEmpty) {
630+
this += highlightKeyword(" derives ", color)
631+
printTypeTrees(derived, ", ")
632+
}
633+
628634
def keepDefinition(d: Definition): Boolean = {
629635
val flags = d.symbol.flags
630636
def isCaseClassUnOverridableMethod: Boolean = {
@@ -1004,19 +1010,25 @@ trait Printers
10041010
printSeparated(stats)
10051011
}
10061012

1007-
def printTrees(trees: List[Tree], sep: String): Buffer = {
1008-
def printSeparated(list: List[Tree]): Unit = list match {
1013+
def printList[T](xs: List[T], sep: String, print: T => Buffer): Buffer = {
1014+
def printSeparated(list: List[T]): Unit = list match {
10091015
case Nil =>
1010-
case x :: Nil => printTree(x)
1016+
case x :: Nil => print(x)
10111017
case x :: xs =>
1012-
printTree(x)
1018+
print(x)
10131019
this += sep
10141020
printSeparated(xs)
10151021
}
1016-
printSeparated(trees)
1022+
printSeparated(xs)
10171023
this
10181024
}
10191025

1026+
def printTrees(trees: List[Tree], sep: String): Buffer =
1027+
printList(trees, sep, printTree)
1028+
1029+
def printTypeTrees(trees: List[TypeTree], sep: String): Buffer =
1030+
printList(trees, sep, printTypeTree)
1031+
10201032
def printTypes(trees: List[Type], sep: String): Buffer = {
10211033
def printSeparated(list: List[Type]): Unit = list match {
10221034
case Nil =>
@@ -1201,7 +1213,7 @@ trait Printers
12011213
val name = arg.name
12021214
arg.symbol.owner match {
12031215
case IsDefSymbol(sym) if sym.name == "<init>" =>
1204-
val ClassDef(_, _, _, _, body) = sym.owner.asClass.tree
1216+
val ClassDef(_, _, _, _, _, body) = sym.owner.asClass.tree
12051217
body.collectFirst {
12061218
case IsValDef(vdef @ ValDef(`name`, _, _)) if vdef.symbol.flags.is(Flags.ParamAccessor) =>
12071219
if (!vdef.symbol.flags.is(Flags.Local)) {
@@ -1552,7 +1564,7 @@ trait Printers
15521564
def printDefinitionName(sym: Definition): Buffer = sym match {
15531565
case ValDef(name, _, _) => this += highlightValDef(name, color)
15541566
case DefDef(name, _, _, _, _) => this += highlightValDef(name, color)
1555-
case ClassDef(name, _, _, _, _) => this += highlightTypeDef(name.stripSuffix("$"), color)
1567+
case ClassDef(name, _, _, _, _, _) => this += highlightTypeDef(name.stripSuffix("$"), color)
15561568
case TypeDef(name, _) => this += highlightTypeDef(name, color)
15571569
case PackageDef(name, _) => this += highlightTypeDef(name, color)
15581570
}

library/src/scala/tasty/reflect/TreeOps.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,13 +109,14 @@ trait TreeOps extends Core {
109109
val ClassDef: ClassDefModule
110110
abstract class ClassDefModule {
111111
// TODO def apply(name: String, constr: DefDef, parents: List[TermOrTypeTree], selfOpt: Option[ValDef], body: List[Statement])(implicit ctx: Context): ClassDef
112-
def copy(original: ClassDef)(name: String, constr: DefDef, parents: List[TermOrTypeTree], selfOpt: Option[ValDef], body: List[Statement])(implicit ctx: Context): ClassDef
113-
def unapply(tree: Tree)(implicit ctx: Context): Option[(String, DefDef, List[TermOrTypeTree], Option[ValDef], List[Statement])]
112+
def copy(original: ClassDef)(name: String, constr: DefDef, parents: List[TermOrTypeTree], derived: List[TypeTree], selfOpt: Option[ValDef], body: List[Statement])(implicit ctx: Context): ClassDef
113+
def unapply(tree: Tree)(implicit ctx: Context): Option[(String, DefDef, List[TermOrTypeTree], List[TypeTree], Option[ValDef], List[Statement])]
114114
}
115115

116116
trait ClassDefAPI {
117117
def constructor(implicit ctx: Context): DefDef
118118
def parents(implicit ctx: Context): List[TermOrTypeTree]
119+
def derived(implicit ctx: Context): List[TypeTree]
119120
def self(implicit ctx: Context): Option[ValDef]
120121
def body(implicit ctx: Context): List[Statement]
121122

library/src/scala/tasty/reflect/TreeUtils.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,9 @@ trait TreeUtils
7777
case IsDefinition(tdef @ TypeDef(_, rhs)) =>
7878
implicit val ctx = localCtx(tdef)
7979
foldTypeTree(x, rhs)
80-
case IsDefinition(cdef @ ClassDef(_, constr, parents, self, body)) =>
80+
case IsDefinition(cdef @ ClassDef(_, constr, parents, derived, self, body)) =>
8181
implicit val ctx = localCtx(cdef)
82-
foldTrees(foldTrees(foldParents(foldTree(x, constr), parents), self), body)
82+
foldTrees(foldTrees(foldTypeTrees(foldParents(foldTree(x, constr), parents), derived), self), body)
8383
case Import(expr, selectors) =>
8484
foldTree(x, expr)
8585
case IsPackageClause(clause @ PackageClause(pid, stats)) =>
@@ -183,7 +183,7 @@ trait TreeUtils
183183
implicit val ctx = localCtx(tree)
184184
TypeDef.copy(tree)(tree.name, transformTypeOrBoundsTree(tree.rhs))
185185
case IsClassDef(tree) =>
186-
ClassDef.copy(tree)(tree.name, tree.constructor, tree.parents, tree.self, tree.body)
186+
ClassDef.copy(tree)(tree.name, tree.constructor, tree.parents, tree.derived, tree.self, tree.body)
187187
case IsImport(tree) =>
188188
Import.copy(tree)(transformTerm(tree.expr), tree.selectors)
189189
}

0 commit comments

Comments
 (0)