@@ -10,142 +10,139 @@ trait ExprMap:
1010 import qctx .reflect ._
1111 final class MapChildren () {
1212
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 = {
1514 tree match {
1615 case tree : Term =>
17- transformTerm(tree, TypeRepr .of[Any ])
16+ transformTerm(tree, TypeRepr .of[Any ])(owner)
1817 case tree : Definition =>
19- transformDefinition(tree)
18+ transformDefinition(tree)(owner)
2019 case tree : Import =>
2120 tree
2221 }
2322 }
2423
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 = {
2725 tree match {
2826 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) )
3129 ValDef .copy(tree)(tree.name, tree.tpt, rhs1)
3230 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) ))
3533 case tree : TypeDef =>
3634 tree
3735 case tree : ClassDef =>
38- val newBody = transformStats(tree.body)
36+ val newBody = transformStats(tree.body)(owner)
3937 ClassDef .copy(tree)(tree.name, tree.constructor, tree.parents, tree.derived, tree.self, newBody)
4038 }
4139 }
4240
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 {
4442 case Ident (name) =>
4543 tree
4644 case Select (qualifier, name) =>
47- Select .copy(tree)(transformTerm(qualifier, qualifier.tpe), name)
45+ Select .copy(tree)(transformTerm(qualifier, qualifier.tpe)(owner) , name)
4846 case This (qual) =>
4947 tree
5048 case Super (qual, mix) =>
5149 tree
5250 case tree as Apply (fun, args) =>
5351 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 ))
5553 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)
5755 case _ : Literal =>
5856 tree
5957 case New (tpt) =>
60- New .copy(tree)(transformTypeTree(tpt))
58+ New .copy(tree)(transformTypeTree(tpt)(owner) )
6159 case Typed (expr, tpt) =>
6260 val tp = tpt.tpe match
6361 case AppliedType (TypeRef (ThisType (TypeRef (NoPrefix (), " scala" )), " <repeated>" ), List (tp0 : TypeRepr )) =>
6462 TypeRepr .of[Seq ].appliedTo(tp0)
6563 case tp => tp
66- Typed .copy(tree)(transformTerm(expr, tp), transformTypeTree(tpt))
64+ Typed .copy(tree)(transformTerm(expr, tp)(owner) , transformTypeTree(tpt)(owner ))
6765 case tree : NamedArg =>
68- NamedArg .copy(tree)(tree.name, transformTerm(tree.value, tpe))
66+ NamedArg .copy(tree)(tree.name, transformTerm(tree.value, tpe)(owner) )
6967 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) )
7169 case Block (stats, expr) =>
72- Block .copy(tree)(transformStats(stats), transformTerm(expr, tpe))
70+ Block .copy(tree)(transformStats(stats)(owner) , transformTerm(expr, tpe)(owner ))
7371 case If (cond, thenp, elsep) =>
7472 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) )
7876 case _ : Closure =>
7977 tree
8078 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 ))
8280 case Return (expr) =>
8381 // FIXME
8482 // ctx.owner seems to be set to the wrong symbol
8583 // Return.copy(tree)(transformTerm(expr, expr.tpe))
8684 tree
8785 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 ))
8987 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 )))
9189 case Repeated (elems, elemtpt) =>
92- Repeated .copy(tree)(transformTerms(elems, elemtpt.tpe), elemtpt)
90+ Repeated .copy(tree)(transformTerms(elems, elemtpt.tpe)(owner) , elemtpt)
9391 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) )
9593 }
9694
97- def transformTerm (tree : Term , tpe : TypeRepr )(using ctx : Context ): Term =
95+ def transformTerm (tree : Term , tpe : TypeRepr )(owner : Symbol ): Term =
9896 tree match
9997 case _ : Closure =>
10098 tree
10199 case _ : Inlined =>
102- transformTermChildren(tree, tpe)
100+ transformTermChildren(tree, tpe)(owner)
103101 case _ if tree.isExpr =>
104102 type X
105103 val expr = tree.asExpr.asInstanceOf [Expr [X ]]
106104 val t = tpe.asType.asInstanceOf [Type [X ]]
107105 val transformedExpr = transform(expr)(using qctx, t)
108106 Term .of(transformedExpr)
109107 case _ =>
110- transformTermChildren(tree, tpe)
108+ transformTermChildren(tree, tpe)(owner)
111109
112- def transformTypeTree (tree : TypeTree )(using ctx : Context ): TypeTree = tree
110+ def transformTypeTree (tree : TypeTree )(owner : Symbol ): TypeTree = tree
113111
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 ))
116114
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))
120117
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 ))
123120
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 ))
126123
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 ] =
128125 var tpes2 = tpes // TODO use proper zipConserve
129- trees mapConserve { x =>
126+ trees. mapConserve{ x =>
130127 val tpe :: tail = tpes2
131128 tpes2 = tail
132- transformTerm(x, tpe)
129+ transformTerm(x, tpe)(owner)
133130 }
134131
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) )
137134
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 ))
140137
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 ))
143140
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 ))
146143
147144 }
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 ]
149146 }
150147
151148end ExprMap
0 commit comments