@@ -12,47 +12,43 @@ trait ExprMap {
1212 import qctx .tasty .{_ , given }
1313 class MapChildren () {
1414
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
1617 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
2224 }
2325 }
2426
25- def transformStatement (tree : Statement )(given ctx : Context ): Statement = {
27+ def transformDefinition (tree : Definition )(given ctx : Context ): Definition = {
2628 def localCtx (definition : Definition ): Context = definition.symbol.localContext
2729 tree match {
28- case IsTerm (tree) =>
29- transformTerm(tree, defn.AnyType )
30- case IsValDef (tree) =>
30+ case tree : ValDef =>
3131 implicit val ctx = localCtx(tree)
3232 val rhs1 = tree.rhs.map(x => transformTerm(x, tree.tpt.tpe))
3333 ValDef .copy(tree)(tree.name, tree.tpt, rhs1)
34- case IsDefDef ( tree) =>
34+ case tree : DefDef =>
3535 implicit val ctx = localCtx(tree)
3636 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 =>
3838 tree
39- case IsClassDef ( tree) =>
39+ case tree : ClassDef =>
4040 ClassDef .copy(tree)(tree.name, tree.constructor, tree.parents, tree.derived, tree.self, tree.body)
41- case IsImport (tree) =>
42- tree
4341 }
4442 }
4543
4644 def transformTermChildren (tree : Term , tpe : Type )(given ctx : Context ): Term = tree match {
4745 case Ident (name) =>
4846 tree
4947 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)
5249 case This (qual) =>
5350 tree
5451 case Super (qual, mix) =>
55- // Super.copy(tree)(transformTerm(qual, ???), mix)
5652 tree
5753 case tree @ Apply (fun, args) =>
5854 val MethodType (_, tpes, _) = fun.tpe.widen
@@ -66,52 +62,63 @@ trait ExprMap {
6662 case New (tpt) =>
6763 New .copy(tree)(transformTypeTree(tpt))
6864 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))
7275 case Assign (lhs, rhs) =>
73- Assign .copy(tree)(transformTerm( lhs, ??? ), transformTerm(rhs, ??? ))
76+ Assign .copy(tree)(lhs, transformTerm(rhs, lhs.tpe.widen ))
7477 case Block (stats, expr) =>
7578 Block .copy(tree)(transformStats(stats), transformTerm(expr, tpe))
7679 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 =>
7985 tree
8086 case Match (selector, cases) =>
81- Match .copy(tree)(transformTerm(selector, ??? ), transformCaseDefs(cases))
87+ Match .copy(tree)(transformTerm(selector, ??? ), transformCaseDefs(cases, tpe ))
8288 case Return (expr) =>
8389 Return .copy(tree)(transformTerm(expr, ??? ))
8490 case While (cond, body) =>
85- While .copy(tree)(transformTerm(cond, ??? ), transformTerm(body, ??? ))
91+ While .copy(tree)(transformTerm(cond, defn. BooleanType ), transformTerm(body, defn. AnyType ))
8692 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 )))
8894 case Repeated (elems, elemtpt) =>
8995 Repeated .copy(tree)(transformTerms(elems, elemtpt.tpe), elemtpt)
9096 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)*/ )
9298 }
9399
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 =>
96103 tree
97- case IsInlined (_) | IsSelect (_) =>
104+ case _ : Inlined | _ : Select =>
98105 transformTermChildren(tree, tpe)
99106 case _ =>
100107 tree.tpe.widen match {
101- case IsMethodType (_) | IsPolyType (_) =>
108+ case _ : MethodType | _ : PolyType =>
102109 transformTermChildren(tree, tpe)
103110 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
108115 }
109116 }
110117
111118 def transformTypeTree (tree : TypeTree )(given ctx : Context ): TypeTree = tree
112119
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 ))
115122
116123 def transformTypeCaseDef (tree : TypeCaseDef )(given ctx : Context ): TypeCaseDef = {
117124 TypeCaseDef .copy(tree)(transformTypeTree(tree.pattern), transformTypeTree(tree.rhs))
@@ -120,8 +127,8 @@ trait ExprMap {
120127 def transformStats (trees : List [Statement ])(given ctx : Context ): List [Statement ] =
121128 trees mapConserve (transformStatement(_))
122129
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(_ ))
125132
126133 def transformTerms (trees : List [Term ], tpes : List [Type ])(given ctx : Context ): List [Term ] =
127134 val a = trees.zip(tpes).map {case (x, tpe) => transformTerm(x, tpe) } // TODO zipConserve
@@ -133,15 +140,12 @@ trait ExprMap {
133140 def transformTypeTrees (trees : List [TypeTree ])(given ctx : Context ): List [TypeTree ] =
134141 trees mapConserve (transformTypeTree(_))
135142
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 ))
138145
139146 def transformTypeCaseDefs (trees : List [TypeCaseDef ])(given ctx : Context ): List [TypeCaseDef ] =
140147 trees mapConserve (transformTypeCaseDef(_))
141148
142- def transformSubTrees [Tr <: Tree ](trees : List [Tr ], tpe : Type )(given ctx : Context ): List [Tr ] =
143- transformTrees(trees, tpe).asInstanceOf [List [Tr ]]
144-
145149 }
146150 new MapChildren ().transformTermChildren(e.unseal, tpe.unseal.tpe).seal.cast[T ] // Cast will only fail if this implementation has a bug
147151 }
0 commit comments