Skip to content

Commit 2015fa1

Browse files
committed
Redifine parent as Term | TypeTree
1 parent f58a4f9 commit 2015fa1

File tree

7 files changed

+54
-69
lines changed

7 files changed

+54
-69
lines changed

compiler/src/dotty/tools/dotc/tasty/TastyImpl.scala

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -213,22 +213,14 @@ object TastyImpl extends scala.tasty.Tasty {
213213

214214
type Parent = tpd.Tree
215215

216-
def parentClassTag: ClassTag[Parent] = implicitly[ClassTag[Parent]]
217-
218-
val TermParent: TermParentExtractor = new TermParentExtractor {
219-
def unapply(x: Parent)(implicit ctx: Context): Option[Term] =
220-
if (x.isTerm) Some(x) else None
221-
}
222-
223-
val TypeParent: TypeParentExtractor = new TypeParentExtractor {
224-
def unapply(x: Parent)(implicit ctx: Context): Option[TypeTree] =
225-
if (x.isTerm) None else Some(x)
226-
}
227-
228216
// ----- Terms ----------------------------------------------------
229217

230218
type Term = tpd.Tree
231219

220+
val Term: TermCaster = new TermCaster {
221+
def unapply(x: Term)(implicit ctx: Context): Boolean = x.isTerm
222+
}
223+
232224
implicit def TermDeco(t: Term): AbstractTerm = new AbstractTerm {
233225
def pos(implicit ctx: Context): Position = new TastyPosition(t.pos)
234226
def tpe(implicit ctx: Context): Types.Type = t.tpe
@@ -458,6 +450,10 @@ object TastyImpl extends scala.tasty.Tasty {
458450

459451
type TypeTree = tpd.Tree
460452

453+
val TypeTree: TypeTreeCaster = new TypeTreeCaster {
454+
def unapply(x: TypeTree)(implicit ctx: Context): Boolean = x.isType
455+
}
456+
461457
def typeTreeClassTag: ClassTag[TypeTree] = implicitly[ClassTag[TypeTree]]
462458

463459
implicit def TypeTreeDeco(x: TypeTree): AbstractTypeTree = new AbstractTypeTree {

library/src/scala/tasty/Tasty.scala

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -162,24 +162,17 @@ abstract class Tasty {
162162

163163
// ----- Parents --------------------------------------------------
164164

165-
type Parent
165+
type Parent /* Term | TypeTree */
166166

167-
implicit def parentClassTag: ClassTag[Parent]
167+
// ----- Terms ----------------------------------------------------
168168

169-
val TermParent: TermParentExtractor
170-
abstract class TermParentExtractor {
171-
def unapply(x: Parent)(implicit ctx: Context): Option[Term]
172-
}
169+
type Term <: Statement with Parent
173170

174-
val TypeParent: TypeParentExtractor
175-
abstract class TypeParentExtractor {
176-
def unapply(x: Parent)(implicit ctx: Context): Option[TypeTree]
171+
val Term: TermCaster
172+
abstract class TermCaster {
173+
def unapply(x: Term)(implicit ctx: Context): Boolean
177174
}
178175

179-
// ----- Terms ----------------------------------------------------
180-
181-
type Term <: Statement
182-
183176
trait AbstractTerm extends Typed with Positioned
184177
implicit def TermDeco(t: Term): AbstractTerm
185178

@@ -342,7 +335,12 @@ abstract class Tasty {
342335

343336
// ----- TypeTrees ------------------------------------------------
344337

345-
type TypeTree <: TypeOrBoundsTree
338+
type TypeTree <: TypeOrBoundsTree with Parent
339+
340+
val TypeTree: TypeTreeCaster
341+
abstract class TypeTreeCaster {
342+
def unapply(x: TypeTree)(implicit ctx: Context): Boolean
343+
}
346344

347345
trait AbstractTypeTree extends Typed with Positioned
348346
implicit def TypeTreeDeco(x: TypeTree): AbstractTypeTree

library/src/scala/tasty/util/TastyPrinter.scala

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,12 @@ class TastyPrinter[T <: Tasty with Singleton](val tasty: T) {
7272
case TypeDef(name, rhs) =>
7373
this += "TypeDef(" += name += ", " += rhs += ")"
7474
case ClassDef(name, constr, parents, self, body) =>
75-
this += "ClassDef(" += name += ", " += constr += ", " ++= parents += ", " += self += ", " ++= body += ")"
75+
this += "ClassDef(" += name += ", " += constr += ", "
76+
visitList[Parent](parents, {
77+
case parent @ Term() => this += parent
78+
case parent @ TypeTree() => this += parent
79+
})
80+
this += ", " += self += ", " ++= body += ")"
7681
case PackageDef(name, members) =>
7782
this += "PackageDef(" += name += ", " ++= members += ")"
7883
case Import(expr, selectors) =>
@@ -194,11 +199,6 @@ class TastyPrinter[T <: Tasty with Singleton](val tasty: T) {
194199
case Annotation(tree) => this += "Annotation(" += tree += ")"
195200
}
196201

197-
def visitParent(x: Parent): Buffer = x match {
198-
case TermParent(term) => this += "TermParent(" += term += ")"
199-
case TypeParent(typeTree) => this += "TypeParent(" += typeTree += ")"
200-
}
201-
202202
def visitId(x: Id): Buffer = {
203203
val Id(name) = x
204204
this += "Id(" += name += ")"
@@ -239,11 +239,6 @@ class TastyPrinter[T <: Tasty with Singleton](val tasty: T) {
239239
def ++=(x: List[CaseDef]): Buffer = { visitList(x, visitCaseDef); buff }
240240
}
241241

242-
private implicit class ParentOps(buff: Buffer) {
243-
def +=(x: Parent): Buffer = { visitParent(x); buff }
244-
def ++=(x: List[Parent]): Buffer = { visitList(x, visitParent); buff }
245-
}
246-
247242
private implicit class PatternOps(buff: Buffer) {
248243
def +=(x: Pattern): Buffer = { visitPattern(x); buff }
249244
def ++=(x: List[Pattern]): Buffer = { visitList(x, visitPattern); buff }

library/src/scala/tasty/util/TreeAccumulator.scala

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,12 @@ abstract class TreeAccumulator[X, T <: Tasty with Singleton](val tasty: T) {
1010
def foldTypeTree(x: X, tree: TypeOrBoundsTree)(implicit ctx: Context): X
1111
def foldCaseDef(x: X, tree: CaseDef)(implicit ctx: Context): X
1212
def foldPattern(x: X, tree: Pattern)(implicit ctx: Context): X
13-
def foldParent(x: X, tree: Parent)(implicit ctx: Context): X
1413

1514
def foldTrees(x: X, trees: Iterable[Tree])(implicit ctx: Context): X = (x /: trees)(foldTree)
1615
def foldTypeTrees(x: X, trees: Iterable[TypeOrBoundsTree])(implicit ctx: Context): X = (x /: trees)(foldTypeTree)
1716
def foldCaseDefs(x: X, trees: Iterable[CaseDef])(implicit ctx: Context): X = (x /: trees)(foldCaseDef)
1817
def foldPatterns(x: X, trees: Iterable[Pattern])(implicit ctx: Context): X = (x /: trees)(foldPattern)
19-
def foldParents(x: X, trees: Iterable[Parent])(implicit ctx: Context): X = (x /: trees)(foldParent)
18+
private def foldParents(x: X, trees: Iterable[Parent])(implicit ctx: Context): X = (x /: trees)(foldOverParent)
2019

2120
def foldOverTree(x: X, tree: Tree)(implicit ctx: Context): X = {
2221
def localCtx(definition: Definition): Context = definition.localContext
@@ -106,9 +105,9 @@ abstract class TreeAccumulator[X, T <: Tasty with Singleton](val tasty: T) {
106105
case TypeTest(tpt) => foldTypeTree(x, tpt)
107106
}
108107

109-
def foldOverParent(x: X, tree: Parent)(implicit ctx: Context): X = tree match {
110-
case TermParent(term) => foldOverTree(x, term)
111-
case TypeParent(typeTree) => foldOverTypeTree(x, typeTree)
108+
private def foldOverParent(x: X, tree: Parent)(implicit ctx: Context): X = tree match {
109+
case tree @ Term() => foldOverTree(x, tree)
110+
case tree @ TypeTree() => foldOverTypeTree(x, tree)
112111
}
113112

114113
}

library/src/scala/tasty/util/TreeTraverser.scala

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,15 @@ abstract class TreeTraverser[T <: Tasty with Singleton](tasty0: T) extends TreeA
99
def traverseTypeTree(tree: TypeOrBoundsTree)(implicit ctx: Context): Unit = traverseTypeTreeChildren(tree)
1010
def traverseCaseDef(tree: CaseDef)(implicit ctx: Context): Unit = traverseCaseDefChildren(tree)
1111
def traversePattern(tree: Pattern)(implicit ctx: Context): Unit = traversePatternChildren(tree)
12-
def traverseParent(tree: Parent)(implicit ctx: Context): Unit = traverseParentChildren(tree)
1312

1413
def foldTree(x: Unit, tree: Tree)(implicit ctx: Context): Unit = traverseTree(tree)
1514
def foldTypeTree(x: Unit, tree: TypeOrBoundsTree)(implicit ctx: Context) = traverseTypeTree(tree)
1615
def foldCaseDef(x: Unit, tree: CaseDef)(implicit ctx: Context) = traverseCaseDef(tree)
1716
def foldPattern(x: Unit, tree: Pattern)(implicit ctx: Context) = traversePattern(tree)
18-
def foldParent(x: Unit, tree: Parent)(implicit ctx: Context) = traverseParent(tree)
1917

2018
protected def traverseTreeChildren(tree: Tree)(implicit ctx: Context): Unit = foldOverTree((), tree)
2119
protected def traverseTypeTreeChildren(tree: TypeOrBoundsTree)(implicit ctx: Context): Unit = foldOverTypeTree((), tree)
2220
protected def traverseCaseDefChildren(tree: CaseDef)(implicit ctx: Context): Unit = foldOverCaseDef((), tree)
2321
protected def traversePatternChildren(tree: Pattern)(implicit ctx: Context): Unit = foldOverPattern((), tree)
24-
protected def traverseParentChildren(tree: Parent)(implicit ctx: Context): Unit = foldOverParent((), tree)
2522

2623
}

0 commit comments

Comments
 (0)