@@ -1069,95 +1069,100 @@ object Trees {
1069
1069
Template (tree : Tree )(constr, parents, self, body)
1070
1070
}
1071
1071
1072
+ /** Hook to indicate that a transform of some subtree should be skipped */
1073
+ protected def skipTransform (tree : Tree )(implicit ctx : Context ): Boolean = false
1074
+
1072
1075
abstract class TreeMap (val cpy : TreeCopier = inst.cpy) {
1073
1076
1074
- def transform (tree : Tree )(implicit ctx : Context ): Tree = tree match {
1075
- case Ident (name) =>
1076
- tree
1077
- case Select (qualifier, name) =>
1078
- cpy.Select (tree)(transform(qualifier), name)
1079
- case This (qual) =>
1080
- tree
1081
- case Super (qual, mix) =>
1082
- cpy.Super (tree)(transform(qual), mix)
1083
- case Apply (fun, args) =>
1084
- cpy.Apply (tree)(transform(fun), transform(args))
1085
- case TypeApply (fun, args) =>
1086
- cpy.TypeApply (tree)(transform(fun), transform(args))
1087
- case Literal (const) =>
1088
- tree
1089
- case New (tpt) =>
1090
- cpy.New (tree)(transform(tpt))
1091
- case Typed (expr, tpt) =>
1092
- cpy.Typed (tree)(transform(expr), transform(tpt))
1093
- case NamedArg (name, arg) =>
1094
- cpy.NamedArg (tree)(name, transform(arg))
1095
- case Assign (lhs, rhs) =>
1096
- cpy.Assign (tree)(transform(lhs), transform(rhs))
1097
- case Block (stats, expr) =>
1098
- cpy.Block (tree)(transformStats(stats), transform(expr))
1099
- case If (cond, thenp, elsep) =>
1100
- cpy.If (tree)(transform(cond), transform(thenp), transform(elsep))
1101
- case Closure (env, meth, tpt) =>
1102
- cpy.Closure (tree)(transform(env), transform(meth), transform(tpt))
1103
- case Match (selector, cases) =>
1104
- cpy.Match (tree)(transform(selector), transformSub(cases))
1105
- case CaseDef (pat, guard, body) =>
1106
- cpy.CaseDef (tree)(transform(pat), transform(guard), transform(body))
1107
- case Return (expr, from) =>
1108
- cpy.Return (tree)(transform(expr), transformSub(from))
1109
- case Try (block, cases, finalizer) =>
1110
- cpy.Try (tree)(transform(block), transformSub(cases), transform(finalizer))
1111
- case SeqLiteral (elems, elemtpt) =>
1112
- cpy.SeqLiteral (tree)(transform(elems), transform(elemtpt))
1113
- case Inlined (call, bindings, expansion) =>
1114
- cpy.Inlined (tree)(call, transformSub(bindings), transform(expansion))
1115
- case TypeTree () =>
1116
- tree
1117
- case SingletonTypeTree (ref) =>
1118
- cpy.SingletonTypeTree (tree)(transform(ref))
1119
- case AndTypeTree (left, right) =>
1120
- cpy.AndTypeTree (tree)(transform(left), transform(right))
1121
- case OrTypeTree (left, right) =>
1122
- cpy.OrTypeTree (tree)(transform(left), transform(right))
1123
- case RefinedTypeTree (tpt, refinements) =>
1124
- cpy.RefinedTypeTree (tree)(transform(tpt), transformSub(refinements))
1125
- case AppliedTypeTree (tpt, args) =>
1126
- cpy.AppliedTypeTree (tree)(transform(tpt), transform(args))
1127
- case PolyTypeTree (tparams, body) =>
1128
- cpy.PolyTypeTree (tree)(transformSub(tparams), transform(body))
1129
- case ByNameTypeTree (result) =>
1130
- cpy.ByNameTypeTree (tree)(transform(result))
1131
- case TypeBoundsTree (lo, hi) =>
1132
- cpy.TypeBoundsTree (tree)(transform(lo), transform(hi))
1133
- case Bind (name, body) =>
1134
- cpy.Bind (tree)(name, transform(body))
1135
- case Alternative (trees) =>
1136
- cpy.Alternative (tree)(transform(trees))
1137
- case UnApply (fun, implicits, patterns) =>
1138
- cpy.UnApply (tree)(transform(fun), transform(implicits), transform(patterns))
1139
- case EmptyValDef =>
1140
- tree
1141
- case tree @ ValDef (name, tpt, _) =>
1142
- val tpt1 = transform(tpt)
1143
- val rhs1 = transform(tree.rhs)
1144
- cpy.ValDef (tree)(name, tpt1, rhs1)
1145
- case tree @ DefDef (name, tparams, vparamss, tpt, _) =>
1146
- cpy.DefDef (tree)(name, transformSub(tparams), vparamss mapConserve (transformSub(_)), transform(tpt), transform(tree.rhs))
1147
- case tree @ TypeDef (name, rhs) =>
1148
- cpy.TypeDef (tree)(name, transform(rhs))
1149
- case tree @ Template (constr, parents, self, _) =>
1150
- cpy.Template (tree)(transformSub(constr), transform(parents), transformSub(self), transformStats(tree.body))
1151
- case Import (expr, selectors) =>
1152
- cpy.Import (tree)(transform(expr), selectors)
1153
- case PackageDef (pid, stats) =>
1154
- cpy.PackageDef (tree)(transformSub(pid), transformStats(stats))
1155
- case Annotated (arg, annot) =>
1156
- cpy.Annotated (tree)(transform(arg), transform(annot))
1157
- case Thicket (trees) =>
1158
- val trees1 = transform(trees)
1159
- if (trees1 eq trees) tree else Thicket (trees1)
1160
- }
1077
+ def transform (tree : Tree )(implicit ctx : Context ): Tree =
1078
+ if (skipTransform(tree)) tree
1079
+ else tree match {
1080
+ case Ident (name) =>
1081
+ tree
1082
+ case Select (qualifier, name) =>
1083
+ cpy.Select (tree)(transform(qualifier), name)
1084
+ case This (qual) =>
1085
+ tree
1086
+ case Super (qual, mix) =>
1087
+ cpy.Super (tree)(transform(qual), mix)
1088
+ case Apply (fun, args) =>
1089
+ cpy.Apply (tree)(transform(fun), transform(args))
1090
+ case TypeApply (fun, args) =>
1091
+ cpy.TypeApply (tree)(transform(fun), transform(args))
1092
+ case Literal (const) =>
1093
+ tree
1094
+ case New (tpt) =>
1095
+ cpy.New (tree)(transform(tpt))
1096
+ case Typed (expr, tpt) =>
1097
+ cpy.Typed (tree)(transform(expr), transform(tpt))
1098
+ case NamedArg (name, arg) =>
1099
+ cpy.NamedArg (tree)(name, transform(arg))
1100
+ case Assign (lhs, rhs) =>
1101
+ cpy.Assign (tree)(transform(lhs), transform(rhs))
1102
+ case Block (stats, expr) =>
1103
+ cpy.Block (tree)(transformStats(stats), transform(expr))
1104
+ case If (cond, thenp, elsep) =>
1105
+ cpy.If (tree)(transform(cond), transform(thenp), transform(elsep))
1106
+ case Closure (env, meth, tpt) =>
1107
+ cpy.Closure (tree)(transform(env), transform(meth), transform(tpt))
1108
+ case Match (selector, cases) =>
1109
+ cpy.Match (tree)(transform(selector), transformSub(cases))
1110
+ case CaseDef (pat, guard, body) =>
1111
+ cpy.CaseDef (tree)(transform(pat), transform(guard), transform(body))
1112
+ case Return (expr, from) =>
1113
+ cpy.Return (tree)(transform(expr), transformSub(from))
1114
+ case Try (block, cases, finalizer) =>
1115
+ cpy.Try (tree)(transform(block), transformSub(cases), transform(finalizer))
1116
+ case SeqLiteral (elems, elemtpt) =>
1117
+ cpy.SeqLiteral (tree)(transform(elems), transform(elemtpt))
1118
+ case Inlined (call, bindings, expansion) =>
1119
+ cpy.Inlined (tree)(call, transformSub(bindings), transform(expansion))
1120
+ case TypeTree () =>
1121
+ tree
1122
+ case SingletonTypeTree (ref) =>
1123
+ cpy.SingletonTypeTree (tree)(transform(ref))
1124
+ case AndTypeTree (left, right) =>
1125
+ cpy.AndTypeTree (tree)(transform(left), transform(right))
1126
+ case OrTypeTree (left, right) =>
1127
+ cpy.OrTypeTree (tree)(transform(left), transform(right))
1128
+ case RefinedTypeTree (tpt, refinements) =>
1129
+ cpy.RefinedTypeTree (tree)(transform(tpt), transformSub(refinements))
1130
+ case AppliedTypeTree (tpt, args) =>
1131
+ cpy.AppliedTypeTree (tree)(transform(tpt), transform(args))
1132
+ case PolyTypeTree (tparams, body) =>
1133
+ cpy.PolyTypeTree (tree)(transformSub(tparams), transform(body))
1134
+ case ByNameTypeTree (result) =>
1135
+ cpy.ByNameTypeTree (tree)(transform(result))
1136
+ case TypeBoundsTree (lo, hi) =>
1137
+ cpy.TypeBoundsTree (tree)(transform(lo), transform(hi))
1138
+ case Bind (name, body) =>
1139
+ cpy.Bind (tree)(name, transform(body))
1140
+ case Alternative (trees) =>
1141
+ cpy.Alternative (tree)(transform(trees))
1142
+ case UnApply (fun, implicits, patterns) =>
1143
+ cpy.UnApply (tree)(transform(fun), transform(implicits), transform(patterns))
1144
+ case EmptyValDef =>
1145
+ tree
1146
+ case tree @ ValDef (name, tpt, _) =>
1147
+ val tpt1 = transform(tpt)
1148
+ val rhs1 = transform(tree.rhs)
1149
+ cpy.ValDef (tree)(name, tpt1, rhs1)
1150
+ case tree @ DefDef (name, tparams, vparamss, tpt, _) =>
1151
+ cpy.DefDef (tree)(name, transformSub(tparams), vparamss mapConserve (transformSub(_)), transform(tpt), transform(tree.rhs))
1152
+ case tree @ TypeDef (name, rhs) =>
1153
+ cpy.TypeDef (tree)(name, transform(rhs))
1154
+ case tree @ Template (constr, parents, self, _) =>
1155
+ cpy.Template (tree)(transformSub(constr), transform(parents), transformSub(self), transformStats(tree.body))
1156
+ case Import (expr, selectors) =>
1157
+ cpy.Import (tree)(transform(expr), selectors)
1158
+ case PackageDef (pid, stats) =>
1159
+ cpy.PackageDef (tree)(transformSub(pid), transformStats(stats))
1160
+ case Annotated (arg, annot) =>
1161
+ cpy.Annotated (tree)(transform(arg), transform(annot))
1162
+ case Thicket (trees) =>
1163
+ val trees1 = transform(trees)
1164
+ if (trees1 eq trees) tree else Thicket (trees1)
1165
+ }
1161
1166
1162
1167
def transformStats (trees : List [Tree ])(implicit ctx : Context ): List [Tree ] =
1163
1168
transform(trees)
0 commit comments