@@ -9,7 +9,7 @@ import language.higherKinds
9
9
import collection .mutable .ListBuffer
10
10
import printing .Printer
11
11
import printing .Texts .Text
12
- import util .{Stats , Attachment , Property }
12
+ import util .{Stats , Attachment , Property , SourceFile }
13
13
import config .Config
14
14
import annotation .internal .sharable
15
15
import annotation .unchecked .uncheckedVariance
@@ -66,6 +66,8 @@ object Trees {
66
66
67
67
def uniqueId : Int = myUniqueId
68
68
69
+ def source (implicit ctx : Context ): SourceFile = ctx.sourceOfTreeId(uniqueId)
70
+
69
71
/** The type constructor at the root of the tree */
70
72
type ThisTree [T >: Untyped ] <: Tree [T ]
71
73
@@ -980,19 +982,21 @@ object Trees {
980
982
protected def finalize (tree : Tree , copied : untpd.MemberDef )(implicit ids: TreeIds ): copied.ThisTree [T ] =
981
983
postProcess(tree, copied.withPos(tree.pos).withAttachmentsFrom(tree))
982
984
985
+ protected def srcCtx (tree : Tree )(implicit ctx : Context ) = ctx.withSource(tree.source)
986
+
983
987
def Ident (tree : Tree )(name : Name )(implicit ctx : Context ): Ident = tree match {
984
988
case tree : BackquotedIdent =>
985
989
if (name == tree.name) tree
986
- else finalize(tree, new BackquotedIdent (name))
990
+ else finalize(tree, new BackquotedIdent (name)(srcCtx(tree)) )
987
991
case tree : Ident if name == tree.name => tree
988
- case _ => finalize(tree, untpd.Ident (name))
992
+ case _ => finalize(tree, untpd.Ident (name)(srcCtx(tree)) )
989
993
}
990
994
def Select (tree : Tree )(qualifier : Tree , name : Name )(implicit ctx : Context ): Select = tree match {
991
995
case tree : SelectWithSig =>
992
996
if ((qualifier eq tree.qualifier) && (name == tree.name)) tree
993
- else finalize(tree, new SelectWithSig (qualifier, name, tree.sig))
997
+ else finalize(tree, new SelectWithSig (qualifier, name, tree.sig)(srcCtx(tree)) )
994
998
case tree : Select if (qualifier eq tree.qualifier) && (name == tree.name) => tree
995
- case _ => finalize(tree, untpd.Select (qualifier, name))
999
+ case _ => finalize(tree, untpd.Select (qualifier, name)(srcCtx(tree)) )
996
1000
}
997
1001
/** Copy Ident or Select trees */
998
1002
def Ref (tree : RefTree )(name : Name )(implicit ctx : Context ): RefTree = tree match {
@@ -1001,168 +1005,168 @@ object Trees {
1001
1005
}
1002
1006
def This (tree : Tree )(qual : untpd.Ident )(implicit ctx : Context ): This = tree match {
1003
1007
case tree : This if qual eq tree.qual => tree
1004
- case _ => finalize(tree, untpd.This (qual))
1008
+ case _ => finalize(tree, untpd.This (qual)(srcCtx(tree)) )
1005
1009
}
1006
1010
def Super (tree : Tree )(qual : Tree , mix : untpd.Ident )(implicit ctx : Context ): Super = tree match {
1007
1011
case tree : Super if (qual eq tree.qual) && (mix eq tree.mix) => tree
1008
- case _ => finalize(tree, untpd.Super (qual, mix))
1012
+ case _ => finalize(tree, untpd.Super (qual, mix)(srcCtx(tree)) )
1009
1013
}
1010
1014
def Apply (tree : Tree )(fun : Tree , args : List [Tree ])(implicit ctx : Context ): Apply = tree match {
1011
1015
case tree : Apply if (fun eq tree.fun) && (args eq tree.args) => tree
1012
- case _ => finalize(tree, untpd.Apply (fun, args))
1016
+ case _ => finalize(tree, untpd.Apply (fun, args)(srcCtx(tree)) )
1013
1017
}
1014
1018
def TypeApply (tree : Tree )(fun : Tree , args : List [Tree ])(implicit ctx : Context ): TypeApply = tree match {
1015
1019
case tree : TypeApply if (fun eq tree.fun) && (args eq tree.args) => tree
1016
- case _ => finalize(tree, untpd.TypeApply (fun, args))
1020
+ case _ => finalize(tree, untpd.TypeApply (fun, args)(srcCtx(tree)) )
1017
1021
}
1018
1022
def Literal (tree : Tree )(const : Constant )(implicit ctx : Context ): Literal = tree match {
1019
1023
case tree : Literal if const == tree.const => tree
1020
- case _ => finalize(tree, untpd.Literal (const))
1024
+ case _ => finalize(tree, untpd.Literal (const)(srcCtx(tree)) )
1021
1025
}
1022
1026
def New (tree : Tree )(tpt : Tree )(implicit ctx : Context ): New = tree match {
1023
1027
case tree : New if tpt eq tree.tpt => tree
1024
- case _ => finalize(tree, untpd.New (tpt))
1028
+ case _ => finalize(tree, untpd.New (tpt)(srcCtx(tree)) )
1025
1029
}
1026
1030
def Typed (tree : Tree )(expr : Tree , tpt : Tree )(implicit ctx : Context ): Typed = tree match {
1027
1031
case tree : Typed if (expr eq tree.expr) && (tpt eq tree.tpt) => tree
1028
- case _ => finalize(tree, untpd.Typed (expr, tpt))
1032
+ case _ => finalize(tree, untpd.Typed (expr, tpt)(srcCtx(tree)) )
1029
1033
}
1030
1034
def NamedArg (tree : Tree )(name : Name , arg : Tree )(implicit ctx : Context ): NamedArg = tree match {
1031
1035
case tree : NamedArg if (name == tree.name) && (arg eq tree.arg) => tree
1032
- case _ => finalize(tree, untpd.NamedArg (name, arg))
1036
+ case _ => finalize(tree, untpd.NamedArg (name, arg)(srcCtx(tree)) )
1033
1037
}
1034
1038
def Assign (tree : Tree )(lhs : Tree , rhs : Tree )(implicit ctx : Context ): Assign = tree match {
1035
1039
case tree : Assign if (lhs eq tree.lhs) && (rhs eq tree.rhs) => tree
1036
- case _ => finalize(tree, untpd.Assign (lhs, rhs))
1040
+ case _ => finalize(tree, untpd.Assign (lhs, rhs)(srcCtx(tree)) )
1037
1041
}
1038
1042
def Block (tree : Tree )(stats : List [Tree ], expr : Tree )(implicit ctx : Context ): Block = tree match {
1039
1043
case tree : Block if (stats eq tree.stats) && (expr eq tree.expr) => tree
1040
- case _ => finalize(tree, untpd.Block (stats, expr))
1044
+ case _ => finalize(tree, untpd.Block (stats, expr)(srcCtx(tree)) )
1041
1045
}
1042
1046
def If (tree : Tree )(cond : Tree , thenp : Tree , elsep : Tree )(implicit ctx : Context ): If = tree match {
1043
1047
case tree : If if (cond eq tree.cond) && (thenp eq tree.thenp) && (elsep eq tree.elsep) => tree
1044
- case tree : InlineIf => finalize(tree, untpd.InlineIf (cond, thenp, elsep))
1045
- case _ => finalize(tree, untpd.If (cond, thenp, elsep))
1048
+ case tree : InlineIf => finalize(tree, untpd.InlineIf (cond, thenp, elsep)(srcCtx(tree)) )
1049
+ case _ => finalize(tree, untpd.If (cond, thenp, elsep)(srcCtx(tree)) )
1046
1050
}
1047
1051
def Closure (tree : Tree )(env : List [Tree ], meth : Tree , tpt : Tree )(implicit ctx : Context ): Closure = tree match {
1048
1052
case tree : Closure if (env eq tree.env) && (meth eq tree.meth) && (tpt eq tree.tpt) => tree
1049
- case _ => finalize(tree, untpd.Closure (env, meth, tpt))
1053
+ case _ => finalize(tree, untpd.Closure (env, meth, tpt)(srcCtx(tree)) )
1050
1054
}
1051
1055
def Match (tree : Tree )(selector : Tree , cases : List [CaseDef ])(implicit ctx : Context ): Match = tree match {
1052
1056
case tree : Match if (selector eq tree.selector) && (cases eq tree.cases) => tree
1053
- case tree : InlineMatch => finalize(tree, untpd.InlineMatch (selector, cases))
1054
- case _ => finalize(tree, untpd.Match (selector, cases))
1057
+ case tree : InlineMatch => finalize(tree, untpd.InlineMatch (selector, cases)(srcCtx(tree)) )
1058
+ case _ => finalize(tree, untpd.Match (selector, cases)(srcCtx(tree)) )
1055
1059
}
1056
1060
def CaseDef (tree : Tree )(pat : Tree , guard : Tree , body : Tree )(implicit ctx : Context ): CaseDef = tree match {
1057
1061
case tree : CaseDef if (pat eq tree.pat) && (guard eq tree.guard) && (body eq tree.body) => tree
1058
- case _ => finalize(tree, untpd.CaseDef (pat, guard, body))
1062
+ case _ => finalize(tree, untpd.CaseDef (pat, guard, body)(srcCtx(tree)) )
1059
1063
}
1060
1064
def Labeled (tree : Tree )(bind : Bind , expr : Tree )(implicit ctx : Context ): Labeled = tree match {
1061
1065
case tree : Labeled if (bind eq tree.bind) && (expr eq tree.expr) => tree
1062
- case _ => finalize(tree, untpd.Labeled (bind, expr))
1066
+ case _ => finalize(tree, untpd.Labeled (bind, expr)(srcCtx(tree)) )
1063
1067
}
1064
1068
def Return (tree : Tree )(expr : Tree , from : Tree )(implicit ctx : Context ): Return = tree match {
1065
1069
case tree : Return if (expr eq tree.expr) && (from eq tree.from) => tree
1066
- case _ => finalize(tree, untpd.Return (expr, from))
1070
+ case _ => finalize(tree, untpd.Return (expr, from)(srcCtx(tree)) )
1067
1071
}
1068
1072
def WhileDo (tree : Tree )(cond : Tree , body : Tree )(implicit ctx : Context ): WhileDo = tree match {
1069
1073
case tree : WhileDo if (cond eq tree.cond) && (body eq tree.body) => tree
1070
- case _ => finalize(tree, untpd.WhileDo (cond, body))
1074
+ case _ => finalize(tree, untpd.WhileDo (cond, body)(srcCtx(tree)) )
1071
1075
}
1072
1076
def Try (tree : Tree )(expr : Tree , cases : List [CaseDef ], finalizer : Tree )(implicit ctx : Context ): Try = tree match {
1073
1077
case tree : Try if (expr eq tree.expr) && (cases eq tree.cases) && (finalizer eq tree.finalizer) => tree
1074
- case _ => finalize(tree, untpd.Try (expr, cases, finalizer))
1078
+ case _ => finalize(tree, untpd.Try (expr, cases, finalizer)(srcCtx(tree)) )
1075
1079
}
1076
1080
def SeqLiteral (tree : Tree )(elems : List [Tree ], elemtpt : Tree )(implicit ctx : Context ): SeqLiteral = tree match {
1077
1081
case tree : JavaSeqLiteral =>
1078
1082
if ((elems eq tree.elems) && (elemtpt eq tree.elemtpt)) tree
1079
1083
else finalize(tree, new JavaSeqLiteral (elems, elemtpt))
1080
1084
case tree : SeqLiteral if (elems eq tree.elems) && (elemtpt eq tree.elemtpt) => tree
1081
- case _ => finalize(tree, untpd.SeqLiteral (elems, elemtpt))
1085
+ case _ => finalize(tree, untpd.SeqLiteral (elems, elemtpt)(srcCtx(tree)) )
1082
1086
}
1083
1087
def Inlined (tree : Tree )(call : tpd.Tree , bindings : List [MemberDef ], expansion : Tree )(implicit ctx : Context ): Inlined = tree match {
1084
1088
case tree : Inlined if (call eq tree.call) && (bindings eq tree.bindings) && (expansion eq tree.expansion) => tree
1085
- case _ => finalize(tree, untpd.Inlined (call, bindings, expansion))
1089
+ case _ => finalize(tree, untpd.Inlined (call, bindings, expansion)(srcCtx(tree)) )
1086
1090
}
1087
1091
def SingletonTypeTree (tree : Tree )(ref : Tree )(implicit ctx : Context ): SingletonTypeTree = tree match {
1088
1092
case tree : SingletonTypeTree if ref eq tree.ref => tree
1089
- case _ => finalize(tree, untpd.SingletonTypeTree (ref))
1093
+ case _ => finalize(tree, untpd.SingletonTypeTree (ref)(srcCtx(tree)) )
1090
1094
}
1091
1095
def AndTypeTree (tree : Tree )(left : Tree , right : Tree )(implicit ctx : Context ): AndTypeTree = tree match {
1092
1096
case tree : AndTypeTree if (left eq tree.left) && (right eq tree.right) => tree
1093
- case _ => finalize(tree, untpd.AndTypeTree (left, right))
1097
+ case _ => finalize(tree, untpd.AndTypeTree (left, right)(srcCtx(tree)) )
1094
1098
}
1095
1099
def OrTypeTree (tree : Tree )(left : Tree , right : Tree )(implicit ctx : Context ): OrTypeTree = tree match {
1096
1100
case tree : OrTypeTree if (left eq tree.left) && (right eq tree.right) => tree
1097
- case _ => finalize(tree, untpd.OrTypeTree (left, right))
1101
+ case _ => finalize(tree, untpd.OrTypeTree (left, right)(srcCtx(tree)) )
1098
1102
}
1099
1103
def RefinedTypeTree (tree : Tree )(tpt : Tree , refinements : List [Tree ])(implicit ctx : Context ): RefinedTypeTree = tree match {
1100
1104
case tree : RefinedTypeTree if (tpt eq tree.tpt) && (refinements eq tree.refinements) => tree
1101
- case _ => finalize(tree, untpd.RefinedTypeTree (tpt, refinements))
1105
+ case _ => finalize(tree, untpd.RefinedTypeTree (tpt, refinements)(srcCtx(tree)) )
1102
1106
}
1103
1107
def AppliedTypeTree (tree : Tree )(tpt : Tree , args : List [Tree ])(implicit ctx : Context ): AppliedTypeTree = tree match {
1104
1108
case tree : AppliedTypeTree if (tpt eq tree.tpt) && (args eq tree.args) => tree
1105
- case _ => finalize(tree, untpd.AppliedTypeTree (tpt, args))
1109
+ case _ => finalize(tree, untpd.AppliedTypeTree (tpt, args)(srcCtx(tree)) )
1106
1110
}
1107
1111
def LambdaTypeTree (tree : Tree )(tparams : List [TypeDef ], body : Tree )(implicit ctx : Context ): LambdaTypeTree = tree match {
1108
1112
case tree : LambdaTypeTree if (tparams eq tree.tparams) && (body eq tree.body) => tree
1109
- case _ => finalize(tree, untpd.LambdaTypeTree (tparams, body))
1113
+ case _ => finalize(tree, untpd.LambdaTypeTree (tparams, body)(srcCtx(tree)) )
1110
1114
}
1111
1115
def MatchTypeTree (tree : Tree )(bound : Tree , selector : Tree , cases : List [CaseDef ])(implicit ctx : Context ): MatchTypeTree = tree match {
1112
1116
case tree : MatchTypeTree if (bound eq tree.bound) && (selector eq tree.selector) && (cases eq tree.cases) => tree
1113
- case _ => finalize(tree, untpd.MatchTypeTree (bound, selector, cases))
1117
+ case _ => finalize(tree, untpd.MatchTypeTree (bound, selector, cases)(srcCtx(tree)) )
1114
1118
}
1115
1119
def ByNameTypeTree (tree : Tree )(result : Tree )(implicit ctx : Context ): ByNameTypeTree = tree match {
1116
1120
case tree : ByNameTypeTree if result eq tree.result => tree
1117
- case _ => finalize(tree, untpd.ByNameTypeTree (result))
1121
+ case _ => finalize(tree, untpd.ByNameTypeTree (result)(srcCtx(tree)) )
1118
1122
}
1119
1123
def TypeBoundsTree (tree : Tree )(lo : Tree , hi : Tree )(implicit ctx : Context ): TypeBoundsTree = tree match {
1120
1124
case tree : TypeBoundsTree if (lo eq tree.lo) && (hi eq tree.hi) => tree
1121
- case _ => finalize(tree, untpd.TypeBoundsTree (lo, hi))
1125
+ case _ => finalize(tree, untpd.TypeBoundsTree (lo, hi)(srcCtx(tree)) )
1122
1126
}
1123
1127
def Bind (tree : Tree )(name : Name , body : Tree )(implicit ctx : Context ): Bind = tree match {
1124
1128
case tree : Bind if (name eq tree.name) && (body eq tree.body) => tree
1125
- case _ => finalize(tree, untpd.Bind (name, body))
1129
+ case _ => finalize(tree, untpd.Bind (name, body)(srcCtx(tree)) )
1126
1130
}
1127
1131
def Alternative (tree : Tree )(trees : List [Tree ])(implicit ctx : Context ): Alternative = tree match {
1128
1132
case tree : Alternative if trees eq tree.trees => tree
1129
- case _ => finalize(tree, untpd.Alternative (trees))
1133
+ case _ => finalize(tree, untpd.Alternative (trees)(srcCtx(tree)) )
1130
1134
}
1131
1135
def UnApply (tree : Tree )(fun : Tree , implicits : List [Tree ], patterns : List [Tree ])(implicit ctx : Context ): UnApply = tree match {
1132
1136
case tree : UnApply if (fun eq tree.fun) && (implicits eq tree.implicits) && (patterns eq tree.patterns) => tree
1133
- case _ => finalize(tree, untpd.UnApply (fun, implicits, patterns))
1137
+ case _ => finalize(tree, untpd.UnApply (fun, implicits, patterns)(srcCtx(tree)) )
1134
1138
}
1135
1139
def ValDef (tree : Tree )(name : TermName , tpt : Tree , rhs : LazyTree )(implicit ctx : Context ): ValDef = tree match {
1136
1140
case tree : ValDef if (name == tree.name) && (tpt eq tree.tpt) && (rhs eq tree.unforcedRhs) => tree
1137
- case _ => finalize(tree, untpd.ValDef (name, tpt, rhs))
1141
+ case _ => finalize(tree, untpd.ValDef (name, tpt, rhs)(srcCtx(tree)) )
1138
1142
}
1139
1143
def DefDef (tree : Tree )(name : TermName , tparams : List [TypeDef ], vparamss : List [List [ValDef ]], tpt : Tree , rhs : LazyTree )(implicit ctx : Context ): DefDef = tree match {
1140
1144
case tree : DefDef if (name == tree.name) && (tparams eq tree.tparams) && (vparamss eq tree.vparamss) && (tpt eq tree.tpt) && (rhs eq tree.unforcedRhs) => tree
1141
- case _ => finalize(tree, untpd.DefDef (name, tparams, vparamss, tpt, rhs))
1145
+ case _ => finalize(tree, untpd.DefDef (name, tparams, vparamss, tpt, rhs)(srcCtx(tree)) )
1142
1146
}
1143
1147
def TypeDef (tree : Tree )(name : TypeName , rhs : Tree )(implicit ctx : Context ): TypeDef = tree match {
1144
1148
case tree : TypeDef if (name == tree.name) && (rhs eq tree.rhs) => tree
1145
- case _ => finalize(tree, untpd.TypeDef (name, rhs))
1149
+ case _ => finalize(tree, untpd.TypeDef (name, rhs)(srcCtx(tree)) )
1146
1150
}
1147
1151
def Template (tree : Tree )(constr : DefDef , parents : List [Tree ], self : ValDef , body : LazyTreeList )(implicit ctx : Context ): Template = tree match {
1148
1152
case tree : Template if (constr eq tree.constr) && (parents eq tree.parents) && (self eq tree.self) && (body eq tree.unforcedBody) => tree
1149
- case _ => finalize(tree, untpd.Template (constr, parents, self, body))
1153
+ case _ => finalize(tree, untpd.Template (constr, parents, self, body)(srcCtx(tree)) )
1150
1154
}
1151
1155
def Import (tree : Tree )(expr : Tree , selectors : List [untpd.Tree ])(implicit ctx : Context ): Import = tree match {
1152
1156
case tree : Import if (expr eq tree.expr) && (selectors eq tree.selectors) => tree
1153
- case _ => finalize(tree, untpd.Import (expr, selectors))
1157
+ case _ => finalize(tree, untpd.Import (expr, selectors)(srcCtx(tree)) )
1154
1158
}
1155
1159
def PackageDef (tree : Tree )(pid : RefTree , stats : List [Tree ])(implicit ctx : Context ): PackageDef = tree match {
1156
1160
case tree : PackageDef if (pid eq tree.pid) && (stats eq tree.stats) => tree
1157
- case _ => finalize(tree, untpd.PackageDef (pid, stats))
1161
+ case _ => finalize(tree, untpd.PackageDef (pid, stats)(srcCtx(tree)) )
1158
1162
}
1159
1163
def Annotated (tree : Tree )(arg : Tree , annot : Tree )(implicit ctx : Context ): Annotated = tree match {
1160
1164
case tree : Annotated if (arg eq tree.arg) && (annot eq tree.annot) => tree
1161
- case _ => finalize(tree, untpd.Annotated (arg, annot))
1165
+ case _ => finalize(tree, untpd.Annotated (arg, annot)(srcCtx(tree)) )
1162
1166
}
1163
1167
def Thicket (tree : Tree )(trees : List [Tree ])(implicit ctx : Context ): Thicket = tree match {
1164
1168
case tree : Thicket if trees eq tree.trees => tree
1165
- case _ => finalize(tree, untpd.Thicket (trees))
1169
+ case _ => finalize(tree, untpd.Thicket (trees)(srcCtx(tree)) )
1166
1170
}
1167
1171
1168
1172
// Copier methods with default arguments; these demand that the original tree
0 commit comments