@@ -12,47 +12,43 @@ trait ExprMap {
12
12
import qctx .tasty .{_ , given }
13
13
class MapChildren () {
14
14
15
- def transformTree (tree : Tree , tpe : Type )(given ctx : Context ): Tree = {
15
+ def transformStatement (tree : Statement )(given ctx : Context ): Statement = {
16
+ def localCtx (definition : Definition ): Context = definition.symbol.localContext
16
17
tree match {
17
- case IsStatement (tree) =>
18
- transformStatement(tree)
19
- case IsCaseDef (tree) =>
20
- transformCaseDef(tree)
21
- case _ => tree
18
+ case tree : Term =>
19
+ transformTerm(tree, defn.AnyType )
20
+ case tree : Definition =>
21
+ transformDefinition(tree)
22
+ case tree : Import =>
23
+ tree
22
24
}
23
25
}
24
26
25
- def transformStatement (tree : Statement )(given ctx : Context ): Statement = {
27
+ def transformDefinition (tree : Definition )(given ctx : Context ): Definition = {
26
28
def localCtx (definition : Definition ): Context = definition.symbol.localContext
27
29
tree match {
28
- case IsTerm (tree) =>
29
- transformTerm(tree, defn.AnyType )
30
- case IsValDef (tree) =>
30
+ case tree : ValDef =>
31
31
implicit val ctx = localCtx(tree)
32
32
val rhs1 = tree.rhs.map(x => transformTerm(x, tree.tpt.tpe))
33
33
ValDef .copy(tree)(tree.name, tree.tpt, rhs1)
34
- case IsDefDef ( tree) =>
34
+ case tree : DefDef =>
35
35
implicit val ctx = localCtx(tree)
36
36
DefDef .copy(tree)(tree.name, tree.typeParams, tree.paramss, tree.returnTpt, tree.rhs.map(x => transformTerm(x, tree.returnTpt.tpe)))
37
- case IsTypeDef ( tree) =>
37
+ case tree : TypeDef =>
38
38
tree
39
- case IsClassDef ( tree) =>
39
+ case tree : ClassDef =>
40
40
ClassDef .copy(tree)(tree.name, tree.constructor, tree.parents, tree.derived, tree.self, tree.body)
41
- case IsImport (tree) =>
42
- tree
43
41
}
44
42
}
45
43
46
44
def transformTermChildren (tree : Term , tpe : Type )(given ctx : Context ): Term = tree match {
47
45
case Ident (name) =>
48
46
tree
49
47
case Select (qualifier, name) =>
50
- val IsType (qualTpe) = tree.symbol.owner.typeRef
51
- Select .copy(tree)(transformTerm(qualifier, qualTpe), name)
48
+ Select .copy(tree)(transformTerm(qualifier, qualifier.tpe.widen), name)
52
49
case This (qual) =>
53
50
tree
54
51
case Super (qual, mix) =>
55
- // Super.copy(tree)(transformTerm(qual, ???), mix)
56
52
tree
57
53
case tree @ Apply (fun, args) =>
58
54
val MethodType (_, tpes, _) = fun.tpe.widen
@@ -66,52 +62,63 @@ trait ExprMap {
66
62
case New (tpt) =>
67
63
New .copy(tree)(transformTypeTree(tpt))
68
64
case Typed (expr, tpt) =>
69
- Typed .copy(tree)(transformTerm(expr, tpt.tpe), transformTypeTree(tpt))
70
- case IsNamedArg (tree) =>
71
- NamedArg .copy(tree)(tree.name, transformTerm(tree.value, ??? ))
65
+ val tp = tpt.tpe match
66
+ // TODO improve code
67
+ case AppliedType (TypeRef (ThisType (TypeRef (NoPrefix (), " scala" )), " <repeated>" ), List (IsType (tp0))) =>
68
+ type T
69
+ val a = tp0.seal.asInstanceOf [quoted.Type [T ]]
70
+ ' [Seq [$a]].unseal.tpe
71
+ case tp => tp
72
+ Typed .copy(tree)(transformTerm(expr, tp), transformTypeTree(tpt))
73
+ case tree : NamedArg =>
74
+ NamedArg .copy(tree)(tree.name, transformTerm(tree.value, tpe))
72
75
case Assign (lhs, rhs) =>
73
- Assign .copy(tree)(transformTerm( lhs, ??? ), transformTerm(rhs, ??? ))
76
+ Assign .copy(tree)(lhs, transformTerm(rhs, lhs.tpe.widen ))
74
77
case Block (stats, expr) =>
75
78
Block .copy(tree)(transformStats(stats), transformTerm(expr, tpe))
76
79
case If (cond, thenp, elsep) =>
77
- If .copy(tree)(transformTerm(cond, ??? ), transformTerm(thenp, ??? ), transformTerm(elsep, ??? ))
78
- case IsClosure (_) =>
80
+ If .copy(tree)(
81
+ transformTerm(cond, defn.BooleanType ),
82
+ transformTerm(thenp, tpe),
83
+ transformTerm(elsep, tpe))
84
+ case _ : Closure =>
79
85
tree
80
86
case Match (selector, cases) =>
81
- Match .copy(tree)(transformTerm(selector, ??? ), transformCaseDefs(cases))
87
+ Match .copy(tree)(transformTerm(selector, ??? ), transformCaseDefs(cases, tpe ))
82
88
case Return (expr) =>
83
89
Return .copy(tree)(transformTerm(expr, ??? ))
84
90
case While (cond, body) =>
85
- While .copy(tree)(transformTerm(cond, ??? ), transformTerm(body, ??? ))
91
+ While .copy(tree)(transformTerm(cond, defn. BooleanType ), transformTerm(body, defn. AnyType ))
86
92
case Try (block, cases, finalizer) =>
87
- Try .copy(tree)(transformTerm(block, tpe), transformCaseDefs(cases), finalizer.map(x => transformTerm(x, defn.AnyType )))
93
+ Try .copy(tree)(transformTerm(block, tpe), transformCaseDefs(cases, defn. AnyType ), finalizer.map(x => transformTerm(x, defn.AnyType )))
88
94
case Repeated (elems, elemtpt) =>
89
95
Repeated .copy(tree)(transformTerms(elems, elemtpt.tpe), elemtpt)
90
96
case Inlined (call, bindings, expansion) =>
91
- Inlined .copy(tree)(call, transformSubTrees (bindings, defn. AnyType ), transformTerm(expansion, tpe)/* ()call.symbol.localContext)*/ )
97
+ Inlined .copy(tree)(call, transformDefinitions (bindings), transformTerm(expansion, tpe)/* ()call.symbol.localContext)*/ )
92
98
}
93
99
94
- def transformTerm (tree : Term , tpe : Type )(given ctx : Context ): Term = tree match {
95
- case IsClosure (_) =>
100
+ def transformTerm (tree : Term , tpe : Type )(given ctx : Context ): Term =
101
+ tree match {
102
+ case _ : Closure =>
96
103
tree
97
- case IsInlined (_) | IsSelect (_) =>
104
+ case _ : Inlined | _ : Select =>
98
105
transformTermChildren(tree, tpe)
99
106
case _ =>
100
107
tree.tpe.widen match {
101
- case IsMethodType (_) | IsPolyType (_) =>
108
+ case _ : MethodType | _ : PolyType =>
102
109
transformTermChildren(tree, tpe)
103
110
case _ =>
104
- tree.seal match {
105
- case ' { $x : $t } => map(x).unseal
106
- case _ => ???
107
- }
111
+ type X
112
+ val expr = tree.seal. asInstanceOf [ Expr [ X ]]
113
+ val t = tpe.seal. asInstanceOf [quoted. Type [ X ]]
114
+ map(expr)( given qctx , t).unseal
108
115
}
109
116
}
110
117
111
118
def transformTypeTree (tree : TypeTree )(given ctx : Context ): TypeTree = tree
112
119
113
- def transformCaseDef (tree : CaseDef )(given ctx : Context ): CaseDef =
114
- CaseDef .copy(tree)(tree.pattern, tree.guard.map(x => transformTerm(x, ??? )), transformTerm(tree.rhs, ??? ))
120
+ def transformCaseDef (tree : CaseDef , tpe : Type )(given ctx : Context ): CaseDef =
121
+ CaseDef .copy(tree)(tree.pattern, tree.guard.map(x => transformTerm(x, defn. BooleanType )), transformTerm(tree.rhs, tpe ))
115
122
116
123
def transformTypeCaseDef (tree : TypeCaseDef )(given ctx : Context ): TypeCaseDef = {
117
124
TypeCaseDef .copy(tree)(transformTypeTree(tree.pattern), transformTypeTree(tree.rhs))
@@ -120,8 +127,8 @@ trait ExprMap {
120
127
def transformStats (trees : List [Statement ])(given ctx : Context ): List [Statement ] =
121
128
trees mapConserve (transformStatement(_))
122
129
123
- def transformTrees (trees : List [Tree ], tpe : Type )(given ctx : Context ): List [Tree ] =
124
- trees mapConserve (x => transformTree(x, tpe ))
130
+ def transformDefinitions (trees : List [Definition ] )(given ctx : Context ): List [Definition ] =
131
+ trees mapConserve (transformDefinition(_ ))
125
132
126
133
def transformTerms (trees : List [Term ], tpes : List [Type ])(given ctx : Context ): List [Term ] =
127
134
val a = trees.zip(tpes).map {case (x, tpe) => transformTerm(x, tpe) } // TODO zipConserve
@@ -133,15 +140,12 @@ trait ExprMap {
133
140
def transformTypeTrees (trees : List [TypeTree ])(given ctx : Context ): List [TypeTree ] =
134
141
trees mapConserve (transformTypeTree(_))
135
142
136
- def transformCaseDefs (trees : List [CaseDef ])(given ctx : Context ): List [CaseDef ] =
137
- trees mapConserve (transformCaseDef(_ ))
143
+ def transformCaseDefs (trees : List [CaseDef ], tpe : Type )(given ctx : Context ): List [CaseDef ] =
144
+ trees mapConserve (x => transformCaseDef(x, tpe ))
138
145
139
146
def transformTypeCaseDefs (trees : List [TypeCaseDef ])(given ctx : Context ): List [TypeCaseDef ] =
140
147
trees mapConserve (transformTypeCaseDef(_))
141
148
142
- def transformSubTrees [Tr <: Tree ](trees : List [Tr ], tpe : Type )(given ctx : Context ): List [Tr ] =
143
- transformTrees(trees, tpe).asInstanceOf [List [Tr ]]
144
-
145
149
}
146
150
new MapChildren ().transformTermChildren(e.unseal, tpe.unseal.tpe).seal.cast[T ] // Cast will only fail if this implementation has a bug
147
151
}
0 commit comments