@@ -2731,265 +2731,7 @@ class Reflection(private[scala] val internal: CompilerInterface) { self =>
27312731 // UTILS //
27322732 // /////////////
27332733
2734- abstract class TreeAccumulator [X ] {
2735-
2736- // Ties the knot of the traversal: call `foldOver(x, tree))` to dive in the `tree` node.
2737- def foldTree (x : X , tree : Tree )(given ctx : Context ): X
2738-
2739- def foldTrees (x : X , trees : Iterable [Tree ])(given ctx : Context ): X = trees.foldLeft(x)(foldTree)
2740-
2741- def foldOverTree (x : X , tree : Tree )(given ctx : Context ): X = {
2742- def localCtx (definition : Definition ): Context = definition.symbol.localContext
2743- tree match {
2744- case Ident (_) =>
2745- x
2746- case Select (qualifier, _) =>
2747- foldTree(x, qualifier)
2748- case This (qual) =>
2749- x
2750- case Super (qual, _) =>
2751- foldTree(x, qual)
2752- case Apply (fun, args) =>
2753- foldTrees(foldTree(x, fun), args)
2754- case TypeApply (fun, args) =>
2755- foldTrees(foldTree(x, fun), args)
2756- case Literal (const) =>
2757- x
2758- case New (tpt) =>
2759- foldTree(x, tpt)
2760- case Typed (expr, tpt) =>
2761- foldTree(foldTree(x, expr), tpt)
2762- case NamedArg (_, arg) =>
2763- foldTree(x, arg)
2764- case Assign (lhs, rhs) =>
2765- foldTree(foldTree(x, lhs), rhs)
2766- case Block (stats, expr) =>
2767- foldTree(foldTrees(x, stats), expr)
2768- case If (cond, thenp, elsep) =>
2769- foldTree(foldTree(foldTree(x, cond), thenp), elsep)
2770- case While (cond, body) =>
2771- foldTree(foldTree(x, cond), body)
2772- case Closure (meth, tpt) =>
2773- foldTree(x, meth)
2774- case Match (selector, cases) =>
2775- foldTrees(foldTree(x, selector), cases)
2776- case Return (expr) =>
2777- foldTree(x, expr)
2778- case Try (block, handler, finalizer) =>
2779- foldTrees(foldTrees(foldTree(x, block), handler), finalizer)
2780- case Repeated (elems, elemtpt) =>
2781- foldTrees(foldTree(x, elemtpt), elems)
2782- case Inlined (call, bindings, expansion) =>
2783- foldTree(foldTrees(x, bindings), expansion)
2784- case vdef @ ValDef (_, tpt, rhs) =>
2785- val ctx = localCtx(vdef)
2786- given Context = ctx
2787- foldTrees(foldTree(x, tpt), rhs)
2788- case ddef @ DefDef (_, tparams, vparamss, tpt, rhs) =>
2789- val ctx = localCtx(ddef)
2790- given Context = ctx
2791- foldTrees(foldTree(vparamss.foldLeft(foldTrees(x, tparams))(foldTrees), tpt), rhs)
2792- case tdef @ TypeDef (_, rhs) =>
2793- val ctx = localCtx(tdef)
2794- given Context = ctx
2795- foldTree(x, rhs)
2796- case cdef @ ClassDef (_, constr, parents, derived, self, body) =>
2797- val ctx = localCtx(cdef)
2798- given Context = ctx
2799- foldTrees(foldTrees(foldTrees(foldTrees(foldTree(x, constr), parents), derived), self), body)
2800- case Import (expr, _) =>
2801- foldTree(x, expr)
2802- case clause @ PackageClause (pid, stats) =>
2803- foldTrees(foldTree(x, pid), stats)(given clause .symbol.localContext)
2804- case Inferred () => x
2805- case TypeIdent (_) => x
2806- case TypeSelect (qualifier, _) => foldTree(x, qualifier)
2807- case Projection (qualifier, _) => foldTree(x, qualifier)
2808- case Singleton (ref) => foldTree(x, ref)
2809- case Refined (tpt, refinements) => foldTrees(foldTree(x, tpt), refinements)
2810- case Applied (tpt, args) => foldTrees(foldTree(x, tpt), args)
2811- case ByName (result) => foldTree(x, result)
2812- case Annotated (arg, annot) => foldTree(foldTree(x, arg), annot)
2813- case LambdaTypeTree (typedefs, arg) => foldTree(foldTrees(x, typedefs), arg)
2814- case TypeBind (_, tbt) => foldTree(x, tbt)
2815- case TypeBlock (typedefs, tpt) => foldTree(foldTrees(x, typedefs), tpt)
2816- case MatchTypeTree (boundopt, selector, cases) =>
2817- foldTrees(foldTree(boundopt.fold(x)(foldTree(x, _)), selector), cases)
2818- case WildcardTypeTree () => x
2819- case TypeBoundsTree (lo, hi) => foldTree(foldTree(x, lo), hi)
2820- case CaseDef (pat, guard, body) => foldTree(foldTrees(foldTree(x, pat), guard), body)
2821- case TypeCaseDef (pat, body) => foldTree(foldTree(x, pat), body)
2822- case Bind (_, body) => foldTree(x, body)
2823- case Unapply (fun, implicits, patterns) => foldTrees(foldTrees(foldTree(x, fun), implicits), patterns)
2824- case Alternatives (patterns) => foldTrees(x, patterns)
2825- }
2826- }
2827- }
2828-
2829- abstract class TreeTraverser extends TreeAccumulator [Unit ] {
2830-
2831- def traverseTree (tree : Tree )(given ctx : Context ): Unit = traverseTreeChildren(tree)
2832-
2833- def foldTree (x : Unit , tree : Tree )(given ctx : Context ): Unit = traverseTree(tree)
2834-
2835- protected def traverseTreeChildren (tree : Tree )(given ctx : Context ): Unit = foldOverTree((), tree)
2836-
2837- }
2838-
2839- abstract class TreeMap { self =>
2840-
2841- def transformTree (tree : Tree )(given ctx : Context ): Tree = {
2842- tree match {
2843- case tree : PackageClause =>
2844- PackageClause .copy(tree)(transformTerm(tree.pid).asInstanceOf [Ref ], transformTrees(tree.stats)(given tree .symbol.localContext))
2845- case tree : Import =>
2846- Import .copy(tree)(transformTerm(tree.expr), tree.selectors)
2847- case tree : Statement =>
2848- transformStatement(tree)
2849- case tree : TypeTree => transformTypeTree(tree)
2850- case tree : TypeBoundsTree => tree // TODO traverse tree
2851- case tree : WildcardTypeTree => tree // TODO traverse tree
2852- case tree : CaseDef =>
2853- transformCaseDef(tree)
2854- case tree : TypeCaseDef =>
2855- transformTypeCaseDef(tree)
2856- case pattern : Bind =>
2857- Bind .copy(pattern)(pattern.name, pattern.pattern)
2858- case pattern : Unapply =>
2859- Unapply .copy(pattern)(transformTerm(pattern.fun), transformSubTrees(pattern.implicits), transformTrees(pattern.patterns))
2860- case pattern : Alternatives =>
2861- Alternatives .copy(pattern)(transformTrees(pattern.patterns))
2862- }
2863- }
2864-
2865- def transformStatement (tree : Statement )(given ctx : Context ): Statement = {
2866- def localCtx (definition : Definition ): Context = definition.symbol.localContext
2867- tree match {
2868- case tree : Term =>
2869- transformTerm(tree)
2870- case tree : ValDef =>
2871- val ctx = localCtx(tree)
2872- given Context = ctx
2873- val tpt1 = transformTypeTree(tree.tpt)
2874- val rhs1 = tree.rhs.map(x => transformTerm(x))
2875- ValDef .copy(tree)(tree.name, tpt1, rhs1)
2876- case tree : DefDef =>
2877- val ctx = localCtx(tree)
2878- given Context = ctx
2879- DefDef .copy(tree)(tree.name, transformSubTrees(tree.typeParams), tree.paramss mapConserve (transformSubTrees(_)), transformTypeTree(tree.returnTpt), tree.rhs.map(x => transformTerm(x)))
2880- case tree : TypeDef =>
2881- val ctx = localCtx(tree)
2882- given Context = ctx
2883- TypeDef .copy(tree)(tree.name, transformTree(tree.rhs))
2884- case tree : ClassDef =>
2885- ClassDef .copy(tree)(tree.name, tree.constructor, tree.parents, tree.derived, tree.self, tree.body)
2886- case tree : Import =>
2887- Import .copy(tree)(transformTerm(tree.expr), tree.selectors)
2888- }
2889- }
2890-
2891- def transformTerm (tree : Term )(given ctx : Context ): Term = {
2892- tree match {
2893- case Ident (name) =>
2894- tree
2895- case Select (qualifier, name) =>
2896- Select .copy(tree)(transformTerm(qualifier), name)
2897- case This (qual) =>
2898- tree
2899- case Super (qual, mix) =>
2900- Super .copy(tree)(transformTerm(qual), mix)
2901- case Apply (fun, args) =>
2902- Apply .copy(tree)(transformTerm(fun), transformTerms(args))
2903- case TypeApply (fun, args) =>
2904- TypeApply .copy(tree)(transformTerm(fun), transformTypeTrees(args))
2905- case Literal (const) =>
2906- tree
2907- case New (tpt) =>
2908- New .copy(tree)(transformTypeTree(tpt))
2909- case Typed (expr, tpt) =>
2910- Typed .copy(tree)(transformTerm(expr), transformTypeTree(tpt))
2911- case tree : NamedArg =>
2912- NamedArg .copy(tree)(tree.name, transformTerm(tree.value))
2913- case Assign (lhs, rhs) =>
2914- Assign .copy(tree)(transformTerm(lhs), transformTerm(rhs))
2915- case Block (stats, expr) =>
2916- Block .copy(tree)(transformStats(stats), transformTerm(expr))
2917- case If (cond, thenp, elsep) =>
2918- If .copy(tree)(transformTerm(cond), transformTerm(thenp), transformTerm(elsep))
2919- case Closure (meth, tpt) =>
2920- Closure .copy(tree)(transformTerm(meth), tpt)
2921- case Match (selector, cases) =>
2922- Match .copy(tree)(transformTerm(selector), transformCaseDefs(cases))
2923- case Return (expr) =>
2924- Return .copy(tree)(transformTerm(expr))
2925- case While (cond, body) =>
2926- While .copy(tree)(transformTerm(cond), transformTerm(body))
2927- case Try (block, cases, finalizer) =>
2928- Try .copy(tree)(transformTerm(block), transformCaseDefs(cases), finalizer.map(x => transformTerm(x)))
2929- case Repeated (elems, elemtpt) =>
2930- Repeated .copy(tree)(transformTerms(elems), transformTypeTree(elemtpt))
2931- case Inlined (call, bindings, expansion) =>
2932- Inlined .copy(tree)(call, transformSubTrees(bindings), transformTerm(expansion)/* ()call.symbol.localContext)*/ )
2933- }
2934- }
2935-
2936- def transformTypeTree (tree : TypeTree )(given ctx : Context ): TypeTree = tree match {
2937- case Inferred () => tree
2938- case tree : TypeIdent => tree
2939- case tree : TypeSelect =>
2940- TypeSelect .copy(tree)(tree.qualifier, tree.name)
2941- case tree : Projection =>
2942- Projection .copy(tree)(tree.qualifier, tree.name)
2943- case tree : Annotated =>
2944- Annotated .copy(tree)(tree.arg, tree.annotation)
2945- case tree : Singleton =>
2946- Singleton .copy(tree)(transformTerm(tree.ref))
2947- case tree : Refined =>
2948- Refined .copy(tree)(transformTypeTree(tree.tpt), transformTrees(tree.refinements).asInstanceOf [List [Definition ]])
2949- case tree : Applied =>
2950- Applied .copy(tree)(transformTypeTree(tree.tpt), transformTrees(tree.args))
2951- case tree : MatchTypeTree =>
2952- MatchTypeTree .copy(tree)(tree.bound.map(b => transformTypeTree(b)), transformTypeTree(tree.selector), transformTypeCaseDefs(tree.cases))
2953- case tree : ByName =>
2954- ByName .copy(tree)(transformTypeTree(tree.result))
2955- case tree : LambdaTypeTree =>
2956- LambdaTypeTree .copy(tree)(transformSubTrees(tree.tparams), transformTree(tree.body))(given tree .symbol.localContext)
2957- case tree : TypeBind =>
2958- TypeBind .copy(tree)(tree.name, tree.body)
2959- case tree : TypeBlock =>
2960- TypeBlock .copy(tree)(tree.aliases, tree.tpt)
2961- }
2962-
2963- def transformCaseDef (tree : CaseDef )(given ctx : Context ): CaseDef = {
2964- CaseDef .copy(tree)(transformTree(tree.pattern), tree.guard.map(transformTerm), transformTerm(tree.rhs))
2965- }
2966-
2967- def transformTypeCaseDef (tree : TypeCaseDef )(given ctx : Context ): TypeCaseDef = {
2968- TypeCaseDef .copy(tree)(transformTypeTree(tree.pattern), transformTypeTree(tree.rhs))
2969- }
2970-
2971- def transformStats (trees : List [Statement ])(given ctx : Context ): List [Statement ] =
2972- trees mapConserve (transformStatement(_))
2973-
2974- def transformTrees (trees : List [Tree ])(given ctx : Context ): List [Tree ] =
2975- trees mapConserve (transformTree(_))
2976-
2977- def transformTerms (trees : List [Term ])(given ctx : Context ): List [Term ] =
2978- trees mapConserve (transformTerm(_))
2979-
2980- def transformTypeTrees (trees : List [TypeTree ])(given ctx : Context ): List [TypeTree ] =
2981- trees mapConserve (transformTypeTree(_))
2982-
2983- def transformCaseDefs (trees : List [CaseDef ])(given ctx : Context ): List [CaseDef ] =
2984- trees mapConserve (transformCaseDef(_))
2985-
2986- def transformTypeCaseDefs (trees : List [TypeCaseDef ])(given ctx : Context ): List [TypeCaseDef ] =
2987- trees mapConserve (transformTypeCaseDef(_))
2988-
2989- def transformSubTrees [Tr <: Tree ](trees : List [Tr ])(given ctx : Context ): List [Tr ] =
2990- transformTrees(trees).asInstanceOf [List [Tr ]]
2991-
2992- }
2734+ // TODO extract from Reflection
29932735
29942736 /** Bind the `rhs` to a `val` and use it in `body` */
29952737 def let (rhs : Term )(body : Ident => Term )(given ctx : Context ): Term = {
0 commit comments