@@ -10,142 +10,139 @@ trait ExprMap:
10
10
import qctx .reflect ._
11
11
final class MapChildren () {
12
12
13
- def transformStatement (tree : Statement )(using ctx : Context ): Statement = {
14
- def localCtx (definition : Definition ): Context = definition.symbol.localContext
13
+ def transformStatement (tree : Statement )(owner : Symbol ): Statement = {
15
14
tree match {
16
15
case tree : Term =>
17
- transformTerm(tree, TypeRepr .of[Any ])
16
+ transformTerm(tree, TypeRepr .of[Any ])(owner)
18
17
case tree : Definition =>
19
- transformDefinition(tree)
18
+ transformDefinition(tree)(owner)
20
19
case tree : Import =>
21
20
tree
22
21
}
23
22
}
24
23
25
- def transformDefinition (tree : Definition )(using ctx : Context ): Definition = {
26
- def localCtx (definition : Definition ): Context = definition.symbol.localContext
24
+ def transformDefinition (tree : Definition )(owner : Symbol ): Definition = {
27
25
tree match {
28
26
case tree : ValDef =>
29
- given Context = localCtx( tree)
30
- val rhs1 = tree.rhs.map(x => transformTerm(x, tree.tpt.tpe))
27
+ val owner = tree.symbol
28
+ val rhs1 = tree.rhs.map(x => transformTerm(x, tree.tpt.tpe)(owner) )
31
29
ValDef .copy(tree)(tree.name, tree.tpt, rhs1)
32
30
case tree : DefDef =>
33
- given Context = localCtx( tree)
34
- DefDef .copy(tree)(tree.name, tree.typeParams, tree.paramss, tree.returnTpt, tree.rhs.map(x => transformTerm(x, tree.returnTpt.tpe)))
31
+ val owner = tree.symbol
32
+ DefDef .copy(tree)(tree.name, tree.typeParams, tree.paramss, tree.returnTpt, tree.rhs.map(x => transformTerm(x, tree.returnTpt.tpe)(owner) ))
35
33
case tree : TypeDef =>
36
34
tree
37
35
case tree : ClassDef =>
38
- val newBody = transformStats(tree.body)
36
+ val newBody = transformStats(tree.body)(owner)
39
37
ClassDef .copy(tree)(tree.name, tree.constructor, tree.parents, tree.derived, tree.self, newBody)
40
38
}
41
39
}
42
40
43
- def transformTermChildren (tree : Term , tpe : TypeRepr )(using ctx : Context ): Term = tree match {
41
+ def transformTermChildren (tree : Term , tpe : TypeRepr )(owner : Symbol ): Term = tree match {
44
42
case Ident (name) =>
45
43
tree
46
44
case Select (qualifier, name) =>
47
- Select .copy(tree)(transformTerm(qualifier, qualifier.tpe), name)
45
+ Select .copy(tree)(transformTerm(qualifier, qualifier.tpe)(owner) , name)
48
46
case This (qual) =>
49
47
tree
50
48
case Super (qual, mix) =>
51
49
tree
52
50
case tree as Apply (fun, args) =>
53
51
val MethodType (_, tpes, _) = fun.tpe.widen
54
- Apply .copy(tree)(transformTerm(fun, TypeRepr .of[Any ]), transformTerms(args, tpes))
52
+ Apply .copy(tree)(transformTerm(fun, TypeRepr .of[Any ])(owner) , transformTerms(args, tpes)(owner ))
55
53
case TypeApply (fun, args) =>
56
- TypeApply .copy(tree)(transformTerm(fun, TypeRepr .of[Any ]), args)
54
+ TypeApply .copy(tree)(transformTerm(fun, TypeRepr .of[Any ])(owner) , args)
57
55
case _ : Literal =>
58
56
tree
59
57
case New (tpt) =>
60
- New .copy(tree)(transformTypeTree(tpt))
58
+ New .copy(tree)(transformTypeTree(tpt)(owner) )
61
59
case Typed (expr, tpt) =>
62
60
val tp = tpt.tpe match
63
61
case AppliedType (TypeRef (ThisType (TypeRef (NoPrefix (), " scala" )), " <repeated>" ), List (tp0 : TypeRepr )) =>
64
62
TypeRepr .of[Seq ].appliedTo(tp0)
65
63
case tp => tp
66
- Typed .copy(tree)(transformTerm(expr, tp), transformTypeTree(tpt))
64
+ Typed .copy(tree)(transformTerm(expr, tp)(owner) , transformTypeTree(tpt)(owner ))
67
65
case tree : NamedArg =>
68
- NamedArg .copy(tree)(tree.name, transformTerm(tree.value, tpe))
66
+ NamedArg .copy(tree)(tree.name, transformTerm(tree.value, tpe)(owner) )
69
67
case Assign (lhs, rhs) =>
70
- Assign .copy(tree)(lhs, transformTerm(rhs, lhs.tpe.widen))
68
+ Assign .copy(tree)(lhs, transformTerm(rhs, lhs.tpe.widen)(owner) )
71
69
case Block (stats, expr) =>
72
- Block .copy(tree)(transformStats(stats), transformTerm(expr, tpe))
70
+ Block .copy(tree)(transformStats(stats)(owner) , transformTerm(expr, tpe)(owner ))
73
71
case If (cond, thenp, elsep) =>
74
72
If .copy(tree)(
75
- transformTerm(cond, TypeRepr .of[Boolean ]),
76
- transformTerm(thenp, tpe),
77
- transformTerm(elsep, tpe))
73
+ transformTerm(cond, TypeRepr .of[Boolean ])(owner) ,
74
+ transformTerm(thenp, tpe)(owner) ,
75
+ transformTerm(elsep, tpe)(owner) )
78
76
case _ : Closure =>
79
77
tree
80
78
case Match (selector, cases) =>
81
- Match .copy(tree)(transformTerm(selector, selector.tpe), transformCaseDefs(cases, tpe))
79
+ Match .copy(tree)(transformTerm(selector, selector.tpe)(owner) , transformCaseDefs(cases, tpe)(owner ))
82
80
case Return (expr) =>
83
81
// FIXME
84
82
// ctx.owner seems to be set to the wrong symbol
85
83
// Return.copy(tree)(transformTerm(expr, expr.tpe))
86
84
tree
87
85
case While (cond, body) =>
88
- While .copy(tree)(transformTerm(cond, TypeRepr .of[Boolean ]), transformTerm(body, TypeRepr .of[Any ]))
86
+ While .copy(tree)(transformTerm(cond, TypeRepr .of[Boolean ])(owner) , transformTerm(body, TypeRepr .of[Any ])(owner ))
89
87
case Try (block, cases, finalizer) =>
90
- Try .copy(tree)(transformTerm(block, tpe), transformCaseDefs(cases, TypeRepr .of[Any ]), finalizer.map(x => transformTerm(x, TypeRepr .of[Any ])))
88
+ Try .copy(tree)(transformTerm(block, tpe)(owner) , transformCaseDefs(cases, TypeRepr .of[Any ])(owner) , finalizer.map(x => transformTerm(x, TypeRepr .of[Any ])(owner )))
91
89
case Repeated (elems, elemtpt) =>
92
- Repeated .copy(tree)(transformTerms(elems, elemtpt.tpe), elemtpt)
90
+ Repeated .copy(tree)(transformTerms(elems, elemtpt.tpe)(owner) , elemtpt)
93
91
case Inlined (call, bindings, expansion) =>
94
- Inlined .copy(tree)(call, transformDefinitions(bindings), transformTerm(expansion, tpe)/* ()call.symbol.localContext) */ )
92
+ Inlined .copy(tree)(call, transformDefinitions(bindings)(owner) , transformTerm(expansion, tpe)(owner) )
95
93
}
96
94
97
- def transformTerm (tree : Term , tpe : TypeRepr )(using ctx : Context ): Term =
95
+ def transformTerm (tree : Term , tpe : TypeRepr )(owner : Symbol ): Term =
98
96
tree match
99
97
case _ : Closure =>
100
98
tree
101
99
case _ : Inlined =>
102
- transformTermChildren(tree, tpe)
100
+ transformTermChildren(tree, tpe)(owner)
103
101
case _ if tree.isExpr =>
104
102
type X
105
103
val expr = tree.asExpr.asInstanceOf [Expr [X ]]
106
104
val t = tpe.asType.asInstanceOf [Type [X ]]
107
105
val transformedExpr = transform(expr)(using qctx, t)
108
106
Term .of(transformedExpr)
109
107
case _ =>
110
- transformTermChildren(tree, tpe)
108
+ transformTermChildren(tree, tpe)(owner)
111
109
112
- def transformTypeTree (tree : TypeTree )(using ctx : Context ): TypeTree = tree
110
+ def transformTypeTree (tree : TypeTree )(owner : Symbol ): TypeTree = tree
113
111
114
- def transformCaseDef (tree : CaseDef , tpe : TypeRepr )(using ctx : Context ): CaseDef =
115
- CaseDef .copy(tree)(tree.pattern, tree.guard.map(x => transformTerm(x, TypeRepr .of[Boolean ])) , transformTerm(tree.rhs, tpe))
112
+ def transformCaseDef (tree : CaseDef , tpe : TypeRepr )(owner : Symbol ): CaseDef =
113
+ CaseDef .copy(tree)(tree.pattern, tree.guard.map(x => transformTerm(x, TypeRepr .of[Boolean ])(owner)) , transformTerm(tree.rhs, tpe)(owner ))
116
114
117
- def transformTypeCaseDef (tree : TypeCaseDef )(using ctx : Context ): TypeCaseDef = {
118
- TypeCaseDef .copy(tree)(transformTypeTree(tree.pattern), transformTypeTree(tree.rhs))
119
- }
115
+ def transformTypeCaseDef (tree : TypeCaseDef )(owner : Symbol ): TypeCaseDef =
116
+ TypeCaseDef .copy(tree)(transformTypeTree(tree.pattern)(owner), transformTypeTree(tree.rhs)(owner))
120
117
121
- def transformStats (trees : List [Statement ])(using ctx : Context ): List [Statement ] =
122
- trees mapConserve ( transformStatement(_ ))
118
+ def transformStats (trees : List [Statement ])(owner : Symbol ): List [Statement ] =
119
+ trees. mapConserve(x => transformStatement(x)(owner ))
123
120
124
- def transformDefinitions (trees : List [Definition ])(using ctx : Context ): List [Definition ] =
125
- trees mapConserve ( transformDefinition(_ ))
121
+ def transformDefinitions (trees : List [Definition ])(owner : Symbol ): List [Definition ] =
122
+ trees. mapConserve(x => transformDefinition(x)(owner ))
126
123
127
- def transformTerms (trees : List [Term ], tpes : List [TypeRepr ])(using ctx : Context ): List [Term ] =
124
+ def transformTerms (trees : List [Term ], tpes : List [TypeRepr ])(owner : Symbol ): List [Term ] =
128
125
var tpes2 = tpes // TODO use proper zipConserve
129
- trees mapConserve { x =>
126
+ trees. mapConserve{ x =>
130
127
val tpe :: tail = tpes2
131
128
tpes2 = tail
132
- transformTerm(x, tpe)
129
+ transformTerm(x, tpe)(owner)
133
130
}
134
131
135
- def transformTerms (trees : List [Term ], tpe : TypeRepr )(using ctx : Context ): List [Term ] =
136
- trees.mapConserve(x => transformTerm(x, tpe))
132
+ def transformTerms (trees : List [Term ], tpe : TypeRepr )(owner : Symbol ): List [Term ] =
133
+ trees.mapConserve(x => transformTerm(x, tpe)(owner) )
137
134
138
- def transformTypeTrees (trees : List [TypeTree ])(using ctx : Context ): List [TypeTree ] =
139
- trees mapConserve ( transformTypeTree(_ ))
135
+ def transformTypeTrees (trees : List [TypeTree ])(owner : Symbol ): List [TypeTree ] =
136
+ trees. mapConserve(x => transformTypeTree(x)(owner ))
140
137
141
- def transformCaseDefs (trees : List [CaseDef ], tpe : TypeRepr )(using ctx : Context ): List [CaseDef ] =
142
- trees mapConserve (x => transformCaseDef(x, tpe))
138
+ def transformCaseDefs (trees : List [CaseDef ], tpe : TypeRepr )(owner : Symbol ): List [CaseDef ] =
139
+ trees. mapConserve(x => transformCaseDef(x, tpe)(owner ))
143
140
144
- def transformTypeCaseDefs (trees : List [TypeCaseDef ])(using ctx : Context ): List [TypeCaseDef ] =
145
- trees mapConserve ( transformTypeCaseDef(_ ))
141
+ def transformTypeCaseDefs (trees : List [TypeCaseDef ])(owner : Symbol ): List [TypeCaseDef ] =
142
+ trees. mapConserve(x => transformTypeCaseDef(x)(owner ))
146
143
147
144
}
148
- new MapChildren ().transformTermChildren(Term .of(e), TypeRepr .of[T ]).asExprOf[T ]
145
+ new MapChildren ().transformTermChildren(Term .of(e), TypeRepr .of[T ])( Symbol .spliceOwner) .asExprOf[T ]
149
146
}
150
147
151
148
end ExprMap
0 commit comments