aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-11-10 18:29:58 +0100
committerMartin Odersky <odersky@gmail.com>2014-11-10 18:29:58 +0100
commitf7a4d811f769583be13a376a3daedd2eadd31447 (patch)
tree1c82858472d08575dfb6815d9c70cee92095a79a /src
parentc9d7eefc0989066e85ca598dff2639d412aabbee (diff)
downloaddotty-f7a4d811f769583be13a376a3daedd2eadd31447.tar.gz
dotty-f7a4d811f769583be13a376a3daedd2eadd31447.tar.bz2
dotty-f7a4d811f769583be13a376a3daedd2eadd31447.zip
Drop modifiers as separate data from MemberDef trees
Typed MemberDef trees now take the modifiers from their symbol's data.
Diffstat (limited to 'src')
-rw-r--r--src/dotty/tools/dotc/ast/Desugar.scala125
-rw-r--r--src/dotty/tools/dotc/ast/TreeInfo.scala42
-rw-r--r--src/dotty/tools/dotc/ast/TreeTypeMap.scala4
-rw-r--r--src/dotty/tools/dotc/ast/Trees.scala253
-rw-r--r--src/dotty/tools/dotc/ast/tpd.scala20
-rw-r--r--src/dotty/tools/dotc/ast/untpd.scala68
-rw-r--r--src/dotty/tools/dotc/parsing/Parsers.scala24
-rw-r--r--src/dotty/tools/dotc/parsing/SymbolicXMLBuilder.scala8
-rw-r--r--src/dotty/tools/dotc/printing/RefinedPrinter.scala30
-rw-r--r--src/dotty/tools/dotc/transform/Constructors.scala4
-rw-r--r--src/dotty/tools/dotc/transform/ExtensionMethods.scala3
-rw-r--r--src/dotty/tools/dotc/transform/GettersSetters.scala1
-rw-r--r--src/dotty/tools/dotc/transform/LambdaLift.scala4
-rw-r--r--src/dotty/tools/dotc/transform/LazyVals.scala14
-rw-r--r--src/dotty/tools/dotc/transform/Mixin.scala10
-rw-r--r--src/dotty/tools/dotc/transform/PrivateToStatic.scala4
-rw-r--r--src/dotty/tools/dotc/transform/RestoreScopes.scala2
-rw-r--r--src/dotty/tools/dotc/transform/SuperAccessors.scala4
-rw-r--r--src/dotty/tools/dotc/transform/TailRec.scala6
-rw-r--r--src/dotty/tools/dotc/transform/TreeChecker.scala2
-rw-r--r--src/dotty/tools/dotc/transform/TreeTransform.scala6
-rw-r--r--src/dotty/tools/dotc/typer/EtaExpansion.scala2
-rw-r--r--src/dotty/tools/dotc/typer/Namer.scala12
-rw-r--r--src/dotty/tools/dotc/typer/ReTyper.scala5
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala38
-rw-r--r--src/dotty/tools/dotc/typer/VarianceChecker.scala2
26 files changed, 284 insertions, 409 deletions
diff --git a/src/dotty/tools/dotc/ast/Desugar.scala b/src/dotty/tools/dotc/ast/Desugar.scala
index 3d217f38f..b7786e00c 100644
--- a/src/dotty/tools/dotc/ast/Desugar.scala
+++ b/src/dotty/tools/dotc/ast/Desugar.scala
@@ -88,7 +88,8 @@ object desugar {
* def x_=($1: <TypeTree()>): Unit = ()
*/
def valDef(vdef: ValDef)(implicit ctx: Context): Tree = {
- val ValDef(mods, name, tpt, rhs) = vdef
+ val ValDef(name, tpt, rhs) = vdef
+ val mods = vdef.mods
def setterNeeded =
(mods is Mutable) && ctx.owner.isClass && (!(mods is PrivateLocal) || (ctx.owner is Trait))
if (setterNeeded) {
@@ -99,8 +100,12 @@ object desugar {
val setterParam = makeSyntheticParameter(tpt = (new SetterParamTree).watching(vdef))
val setterRhs = if (vdef.rhs.isEmpty) EmptyTree else unitLiteral
val setter = cpy.DefDef(vdef)(
- (mods | Accessor) &~ CaseAccessor, name.setterName, Nil, (setterParam :: Nil) :: Nil,
- TypeTree(defn.UnitType), setterRhs) // rhs gets filled in later, when field is generated and getter has parameters
+ name = name.setterName,
+ tparams = Nil,
+ vparamss = (setterParam :: Nil) :: Nil,
+ tpt = TypeTree(defn.UnitType),
+ rhs = setterRhs
+ ).withMods((mods | Accessor) &~ CaseAccessor) // rhs gets filled in later, when field is generated and getter has parameters
Thicket(vdef, setter)
}
else vdef
@@ -121,15 +126,15 @@ object desugar {
* def f$default$2(x: Int) = x + "m"
*/
def defDef(meth: DefDef, isPrimaryConstructor: Boolean = false)(implicit ctx: Context): Tree = {
- val DefDef(mods, name, tparams, vparamss, tpt, rhs) = meth
+ val DefDef(name, tparams, vparamss, tpt, rhs) = meth
+ val mods = meth.mods
val epbuf = new ListBuffer[ValDef]
val tparams1 = tparams mapConserve {
- case tparam @ TypeDef(_, _, ContextBounds(tbounds, cxbounds)) =>
+ case tparam @ TypeDef(_, ContextBounds(tbounds, cxbounds)) =>
for (cxbound <- cxbounds) {
val paramFlags: FlagSet = if (isPrimaryConstructor) PrivateLocalParamAccessor else Param
val epname = (nme.EVIDENCE_PARAM_PREFIX.toString + epbuf.length).toTermName
- epbuf +=
- ValDef(Modifiers(paramFlags | Implicit), epname, cxbound, EmptyTree)
+ epbuf += ValDef(epname, cxbound, EmptyTree).withFlags(paramFlags | Implicit)
}
cpy.TypeDef(tparam)(rhs = tbounds)
case tparam =>
@@ -165,12 +170,12 @@ object desugar {
case (vparam :: vparams) :: vparamss1 =>
def defaultGetter: DefDef =
DefDef(
- mods = vparam.mods & AccessFlags,
name = meth.name.defaultGetterName(n),
tparams = meth.tparams map toDefParam,
vparamss = takeUpTo(normalizedVparamss, n),
tpt = TypeTree(),
- rhs = vparam.rhs)
+ rhs = vparam.rhs
+ ).withMods(vparam.mods & AccessFlags)
val rest = defaultGetters(vparams :: vparamss1, n + 1)
if (vparam.rhs.isEmpty) rest else defaultGetter :: rest
case Nil :: vparamss1 =>
@@ -182,9 +187,8 @@ object desugar {
val defGetters = defaultGetters(vparamss, 0)
if (defGetters.isEmpty) meth1
else {
- val meth2 = cpy.DefDef(meth1)(
- mods = meth1.mods | DefaultParameterized,
- vparamss = normalizedVparamss)
+ val meth2 = cpy.DefDef(meth1)(vparamss = normalizedVparamss)
+ .withMods(meth1.mods | DefaultParameterized)
Thicket(meth2 :: defGetters)
}
}
@@ -197,13 +201,10 @@ object desugar {
*/
def typeDef(tdef: TypeDef)(implicit ctx: Context): Tree = {
if (tdef.mods is PrivateLocalParam) {
- val tparam = cpy.TypeDef(tdef)(
- mods = tdef.mods &~ PrivateLocal | ExpandedName,
- name = tdef.name.expandedName(ctx.owner))
- val alias = cpy.TypeDef(tdef)(
- mods = Modifiers(PrivateLocalParamAccessor | Synthetic | tdef.mods.flags & VarianceFlags),
- rhs = refOfDef(tparam),
- tparams = Nil)
+ val tparam = cpy.TypeDef(tdef)(name = tdef.name.expandedName(ctx.owner))
+ .withMods(tdef.mods &~ PrivateLocal | ExpandedName)
+ val alias = cpy.TypeDef(tdef)(rhs = refOfDef(tparam), tparams = Nil)
+ .withFlags(PrivateLocalParamAccessor | Synthetic | tdef.mods.flags & VarianceFlags)
Thicket(tparam, alias)
}
else tdef
@@ -211,16 +212,15 @@ object desugar {
private val synthetic = Modifiers(Synthetic)
- private def toDefParam(tparam: TypeDef) =
- cpy.TypeDef(tparam)(mods = Modifiers(Param))
-
- private def toDefParam(vparam: ValDef) =
- cpy.ValDef(vparam)(mods = Modifiers(Param | vparam.mods.flags & Implicit))
+ private def toDefParam(tparam: TypeDef): TypeDef =
+ tparam.withFlags(Param)
+ private def toDefParam(vparam: ValDef): ValDef =
+ vparam.withFlags(Param | vparam.rawMods.flags & Implicit)
/** The expansion of a class definition. See inline comments for what is involved */
def classDef(cdef: TypeDef)(implicit ctx: Context): Tree = {
- val TypeDef(
- mods, name, impl @ Template(constr0, parents, self, body)) = cdef
+ val TypeDef(name, impl @ Template(constr0, parents, self, body)) = cdef
+ val mods = cdef.mods
val (constr1, defaultGetters) = defDef(constr0, isPrimaryConstructor = true) match {
case meth: DefDef => (meth, Nil)
@@ -285,7 +285,7 @@ object desugar {
val caseClassMeths =
if (mods is Case) {
def syntheticProperty(name: TermName, rhs: Tree) =
- DefDef(synthetic, name, Nil, Nil, TypeTree(), rhs)
+ DefDef(name, Nil, Nil, TypeTree(), rhs).withMods(synthetic)
val isDefinedMeth = syntheticProperty(nme.isDefined, Literal(Constant(true)))
val caseParams = constrVparamss.head.toArray
val productElemMeths = for (i <- 0 until arity) yield
@@ -299,7 +299,8 @@ object desugar {
cpy.ValDef(vparam)(rhs = copyDefault(vparam)))
val copyRestParamss = derivedVparamss.tail.nestedMap(vparam =>
cpy.ValDef(vparam)(rhs = EmptyTree))
- DefDef(synthetic, nme.copy, derivedTparams, copyFirstParams :: copyRestParamss, TypeTree(), creatorExpr) :: Nil
+ DefDef(nme.copy, derivedTparams, copyFirstParams :: copyRestParamss, TypeTree(), creatorExpr)
+ .withMods(synthetic) :: Nil
}
copyMeths ::: isDefinedMeth :: productElemMeths.toList
}
@@ -322,8 +323,8 @@ object desugar {
def companionDefs(parentTpt: Tree, defs: List[Tree]) =
moduleDef(
ModuleDef(
- Modifiers(Synthetic), name.toTermName,
- Template(emptyConstructor, parentTpt :: Nil, EmptyValDef, defs)))
+ name.toTermName, Template(emptyConstructor, parentTpt :: Nil, EmptyValDef, defs))
+ .withMods(synthetic))
.withPos(cdef.pos).toList
// The companion object defifinitions, if a companion is needed, Nil otherwise.
@@ -344,13 +345,13 @@ object desugar {
val applyMeths =
if (mods is Abstract) Nil
else
- DefDef(
- synthetic | (constr1.mods.flags & DefaultParameterized), nme.apply,
- derivedTparams, derivedVparamss, TypeTree(), creatorExpr) :: Nil
+ DefDef(nme.apply, derivedTparams, derivedVparamss, TypeTree(), creatorExpr)
+ .withMods(synthetic | (constr1.mods.flags & DefaultParameterized)) :: Nil
val unapplyMeth = {
val unapplyParam = makeSyntheticParameter(tpt = classTypeRef)
val unapplyRHS = if (arity == 0) Literal(Constant(true)) else Ident(unapplyParam.name)
- DefDef(synthetic, nme.unapply, derivedTparams, (unapplyParam :: Nil) :: Nil, TypeTree(), unapplyRHS)
+ DefDef(nme.unapply, derivedTparams, (unapplyParam :: Nil) :: Nil, TypeTree(), unapplyRHS)
+ .withMods(synthetic)
}
companionDefs(parent, applyMeths ::: unapplyMeth :: defaultGetters)
}
@@ -370,27 +371,23 @@ object desugar {
// implicit wrapper is typechecked in same scope as constructor, so
// we can reuse the constructor parameters; no derived params are needed.
- DefDef(Modifiers(Synthetic | Implicit), name.toTermName,
- constrTparams, constrVparamss, classTypeRef, creatorExpr) :: Nil
+ DefDef(name.toTermName, constrTparams, constrVparamss, classTypeRef, creatorExpr)
+ .withFlags(Synthetic | Implicit) :: Nil
}
else Nil
val self1 = {
val selfType = if (self.tpt.isEmpty) classTypeRef else self.tpt
if (self.isEmpty) self
- else cpy.ValDef(self)(mods = self.mods | SelfName, tpt = selfType)
+ else cpy.ValDef(self)(tpt = selfType).withMods(self.mods | SelfName)
}
val cdef1 = {
val originalTparams = constr1.tparams.toIterator
val originalVparams = constr1.vparamss.toIterator.flatten
- val tparamAccessors = derivedTparams map { tdef =>
- cpy.TypeDef(tdef)(mods = originalTparams.next.mods)
- }
+ val tparamAccessors = derivedTparams.map(_.withMods(originalTparams.next.mods))
val caseAccessor = if (mods is Case) CaseAccessor else EmptyFlags
- val vparamAccessors = derivedVparamss.flatten map { vdef =>
- cpy.ValDef(vdef)(mods = originalVparams.next.mods | caseAccessor)
- }
+ val vparamAccessors = derivedVparamss.flatten.map(_.withMods(originalVparams.next.mods | caseAccessor))
cpy.TypeDef(cdef)(
rhs = cpy.Template(impl)(constr, parents1, self1,
tparamAccessors ::: vparamAccessors ::: normalizedBody ::: caseClassMeths),
@@ -415,19 +412,25 @@ object desugar {
* <module> final class name$ extends parents { self: name.type => body }
*/
def moduleDef(mdef: ModuleDef)(implicit ctx: Context): Tree = {
- val ModuleDef(mods, name, tmpl) = mdef
+ val ModuleDef(name, tmpl) = mdef
+ val mods = mdef.mods
if (mods is Package)
- PackageDef(Ident(name), cpy.ModuleDef(mdef)(mods &~ Package, nme.PACKAGE, tmpl) :: Nil)
+ PackageDef(Ident(name), cpy.ModuleDef(mdef)(nme.PACKAGE, tmpl).withMods(mods &~ Package) :: Nil)
else {
val clsName = name.moduleClassName
val clsRef = Ident(clsName)
- val modul = ValDef(mods | ModuleCreationFlags, name, clsRef, New(clsRef, Nil)) withPos mdef.pos
- val ValDef(selfMods, selfName, selfTpt, selfRhs) = tmpl.self
+ val modul = ValDef(name, clsRef, New(clsRef, Nil))
+ .withMods(mods | ModuleCreationFlags)
+ .withPos(mdef.pos)
+ val ValDef(selfName, selfTpt, selfRhs) = tmpl.self
+ val selfMods = tmpl.self.mods
if (!selfTpt.isEmpty) ctx.error("object definition may not have a self type", tmpl.self.pos)
- val clsSelf = ValDef(selfMods, selfName, SingletonTypeTree(Ident(name)), selfRhs)
+ val clsSelf = ValDef(selfName, SingletonTypeTree(Ident(name)), selfRhs)
+ .withMods(selfMods)
.withPos(tmpl.self.pos orElse tmpl.pos.startPos)
val clsTmpl = cpy.Template(tmpl)(self = clsSelf, body = tmpl.body)
- val cls = TypeDef(mods.toTypeFlags & AccessFlags | ModuleClassCreationFlags, clsName, clsTmpl)
+ val cls = TypeDef(clsName, clsTmpl)
+ .withMods(mods.toTypeFlags & AccessFlags | ModuleClassCreationFlags)
Thicket(modul, classDef(cls))
}
}
@@ -459,7 +462,7 @@ object desugar {
*/
def makePatDef(mods: Modifiers, pat: Tree, rhs: Tree)(implicit ctx: Context): Tree = pat match {
case VarPattern(named, tpt) =>
- derivedValDef(mods, named, tpt, rhs)
+ derivedValDef(named, tpt, rhs, mods)
case _ =>
val rhsUnchecked = makeAnnotated(defn.UncheckedAnnot, rhs)
val vars = getVariables(pat)
@@ -476,15 +479,15 @@ object desugar {
case Nil =>
matchExpr
case (named, tpt) :: Nil =>
- derivedValDef(mods, named, tpt, matchExpr)
+ derivedValDef(named, tpt, matchExpr, mods)
case _ =>
val tmpName = ctx.freshName().toTermName
- val patMods = Modifiers(PrivateLocal | Synthetic | (mods.flags & Lazy))
- val firstDef = ValDef(patMods, tmpName, TypeTree(), matchExpr)
+ val patFlags = PrivateLocal | Synthetic | (mods.flags & Lazy)
+ val firstDef = ValDef(tmpName, TypeTree(), matchExpr).withFlags(patFlags)
def selector(n: Int) = Select(Ident(tmpName), nme.selectorName(n))
val restDefs =
for (((named, tpt), n) <- vars.zipWithIndex)
- yield derivedValDef(mods, named, tpt, selector(n))
+ yield derivedValDef(named, tpt, selector(n), mods)
flatTree(firstDef :: restDefs)
}
}
@@ -527,7 +530,7 @@ object desugar {
*/
def makeClosure(params: List[ValDef], body: Tree, tpt: Tree = TypeTree()) =
Block(
- DefDef(Modifiers(Synthetic), nme.ANON_FUN, Nil, params :: Nil, tpt, body),
+ DefDef(nme.ANON_FUN, Nil, params :: Nil, tpt, body).withMods(synthetic),
Closure(Nil, Ident(nme.ANON_FUN), EmptyTree))
/** Expand partial function
@@ -546,8 +549,8 @@ object desugar {
def makeAnnotated(cls: Symbol, tree: Tree)(implicit ctx: Context) =
Annotated(TypedSplice(tpd.New(cls.typeRef, Nil)), tree)
- private def derivedValDef(mods: Modifiers, named: NameTree, tpt: Tree, rhs: Tree) =
- ValDef(mods, named.name.asTermName, tpt, rhs).withPos(named.pos)
+ private def derivedValDef(named: NameTree, tpt: Tree, rhs: Tree, mods: Modifiers) =
+ ValDef(named.name.asTermName, tpt, rhs).withMods(mods).withPos(named.pos)
/** Main desugaring method */
def apply(tree: Tree)(implicit ctx: Context): Tree = {
@@ -555,7 +558,7 @@ object desugar {
/** { label def lname(): Unit = rhs; call }
*/
def labelDefAndCall(lname: TermName, rhs: Tree, call: Tree) = {
- val ldef = DefDef(Modifiers(Label), lname, Nil, ListOfNil, TypeTree(defn.UnitType), rhs)
+ val ldef = DefDef(lname, Nil, ListOfNil, TypeTree(defn.UnitType), rhs).withFlags(Label)
Block(ldef, call)
}
@@ -576,7 +579,7 @@ object desugar {
} else {
val x = ctx.freshName().toTermName
Block(
- ValDef(Modifiers(Synthetic), x, TypeTree(), left),
+ ValDef(x, TypeTree(), left).withMods(synthetic),
Apply(Select(right, op), Ident(x)))
}
}
@@ -637,7 +640,7 @@ object desugar {
*/
def makeLambda(pat: Tree, body: Tree): Tree = pat match {
case VarPattern(named, tpt) =>
- Function(derivedValDef(Modifiers(Param), named, tpt, EmptyTree) :: Nil, body)
+ Function(derivedValDef(named, tpt, EmptyTree, Modifiers(Param)) :: Nil, body)
case _ =>
makeCaseLambda(CaseDef(pat, EmptyTree, body) :: Nil)
}
@@ -841,7 +844,7 @@ object desugar {
def refinedTypeToClass(tree: RefinedTypeTree)(implicit ctx: Context): TypeDef = {
val parent = if (tree.tpt.isEmpty) TypeTree(defn.ObjectType) else tree.tpt
val impl = Template(emptyConstructor, parent :: Nil, EmptyValDef, tree.refinements)
- TypeDef(Modifiers(Trait), tpnme.REFINE_CLASS, impl)
+ TypeDef(tpnme.REFINE_CLASS, impl).withFlags(Trait)
}
/** If tree is a variable pattern, return its name and type, otherwise return None.
diff --git a/src/dotty/tools/dotc/ast/TreeInfo.scala b/src/dotty/tools/dotc/ast/TreeInfo.scala
index 8163c8bcc..3d633c58d 100644
--- a/src/dotty/tools/dotc/ast/TreeInfo.scala
+++ b/src/dotty/tools/dotc/ast/TreeInfo.scala
@@ -18,18 +18,18 @@ trait TreeInfo[T >: Untyped <: Type] { self: Trees.Instance[T] =>
}
def isDeclarationOrTypeDef(tree: Tree): Boolean = unsplice(tree) match {
- case DefDef(_, _, _, _, _, EmptyTree)
- | ValDef(_, _, _, EmptyTree)
- | TypeDef(_, _, _) => true
+ case DefDef(_, _, _, _, EmptyTree)
+ | ValDef(_, _, EmptyTree)
+ | TypeDef(_, _) => true
case _ => false
}
/** Is tree legal as a member definition of an interface?
*/
def isPureInterfaceMember(tree: Tree): Boolean = unsplice(tree) match {
- case EmptyTree | Import(_, _) | TypeDef(_, _, _) => true
- case DefDef(_, _, _, _, _, rhs) => rhs.isEmpty
- case ValDef(mods, _, _, rhs) => rhs.isEmpty
+ case EmptyTree | Import(_, _) | TypeDef(_, _) => true
+ case DefDef(_, _, _, _, rhs) => rhs.isEmpty
+ case ValDef(_, _, rhs) => rhs.isEmpty
case _ => false
}
@@ -91,7 +91,7 @@ trait TreeInfo[T >: Untyped <: Type] { self: Trees.Instance[T] =>
/** If tree is a closure, it's body, otherwise tree itself */
def closureBody(tree: tpd.Tree): tpd.Tree = tree match {
- case Block(DefDef(_, nme.ANON_FUN, _, _, _, rhs) :: Nil, Closure(_, _, _)) => rhs
+ case Block(DefDef(nme.ANON_FUN, _, _, _, rhs) :: Nil, Closure(_, _, _)) => rhs
case _ => tree
}
@@ -162,26 +162,10 @@ trait TreeInfo[T >: Untyped <: Type] { self: Trees.Instance[T] =>
/** The arguments to the first constructor in `stats`. */
def firstConstructorArgs(stats: List[Tree]): List[Tree] = firstConstructor(stats) match {
- case DefDef(_, _, _, args :: _, _, _) => args
+ case DefDef(_, _, args :: _, _, _) => args
case _ => Nil
}
- /** The value definitions marked PRESUPER in this statement sequence */
- def preSuperFields(stats: List[Tree]): List[ValDef] =
- (stats filter isEarlyValDef).asInstanceOf[List[ValDef]]
-
- def isEarlyDef(tree: Tree) = isEarlyValDef(tree) || isEarlyTypeDef(tree)
-
- def isEarlyValDef(tree: Tree) = unsplice(tree) match {
- case ValDef(mods, _, _, _) => mods is Scala2PreSuper
- case _ => false
- }
-
- def isEarlyTypeDef(tree: Tree) = unsplice(tree) match {
- case TypeDef(mods, _, _) => mods is Scala2PreSuper
- case _ => false
- }
-
/** Is tpt a vararg type of the form T* ? */
def isRepeatedParamType(tpt: Tree)(implicit ctx: Context) = tpt match {
case tpt: TypeTree => tpt.typeOpt.isRepeatedParam
@@ -263,7 +247,7 @@ trait TreeInfo[T >: Untyped <: Type] { self: Trees.Instance[T] =>
/** True iff definition if a val or def with no right-hand-side, or it
* is an abstract typoe declaration
*/
- def lacksDefinition(mdef: MemberDef) = mdef match {
+ def lacksDefinition(mdef: MemberDef)(implicit ctx: Context) = mdef match {
case mdef: ValOrDefDef => mdef.rhs.isEmpty && !mdef.name.isConstructorName && !mdef.mods.is(ParamAccessor)
case mdef: TypeDef => mdef.rhs.isEmpty || mdef.rhs.isInstanceOf[TypeBoundsTree]
case _ => false
@@ -299,12 +283,12 @@ trait TypedTreeInfo extends TreeInfo[Type] { self: Trees.Instance[Type] =>
*/
private def statPurity(tree: tpd.Tree)(implicit ctx: Context): PurityLevel = unsplice(tree) match {
case EmptyTree
- | TypeDef(_, _, _)
+ | TypeDef(_, _)
| Import(_, _)
- | DefDef(_, _, _, _, _, _) =>
+ | DefDef(_, _, _, _, _) =>
Pure
- case ValDef(mods, _, _, rhs) =>
- if (mods is Mutable) Impure else exprPurity(rhs)
+ case vdef @ ValDef(_, _, rhs) =>
+ if (vdef.mods is Mutable) Impure else exprPurity(rhs)
case _ =>
Impure
}
diff --git a/src/dotty/tools/dotc/ast/TreeTypeMap.scala b/src/dotty/tools/dotc/ast/TreeTypeMap.scala
index 32c89c94f..846c661f5 100644
--- a/src/dotty/tools/dotc/ast/TreeTypeMap.scala
+++ b/src/dotty/tools/dotc/ast/TreeTypeMap.scala
@@ -90,10 +90,10 @@ final class TreeTypeMap(
tree1.withType(mapType(tree1.tpe)) match {
case id: Ident if tpd.needsSelect(id.tpe) =>
ref(id.tpe.asInstanceOf[TermRef]).withPos(id.pos)
- case ddef @ DefDef(mods, name, tparams, vparamss, tpt, rhs) =>
+ case ddef @ DefDef(name, tparams, vparamss, tpt, rhs) =>
val (tmap1, tparams1) = transformDefs(ddef.tparams)
val (tmap2, vparamss1) = tmap1.transformVParamss(vparamss)
- cpy.DefDef(ddef)(mods, name, tparams1, vparamss1, tmap2.transform(tpt), tmap2.transform(rhs))
+ cpy.DefDef(ddef)(name, tparams1, vparamss1, tmap2.transform(tpt), tmap2.transform(rhs))
case blk @ Block(stats, expr) =>
val (tmap1, stats1) = transformDefs(stats)
val expr1 = tmap1.transform(expr)
diff --git a/src/dotty/tools/dotc/ast/Trees.scala b/src/dotty/tools/dotc/ast/Trees.scala
index 648f19a4f..0886a2ace 100644
--- a/src/dotty/tools/dotc/ast/Trees.scala
+++ b/src/dotty/tools/dotc/ast/Trees.scala
@@ -13,6 +13,7 @@ import parsing.Tokens.Token
import printing.Printer
import util.{Stats, Attachment, DotClass}
import annotation.unchecked.uncheckedVariance
+import language.implicitConversions
object Trees {
@@ -435,10 +436,25 @@ object Trees {
* The envelope of a MemberDef contains the whole definition and his its point
* on the opening keyword (or the next token after that if keyword is missing).
*/
- trait MemberDef[-T >: Untyped] extends NameTree[T] with DefTree[T] {
+ abstract class MemberDef[-T >: Untyped] extends NameTree[T] with DefTree[T] {
type ThisTree[-T >: Untyped] <: MemberDef[T]
- def mods: Modifiers[T]
- override def envelope: Position = mods.pos union pos union initialPos
+
+ private[this] var myMods: Modifiers[T] = null
+
+ private[ast] def rawMods: Modifiers[T] =
+ if (myMods == null) genericEmptyModifiers else myMods
+
+ def withMods(mods: Modifiers[T @uncheckedVariance]): ThisTree[T] = { // TODO move to untpd.modsDeco?
+ val tree = if (myMods == null || (myMods == mods)) this else clone.asInstanceOf[MemberDef[T]]
+ tree.setMods(mods)
+ tree.asInstanceOf[ThisTree[T]]
+ }
+
+ def withFlags(flags: FlagSet): ThisTree[T] = withMods(Modifiers(flags))
+
+ protected def setMods(mods: Modifiers[T @uncheckedVariance]) = myMods = mods
+
+ override def envelope: Position = rawMods.pos union pos union initialPos
}
/** A ValDef or DefDef tree */
@@ -731,14 +747,14 @@ object Trees {
}
/** mods val name: tpt = rhs */
- case class ValDef[-T >: Untyped] private[ast] (mods: Modifiers[T], name: TermName, tpt: Tree[T], rhs: Tree[T])
+ case class ValDef[-T >: Untyped] private[ast] (name: TermName, tpt: Tree[T], rhs: Tree[T])
extends ValOrDefDef[T] {
type ThisTree[-T >: Untyped] = ValDef[T]
assert(isEmpty || tpt != genericEmptyTree)
}
/** mods def name[tparams](vparams_1)...(vparams_n): tpt = rhs */
- case class DefDef[-T >: Untyped] private[ast] (mods: Modifiers[T], name: TermName, tparams: List[TypeDef[T]], vparamss: List[List[ValDef[T]]], tpt: Tree[T], rhs: Tree[T])
+ case class DefDef[-T >: Untyped] private[ast] (name: TermName, tparams: List[TypeDef[T]], vparamss: List[List[ValDef[T]]], tpt: Tree[T], rhs: Tree[T])
extends ValOrDefDef[T] {
type ThisTree[-T >: Untyped] = DefDef[T]
assert(tpt != genericEmptyTree)
@@ -749,7 +765,7 @@ object Trees {
* mods type name = rhs or
* mods type name >: lo <: hi, if rhs = TypeBoundsTree(lo, hi) & (lo ne hi)
*/
- case class TypeDef[-T >: Untyped] private[ast] (mods: Modifiers[T], name: TypeName, rhs: Tree[T])
+ case class TypeDef[-T >: Untyped] private[ast] (name: TypeName, rhs: Tree[T])
extends MemberDef[T] {
type ThisTree[-T >: Untyped] = TypeDef[T]
@@ -819,15 +835,18 @@ object Trees {
}
class EmptyValDef[T >: Untyped] extends ValDef[T](
- Modifiers[T](PrivateLocal), nme.WILDCARD, genericEmptyTree[T], genericEmptyTree[T]) with WithoutTypeOrPos[T] {
+ nme.WILDCARD, genericEmptyTree[T], genericEmptyTree[T]) with WithoutTypeOrPos[T] {
override def isEmpty: Boolean = true
+ setMods(Modifiers[T](PrivateLocal))
}
val theEmptyTree: Thicket[Type] = Thicket(Nil)
val theEmptyValDef = new EmptyValDef[Type]
+ val theEmptyModifiers = new Modifiers()
- def genericEmptyValDef[T >: Untyped]: ValDef[T] = theEmptyValDef.asInstanceOf[ValDef[T]]
- def genericEmptyTree[T >: Untyped]: Thicket[T] = theEmptyTree.asInstanceOf[Thicket[T]]
+ def genericEmptyValDef[T >: Untyped]: ValDef[T] = theEmptyValDef.asInstanceOf[ValDef[T]]
+ def genericEmptyTree[T >: Untyped]: Thicket[T] = theEmptyTree.asInstanceOf[Thicket[T]]
+ def genericEmptyModifiers[T >: Untyped]: Modifiers[T] = theEmptyModifiers.asInstanceOf[Modifiers[T]]
def flatten[T >: Untyped](trees: List[Tree[T]]): List[Tree[T]] = {
var buf: ListBuffer[Tree[T]] = null
@@ -919,6 +938,7 @@ object Trees {
val EmptyTree: Thicket = genericEmptyTree
val EmptyValDef: ValDef = genericEmptyValDef
+ val EmptyModifiers: Modifiers = genericEmptyModifiers
// ----- Auxiliary creation methods ------------------
@@ -935,6 +955,11 @@ object Trees {
case ys => Thicket(ys)
}
+ // ----- Accessing modifiers ----------------------------------------------------
+
+ abstract class ModsDeco { def mods: Modifiers }
+ implicit def modsDeco(mdef: MemberDef)(implicit ctx: Context): ModsDeco
+
// ----- Helper classes for copying, transforming, accumulating -----------------
val cpy: TreeCopier
@@ -949,10 +974,14 @@ object Trees {
abstract class TreeCopier {
def postProcess(tree: Tree, copied: untpd.Tree): copied.ThisTree[T]
+ def postProcess(tree: Tree, copied: untpd.MemberDef): copied.ThisTree[T]
def finalize(tree: Tree, copied: untpd.Tree): copied.ThisTree[T] =
postProcess(tree, copied withPos tree.pos)
+ def finalize(tree: Tree, copied: untpd.MemberDef): copied.ThisTree[T] =
+ postProcess(tree, copied withPos tree.pos)
+
def Ident(tree: Tree)(name: Name): Ident = tree match {
case tree: BackquotedIdent =>
if (name == tree.name) tree
@@ -1094,17 +1123,17 @@ object Trees {
case tree: UnApply if (fun eq tree.fun) && (implicits eq tree.implicits) && (patterns eq tree.patterns) => tree
case _ => finalize(tree, untpd.UnApply(fun, implicits, patterns))
}
- def ValDef(tree: Tree)(mods: Modifiers, name: TermName, tpt: Tree, rhs: Tree): ValDef = tree match {
- case tree: ValDef if (mods == tree.mods) && (name == tree.name) && (tpt eq tree.tpt) && (rhs eq tree.rhs) => tree
- case _ => finalize(tree, untpd.ValDef(mods, name, tpt, rhs))
+ def ValDef(tree: Tree)(name: TermName, tpt: Tree, rhs: Tree): ValDef = tree match {
+ case tree: ValDef if (name == tree.name) && (tpt eq tree.tpt) && (rhs eq tree.rhs) => tree
+ case _ => finalize(tree, untpd.ValDef(name, tpt, rhs))
}
- def DefDef(tree: Tree)(mods: Modifiers, name: TermName, tparams: List[TypeDef], vparamss: List[List[ValDef]], tpt: Tree, rhs: Tree): DefDef = tree match {
- case tree: DefDef if (mods == tree.mods) && (name == tree.name) && (tparams eq tree.tparams) && (vparamss eq tree.vparamss) && (tpt eq tree.tpt) && (rhs eq tree.rhs) => tree
- case _ => finalize(tree, untpd.DefDef(mods, name, tparams, vparamss, tpt, rhs))
+ def DefDef(tree: Tree)(name: TermName, tparams: List[TypeDef], vparamss: List[List[ValDef]], tpt: Tree, rhs: Tree): DefDef = tree match {
+ case tree: DefDef if (name == tree.name) && (tparams eq tree.tparams) && (vparamss eq tree.vparamss) && (tpt eq tree.tpt) && (rhs eq tree.rhs) => tree
+ case _ => finalize(tree, untpd.DefDef(name, tparams, vparamss, tpt, rhs))
}
- def TypeDef(tree: Tree)(mods: Modifiers, name: TypeName, rhs: Tree, tparams: List[untpd.TypeDef]): TypeDef = tree match {
- case tree: TypeDef if (mods == tree.mods) && (name == tree.name) && (rhs eq tree.rhs) && (tparams eq tree.tparams) => tree
- case _ => finalize(tree, untpd.TypeDef(mods, name, tparams, rhs))
+ def TypeDef(tree: Tree)(name: TypeName, rhs: Tree, tparams: List[untpd.TypeDef]): TypeDef = tree match {
+ case tree: TypeDef if (name == tree.name) && (rhs eq tree.rhs) && (tparams eq tree.tparams) => tree
+ case _ => finalize(tree, untpd.TypeDef(name, tparams, rhs))
}
def Template(tree: Tree)(constr: DefDef, parents: List[Tree], self: ValDef, body: List[Tree]): Template = tree match {
case tree: Template if (constr eq tree.constr) && (parents eq tree.parents) && (self eq tree.self) && (body eq tree.body) => tree
@@ -1139,12 +1168,12 @@ object Trees {
Try(tree: Tree)(expr, cases, finalizer)
def UnApply(tree: UnApply)(fun: Tree = tree.fun, implicits: List[Tree] = tree.implicits, patterns: List[Tree] = tree.patterns): UnApply =
UnApply(tree: Tree)(fun, implicits, patterns)
- def ValDef(tree: ValDef)(mods: Modifiers = tree.mods, name: TermName = tree.name, tpt: Tree = tree.tpt, rhs: Tree = tree.rhs): ValDef =
- ValDef(tree: Tree)(mods, name, tpt, rhs)
- def DefDef(tree: DefDef)(mods: Modifiers = tree.mods, name: TermName = tree.name, tparams: List[TypeDef] = tree.tparams, vparamss: List[List[ValDef]] = tree.vparamss, tpt: Tree = tree.tpt, rhs: Tree = tree.rhs): DefDef =
- DefDef(tree: Tree)(mods, name, tparams, vparamss, tpt, rhs)
- def TypeDef(tree: TypeDef)(mods: Modifiers = tree.mods, name: TypeName = tree.name, rhs: Tree = tree.rhs, tparams: List[untpd.TypeDef] = tree.tparams): TypeDef =
- TypeDef(tree: Tree)(mods, name, rhs, tparams)
+ def ValDef(tree: ValDef)(name: TermName = tree.name, tpt: Tree = tree.tpt, rhs: Tree = tree.rhs): ValDef =
+ ValDef(tree: Tree)(name, tpt, rhs)
+ def DefDef(tree: DefDef)(name: TermName = tree.name, tparams: List[TypeDef] = tree.tparams, vparamss: List[List[ValDef]] = tree.vparamss, tpt: Tree = tree.tpt, rhs: Tree = tree.rhs): DefDef =
+ DefDef(tree: Tree)(name, tparams, vparamss, tpt, rhs)
+ def TypeDef(tree: TypeDef)(name: TypeName = tree.name, rhs: Tree = tree.rhs, tparams: List[untpd.TypeDef] = tree.tparams): TypeDef =
+ TypeDef(tree: Tree)(name, rhs, tparams)
def Template(tree: Template)(constr: DefDef = tree.constr, parents: List[Tree] = tree.parents, self: ValDef = tree.self, body: List[Tree] = tree.body): Template =
Template(tree: Tree)(constr, parents, self, body)
}
@@ -1220,14 +1249,17 @@ object Trees {
cpy.UnApply(tree)(transform(fun), transform(implicits), transform(patterns))
case EmptyValDef =>
tree
- case ValDef(mods, name, tpt, rhs) =>
+ case tree @ ValDef(name, tpt, rhs) =>
val tpt1 = transform(tpt)
val rhs1 = transform(rhs)
- cpy.ValDef(tree)(mods, name, transform(tpt1), transform(rhs1))
- case DefDef(mods, name, tparams, vparamss, tpt, rhs) =>
- cpy.DefDef(tree)(mods, name, transformSub(tparams), vparamss mapConserve (transformSub(_)), transform(tpt), transform(rhs))
- case tree @ TypeDef(mods, name, rhs) =>
- cpy.TypeDef(tree)(mods, name, transform(rhs), tree.tparams)
+ cpy.ValDef(tree)(name, transform(tpt1), transform(rhs1))
+ .withMods(tree.rawMods)
+ case tree @ DefDef(name, tparams, vparamss, tpt, rhs) =>
+ cpy.DefDef(tree)(name, transformSub(tparams), vparamss mapConserve (transformSub(_)), transform(tpt), transform(rhs))
+ .withMods(tree.rawMods)
+ case tree @ TypeDef(name, rhs) =>
+ cpy.TypeDef(tree)(name, transform(rhs), tree.tparams)
+ .withMods(tree.rawMods)
case Template(constr, parents, self, body) =>
cpy.Template(tree)(transformSub(constr), transform(parents), transformSub(self), transformStats(body))
case Import(expr, selectors) =>
@@ -1321,11 +1353,11 @@ object Trees {
this(x, trees)
case UnApply(fun, implicits, patterns) =>
this(this(this(x, fun), implicits), patterns)
- case ValDef(mods, name, tpt, rhs) =>
+ case ValDef(name, tpt, rhs) =>
this(this(x, tpt), rhs)
- case DefDef(mods, name, tparams, vparamss, tpt, rhs) =>
+ case DefDef(name, tparams, vparamss, tpt, rhs) =>
this(this((this(x, tparams) /: vparamss)(apply), tpt), rhs)
- case TypeDef(mods, name, rhs) =>
+ case TypeDef(name, rhs) =>
this(x, rhs)
case Template(constr, parents, self, body) =>
this(this(this(this(x, constr), parents), self), body)
@@ -1369,163 +1401,10 @@ object Trees {
case tree: Bind => cpy.Bind(tree)(newName, tree.body)
case tree: ValDef => cpy.ValDef(tree)(name = newName.asTermName)
case tree: DefDef => cpy.DefDef(tree)(name = newName.asTermName)
- case tree: untpd.PolyTypeDef => untpd.cpy.PolyTypeDef(tree)(tree.mods, newName.asTypeName, tree.tparams, tree.rhs)
+ case tree: untpd.PolyTypeDef => untpd.cpy.PolyTypeDef(tree)(newName.asTypeName, tree.tparams, tree.rhs).withMods(tree.rawMods)
case tree: TypeDef => cpy.TypeDef(tree)(name = newName.asTypeName)
case tree: SelectFromTypeTree => cpy.SelectFromTypeTree(tree)(tree.qualifier, newName)
}
}.asInstanceOf[tree.ThisTree[T]]
}
}
- // ----- Helper functions and classes ---------------------------------------
-/*
-
- abstract class FullTreeTransformer[T >: Untyped, C] {
- var sharedMemo: Map[SharedTree[T], SharedTree[T]] = Map()
-
- def transform(tree: Tree[T], c: C): Tree[T] = tree match {
- case Ident(name) =>
- finishIdent(tree, tree, c, plugins)
- case Select(qualifier, name) =>
- finishSelect(tree.derivedSelect(transform(qualifier, c), name), tree, c, plugins)
- case This(qual) =>
- finishThis(tree, tree, c, plugins)
- case Super(qual, mix) =>
- finishSuper(tree.derivedSuper(transform(qual, c), mix), tree, c, plugins)
- case Apply(fun, args) =>
- finishApply(tree.derivedApply(transform(fun, c), transform(args, c)), tree, c, plugins)
- case TypeApply(fun, args) =>
- finishTypeApply(tree.derivedTypeApply(transform(fun, c), transform(args, c)), tree, c, plugins)
- case Literal(const) =>
- finishLiteral(tree, tree, c, plugins)
- case New(tpt) =>
- finishNew(tree.derivedNew(transform(tpt, c)), tree, c, plugins)
- case Pair(left, right) =>
- finishPair(tree.derivedPair(transform(left, c), transform(right, c)), tree, c, plugins)
- case Typed(expr, tpt) =>
- finishTyped(tree.derivedTyped(transform(expr, c), transform(tpt, c)), tree, c, plugins)
- case NamedArg(name, arg) =>
- finishNamedArg(tree.derivedNamedArg(name, transform(arg, c)), tree, c, plugins)
- case Assign(lhs, rhs) =>
- finishAssign(tree.derivedAssign(transform(lhs, c), transform(rhs, c)), tree, c, plugins)
- case Block(stats, expr) =>
- finishBlock(tree.derivedBlock(transform(stats, c), transform(expr, c)), tree, c, plugins)
- case If(cond, thenp, elsep) =>
- finishIf(tree.derivedIf(transform(cond, c), transform(thenp, c), transform(elsep, c)), tree, c, plugins)
- case Closure(env, meth, tpt) =>
- finishClosure(tree.derivedClosure(transform(env, c), transformSub(meth, c)), tree, c, plugins)
- case Match(selector, cases) =>
- finishMatch(tree.derivedMatch(transform(selector, c), transformSub(cases, c)), tree, c, plugins)
- case CaseDef(pat, guard, body) =>
- finishCaseDef(tree.derivedCaseDef(transform(pat, c), transform(guard, c), transform(body, c)), tree, c, plugins)
- case Return(expr, from) =>
- finishReturn(tree.derivedReturn(transform(expr, c), transform(from, c)), tree, c, plugins)
- case Try(block, handler, finalizer) =>
- finishTry(tree.derivedTry(transform(block, c), transform(handler, c), transform(finalizer, c)), tree, c, plugins)
- case Throw(expr) =>
- finishThrow(tree.derivedThrow(transform(expr, c)), tree, c, plugins)
- case SeqLiteral(elems) =>
- finishSeqLiteral(tree.derivedSeqLiteral(transform(elems, c)), tree, c, plugins)
- case TypeTree(original) =>
- finishTypeTree(tree, tree, c, plugins)
- case SingletonTypeTree(ref) =>
- finishSingletonTypeTree(tree.derivedSingletonTypeTree(transform(ref, c)), tree, c, plugins)
- case SelectFromTypeTree(qualifier, name) =>
- finishSelectFromTypeTree(tree.derivedSelectFromTypeTree(transform(qualifier, c), name), tree, c, plugins)
- case AndTypeTree(left, right) =>
- finishAndTypeTree(tree.derivedAndTypeTree(transform(left, c), transform(right, c)), tree, c, plugins)
- case OrTypeTree(left, right) =>
- finishOrTypeTree(tree.derivedOrTypeTree(transform(left, c), transform(right, c)), tree, c, plugins)
- case RefinedTypeTree(tpt, refinements) =>
- finishRefinedTypeTree(tree.derivedRefinedTypeTree(transform(tpt, c), transformSub(refinements, c)), tree, c, plugins)
- case AppliedTypeTree(tpt, args) =>
- finishAppliedTypeTree(tree.derivedAppliedTypeTree(transform(tpt, c), transform(args, c)), tree, c, plugins)
- case TypeBoundsTree(lo, hi) =>
- finishTypeBoundsTree(tree.derivedTypeBoundsTree(transform(lo, c), transform(hi, c)), tree, c, plugins)
- case Bind(name, body) =>
- finishBind(tree.derivedBind(name, transform(body, c)), tree, c, plugins)
- case Alternative(trees) =>
- finishAlternative(tree.derivedAlternative(transform(trees, c)), tree, c, plugins)
- case UnApply(fun, args) =>
- finishUnApply(tree.derivedUnApply(transform(fun, c), transform(args, c)), tree, c, plugins)
- case ValDef(mods, name, tpt, rhs) =>
- finishValDef(tree.derivedValDef(mods, name, transform(tpt, c), transform(rhs, c)), tree, c, plugins)
- case DefDef(mods, name, tparams, vparamss, tpt, rhs) =>
- finishDefDef(tree.derivedDefDef(mods, name, transformSub(tparams, c), vparamss mapConserve (transformSub(_, c)), transform(tpt, c), transform(rhs, c)), tree, c, plugins)
- case tree @ TypeDef(mods, name, rhs) =>
- finishTypeDef(tree.derivedTypeDef(mods, name, transform(rhs, c), tree.tparams), tree, c, plugins)
- case Template(constr, parents, self, body) =>
- finishTemplate(tree.derivedTemplate(transformSub(constr, c), transform(parents, c), transformSub(self, c), transform(body, c)), tree, c, plugins)
- case Import(expr, selectors) =>
- finishImport(tree.derivedImport(transform(expr, c), selectors), tree, c, plugins)
- case PackageDef(pid, stats) =>
- finishPackageDef(tree.derivedPackageDef(transformSub(pid, c), transform(stats, c)), tree, c, plugins)
- case Annotated(annot, arg) =>
- finishAnnotated(tree.derivedAnnotated(transform(annot, c), transform(arg, c)), tree, c, plugins)
- case EmptyTree =>
- finishEmptyTree(tree, tree, c, plugins)
- case tree @ SharedTree(shared) =>
- finishSharedTree(
- sharedMemo get tree match {
- case Some(tree1) => tree1
- case None =>
- val tree1 = tree.derivedSharedTree(transform(shared, c))
- sharedMemo = sharedMemo.updated(tree, tree1)
- tree1
- },
- tree, c, plugins)
- }
- def transform(trees: List[Tree[T]], c: C): List[Tree[T]] =
- flatten(trees) mapConserve (transform(_, c))
- def transformSub(tree: Tree[T], c: C): tree.ThisTree[T] =
- transform(tree, c).asInstanceOf[tree.ThisTree[T]]
- def transformSub[TT <: Tree[T]](trees: List[TT], c: C): List[TT] =
- transform(trees, c).asInstanceOf[List[TT]]
-
- type Plugins >: Null
- def plugins: Plugins = null
-
- def finishIdent(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishSelect(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishThis(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishSuper(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishApply(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishTypeApply(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishLiteral(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishNew(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishPair(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishTyped(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishNamedArg(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishAssign(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishFunction(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishBlock(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishIf(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishClosure(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishMatch(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishCaseDef(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishReturn(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishTry(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishThrow(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishSeqLiteral(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishTypeTree(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishSingletonTypeTree(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishSelectFromTypeTree(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishAndTypeTree(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishOrTypeTree(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishRefinedTypeTree(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishAppliedTypeTree(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishTypeBoundsTree(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishBind(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishAlternative(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishUnApply(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishValDef(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishDefDef(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishTypeDef(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishTemplate(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishImport(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishPackageDef(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishAnnotated(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishEmptyTree(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishSharedTree(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- }
-*/
-
diff --git a/src/dotty/tools/dotc/ast/tpd.scala b/src/dotty/tools/dotc/ast/tpd.scala
index 735b218e3..12d4ac5e4 100644
--- a/src/dotty/tools/dotc/ast/tpd.scala
+++ b/src/dotty/tools/dotc/ast/tpd.scala
@@ -165,7 +165,7 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
ta.assignType(untpd.UnApply(fun, implicits, patterns), proto)
def ValDef(sym: TermSymbol, rhs: Tree = EmptyTree)(implicit ctx: Context): ValDef =
- ta.assignType(untpd.ValDef(Modifiers(sym), sym.name, TypeTree(sym.info), rhs), sym)
+ ta.assignType(untpd.ValDef(sym.name, TypeTree(sym.info), rhs), sym)
def SyntheticValDef(name: TermName, rhs: Tree)(implicit ctx: Context): ValDef =
ValDef(ctx.newSymbol(ctx.owner, name, Synthetic, rhs.tpe.widen, coord = rhs.pos), rhs)
@@ -198,12 +198,16 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
val argss = vparamss.nestedMap(vparam => Ident(vparam.termRef))
ta.assignType(
untpd.DefDef(
- Modifiers(sym), sym.name, tparams map TypeDef,
- vparamss.nestedMap(ValDef(_)), TypeTree(rtp), rhsFn(targs)(argss)), sym)
+ sym.name,
+ tparams map TypeDef,
+ vparamss.nestedMap(ValDef(_)),
+ TypeTree(rtp),
+ rhsFn(targs)(argss)),
+ sym)
}
def TypeDef(sym: TypeSymbol)(implicit ctx: Context): TypeDef =
- ta.assignType(untpd.TypeDef(Modifiers(sym), sym.name, TypeTree(sym.info)), sym)
+ ta.assignType(untpd.TypeDef(sym.name, TypeTree(sym.info)), sym)
def ClassDef(cls: ClassSymbol, constr: DefDef, body: List[Tree], superArgs: List[Tree] = Nil)(implicit ctx: Context): TypeDef = {
val firstParent :: otherParents = cls.info.parents
@@ -237,7 +241,7 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
.orElse(ctx.newLocalDummy(cls))
val impl = untpd.Template(constr, parents, selfType, newTypeParams ++ body)
.withType(localDummy.nonMemberTermRef)
- ta.assignType(untpd.TypeDef(Modifiers(cls), cls.name, impl), cls)
+ ta.assignType(untpd.TypeDef(cls.name, impl), cls)
}
def Import(expr: Tree, selectors: List[untpd.Tree])(implicit ctx: Context): Import =
@@ -367,11 +371,17 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
} else foldOver(sym, tree)
}
+ implicit class modsDeco(mdef: MemberDef)(implicit ctx: Context) extends ModsDeco {
+ def mods = if (mdef.hasType) Modifiers(mdef.symbol) else mdef.rawMods
+ }
+
override val cpy = new TypedTreeCopier
class TypedTreeCopier extends TreeCopier {
def postProcess(tree: Tree, copied: untpd.Tree): copied.ThisTree[Type] =
copied.withTypeUnchecked(tree.tpe)
+ def postProcess(tree: Tree, copied: untpd.MemberDef): copied.ThisTree[Type] =
+ copied.withTypeUnchecked(tree.tpe)
override def Select(tree: Tree)(qualifier: Tree, name: Name)(implicit ctx: Context): Select = {
val tree1 = untpd.cpy.Select(tree)(qualifier, name)
diff --git a/src/dotty/tools/dotc/ast/untpd.scala b/src/dotty/tools/dotc/ast/untpd.scala
index 9e6ce4450..02ee1eddf 100644
--- a/src/dotty/tools/dotc/ast/untpd.scala
+++ b/src/dotty/tools/dotc/ast/untpd.scala
@@ -26,10 +26,10 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
}
/** mods object name impl */
- case class ModuleDef(mods: Modifiers, name: TermName, impl: Template)
+ case class ModuleDef(name: TermName, impl: Template)
extends MemberDef {
type ThisTree[-T >: Untyped] <: Trees.NameTree[T] with Trees.MemberDef[T] with ModuleDef
- def withName(name: Name)(implicit ctx: Context) = cpy.ModuleDef(this)(mods, name.toTermName, impl)
+ def withName(name: Name)(implicit ctx: Context) = cpy.ModuleDef(this)(name.toTermName, impl)
}
case class ParsedTry(expr: Tree, handler: Tree, finalizer: Tree) extends TermTree
@@ -59,8 +59,8 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
case class ContextBounds(bounds: TypeBoundsTree, cxBounds: List[Tree]) extends TypTree
case class PatDef(mods: Modifiers, pats: List[Tree], tpt: Tree, rhs: Tree) extends DefTree
- class PolyTypeDef(mods: Modifiers, name: TypeName, override val tparams: List[TypeDef], rhs: Tree)
- extends TypeDef(mods, name, rhs)
+ class PolyTypeDef(name: TypeName, override val tparams: List[TypeDef], rhs: Tree)
+ extends TypeDef(name, rhs)
// ----- TypeTrees that refer to other tree's symbols -------------------
@@ -142,9 +142,9 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
def Bind(name: Name, body: Tree): Bind = new Bind(name, body)
def Alternative(trees: List[Tree]): Alternative = new Alternative(trees)
def UnApply(fun: Tree, implicits: List[Tree], patterns: List[Tree]): UnApply = new UnApply(fun, implicits, patterns)
- def ValDef(mods: Modifiers, name: TermName, tpt: Tree, rhs: Tree): ValDef = new ValDef(mods, name, tpt, rhs)
- def DefDef(mods: Modifiers, name: TermName, tparams: List[TypeDef], vparamss: List[List[ValDef]], tpt: Tree, rhs: Tree): DefDef = new DefDef(mods, name, tparams, vparamss, tpt, rhs)
- def TypeDef(mods: Modifiers, name: TypeName, rhs: Tree): TypeDef = new TypeDef(mods, name, rhs)
+ def ValDef(name: TermName, tpt: Tree, rhs: Tree): ValDef = new ValDef(name, tpt, rhs)
+ def DefDef(name: TermName, tparams: List[TypeDef], vparamss: List[List[ValDef]], tpt: Tree, rhs: Tree): DefDef = new DefDef(name, tparams, vparamss, tpt, rhs)
+ def TypeDef(name: TypeName, rhs: Tree): TypeDef = new TypeDef(name, rhs)
def Template(constr: DefDef, parents: List[Tree], self: ValDef, body: List[Tree]): Template = new Template(constr, parents, self, body)
def Import(expr: Tree, selectors: List[untpd.Tree]): Import = new Import(expr, selectors)
def PackageDef(pid: RefTree, stats: List[Tree]): PackageDef = new PackageDef(pid, stats)
@@ -193,8 +193,8 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
def TypeTree(tpe: Type): TypedSplice = TypedSplice(TypeTree().withTypeUnchecked(tpe))
- def TypeDef(mods: Modifiers, name: TypeName, tparams: List[TypeDef], rhs: Tree): TypeDef =
- if (tparams.isEmpty) TypeDef(mods, name, rhs) else new PolyTypeDef(mods, name, tparams, rhs)
+ def TypeDef(name: TypeName, tparams: List[TypeDef], rhs: Tree): TypeDef =
+ if (tparams.isEmpty) TypeDef(name, rhs) else new PolyTypeDef(name, tparams, rhs)
def unitLiteral = Literal(Constant(()))
@@ -203,14 +203,14 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
def scalaUnit(implicit ctx: Context) = ref(defn.UnitClass.typeRef)
- def makeConstructor(mods: Modifiers, tparams: List[TypeDef], vparamss: List[List[ValDef]], rhs: Tree = EmptyTree)(implicit ctx: Context): DefDef =
- DefDef(mods, nme.CONSTRUCTOR, tparams, vparamss, TypeTree(), rhs)
+ def makeConstructor(tparams: List[TypeDef], vparamss: List[List[ValDef]], rhs: Tree = EmptyTree)(implicit ctx: Context): DefDef =
+ DefDef(nme.CONSTRUCTOR, tparams, vparamss, TypeTree(), rhs)
def emptyConstructor(implicit ctx: Context): DefDef =
- makeConstructor(Modifiers(), Nil, Nil)
+ makeConstructor(Nil, Nil)
def makeSelfDef(name: TermName, tpt: Tree)(implicit ctx: Context) =
- ValDef(Modifiers(PrivateLocal), name, tpt, EmptyTree)
+ ValDef(name, tpt, EmptyTree).withFlags(PrivateLocal)
def makeTupleOrParens(ts: List[Tree])(implicit ctx: Context) = ts match {
case t :: Nil => Parens(t)
@@ -222,15 +222,15 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
case _ => Tuple(ts)
}
- def makeParameter(pname: TermName, tpe: Tree, mods: Modifiers = Modifiers())(implicit ctx: Context): ValDef =
- ValDef(mods | Param, pname, tpe, EmptyTree)
+ def makeParameter(pname: TermName, tpe: Tree, mods: Modifiers = EmptyModifiers)(implicit ctx: Context): ValDef =
+ ValDef(pname, tpe, EmptyTree).withMods(mods | Param)
def makeSyntheticParameter(n: Int = 1, tpt: Tree = TypeTree())(implicit ctx: Context): ValDef =
- ValDef(Modifiers(SyntheticTermParam), nme.syntheticParamName(n), tpt, EmptyTree)
+ ValDef(nme.syntheticParamName(n), tpt, EmptyTree).withFlags(SyntheticTermParam)
def refOfDef(tree: NameTree)(implicit ctx: Context) = Ident(tree.name)
-// ------- A decorator for producing a path to a location --------------
+// ------- Decorators -------------------------------------------------
implicit class UntypedTreeDecorator(val self: Tree) extends AnyVal {
def locateEnclosing(base: List[Tree], pos: Position): List[Tree] = {
@@ -245,21 +245,33 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
}
}
+ implicit class modsDeco(val mdef: MemberDef)(implicit ctx: Context) extends ModsDeco {
+ def mods = mdef.rawMods
+ }
+
// --------- Copier/Transformer/Accumulator classes for untyped trees -----
override val cpy: UntypedTreeCopier = new UntypedTreeCopier
class UntypedTreeCopier extends TreeCopier {
+
def postProcess(tree: Tree, copied: Tree): copied.ThisTree[Untyped] =
copied.asInstanceOf[copied.ThisTree[Untyped]]
- def ModuleDef(tree: Tree)(mods: Modifiers, name: TermName, impl: Template) = tree match {
- case tree: ModuleDef if (mods eq tree.mods) && (name eq tree.name) && (impl eq tree.impl) => tree
- case _ => untpd.ModuleDef(mods, name, impl).withPos(tree.pos)
+ def postProcess(tree: Tree, copied: MemberDef): copied.ThisTree[Untyped] = {
+ tree match {
+ case tree: MemberDef => copied.withMods(tree.rawMods)
+ case _ => copied
+ }
+ }.asInstanceOf[copied.ThisTree[Untyped]]
+
+ def ModuleDef(tree: Tree)(name: TermName, impl: Template) = tree match {
+ case tree: ModuleDef if (name eq tree.name) && (impl eq tree.impl) => tree
+ case _ => untpd.ModuleDef(name, impl).withPos(tree.pos)
}
- def PolyTypeDef(tree: Tree)(mods: Modifiers, name: TypeName, tparams: List[TypeDef], rhs: Tree) = tree match {
- case tree: PolyTypeDef if (mods eq tree.mods) && (name eq tree.name) && (tparams eq tree.tparams) && (rhs eq tree.rhs) => tree
- case _ => new PolyTypeDef(mods, name, tparams, rhs).withPos(tree.pos)
+ def PolyTypeDef(tree: Tree)(name: TypeName, tparams: List[TypeDef], rhs: Tree) = tree match {
+ case tree: PolyTypeDef if (name eq tree.name) && (tparams eq tree.tparams) && (rhs eq tree.rhs) => tree
+ case _ => new PolyTypeDef(name, tparams, rhs).withPos(tree.pos)
}
def SymbolLit(tree: Tree)(str: String) = tree match {
case tree: SymbolLit if (str == tree.str) => tree
@@ -329,8 +341,8 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
abstract class UntypedTreeMap(cpy: UntypedTreeCopier = untpd.cpy) extends TreeMap(cpy) {
override def transform(tree: Tree)(implicit ctx: Context): Tree = tree match {
- case ModuleDef(mods, name, impl) =>
- cpy.ModuleDef(tree)(mods, name, transformSub(impl))
+ case ModuleDef(name, impl) =>
+ cpy.ModuleDef(tree)(name, transformSub(impl))
case SymbolLit(str) =>
cpy.SymbolLit(tree)(str)
case InterpolatedString(id, strings, elems) =>
@@ -364,7 +376,7 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
case PatDef(mods, pats, tpt, rhs) =>
cpy.PatDef(tree)(mods, transform(pats), transform(tpt), transform(rhs))
case tree: PolyTypeDef =>
- cpy.PolyTypeDef(tree)(tree.mods, tree.name, transformSub(tree.tparams), transform(tree.rhs))
+ cpy.PolyTypeDef(tree)(tree.name, transformSub(tree.tparams), transform(tree.rhs))
case _ =>
super.transform(tree)
}
@@ -372,7 +384,7 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
abstract class UntypedTreeAccumulator[X] extends TreeAccumulator[X] {
override def foldOver(x: X, tree: Tree): X = tree match {
- case ModuleDef(mods, name, impl) =>
+ case ModuleDef(name, impl) =>
this(x, impl)
case SymbolLit(str) =>
x
@@ -417,7 +429,7 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
override def rename(tree: NameTree, newName: Name)(implicit ctx: Context): tree.ThisTree[Untyped] = tree match {
case t: PolyTypeDef =>
- cpy.PolyTypeDef(t)(t.mods, newName.asTypeName, t.tparams, t.rhs).asInstanceOf[tree.ThisTree[Untyped]]
+ cpy.PolyTypeDef(t)(newName.asTypeName, t.tparams, t.rhs).asInstanceOf[tree.ThisTree[Untyped]]
case _ => super.rename(tree, newName)
}
}
diff --git a/src/dotty/tools/dotc/parsing/Parsers.scala b/src/dotty/tools/dotc/parsing/Parsers.scala
index 2651b7514..af4229763 100644
--- a/src/dotty/tools/dotc/parsing/Parsers.scala
+++ b/src/dotty/tools/dotc/parsing/Parsers.scala
@@ -1030,7 +1030,7 @@ object Parsers {
case USCORE =>
val start = in.skipToken()
val pname = ctx.freshName(nme.USCORE_PARAM_PREFIX).toTermName
- val param = ValDef(Modifiers(SyntheticTermParam), pname, TypeTree(), EmptyTree)
+ val param = ValDef(pname, TypeTree(), EmptyTree).withFlags(SyntheticTermParam)
.withPos(Position(start))
placeholderParams = param :: placeholderParams
atPos(start) { Ident(pname) }
@@ -1486,7 +1486,7 @@ object Parsers {
val bounds =
if (isConcreteOwner) typeParamBounds(name)
else typeBounds()
- TypeDef(mods, name, hkparams, bounds)
+ TypeDef(name, hkparams, bounds).withMods(mods)
}
}
commaSeparated(typeParam)
@@ -1550,7 +1550,7 @@ object Parsers {
mods = mods.withPos(mods.pos.withStart(implicitOffset))
implicitOffset = -1
}
- ValDef(addFlag(mods, implicitFlag), name, tpt, default)
+ ValDef(name, tpt, default).withMods(addFlag(mods, implicitFlag))
}
}
def paramClause(): List[ValDef] = inParens {
@@ -1687,7 +1687,7 @@ object Parsers {
}
} else EmptyTree
lhs match {
- case (id @ Ident(name: TermName)) :: Nil => cpy.ValDef(id)(mods, name, tpt, rhs)
+ case (id @ Ident(name: TermName)) :: Nil => cpy.ValDef(id)(name, tpt, rhs).withMods(mods)
case _ => PatDef(mods, lhs, tpt, rhs)
}
}
@@ -1705,7 +1705,7 @@ object Parsers {
accept(EQUALS)
atPos(in.offset) { constrExpr() }
}
- makeConstructor(mods, Nil, vparamss, rhs)
+ makeConstructor(Nil, vparamss, rhs).withMods(mods)
} else {
val name = ident()
val tparams = typeParamClauseOpt(ParamOwner.Def)
@@ -1716,7 +1716,7 @@ object Parsers {
accept(EQUALS)
expr()
} else EmptyTree
- DefDef(mods | Method, name, tparams, vparamss, tpt, rhs)
+ DefDef(name, tparams, vparamss, tpt, rhs).withMods(mods | Method)
}
}
@@ -1758,9 +1758,9 @@ object Parsers {
in.token match {
case EQUALS =>
in.nextToken()
- TypeDef(mods, name, tparams, typ())
+ TypeDef(name, tparams, typ()).withMods(mods)
case SUPERTYPE | SUBTYPE | SEMI | NEWLINE | NEWLINES | COMMA | RBRACE | EOF =>
- TypeDef(mods, name, tparams, typeBounds())
+ TypeDef(name, tparams, typeBounds()).withMods(mods)
case _ =>
syntaxErrorOrIncomplete("`=', `>:', or `<:' expected")
EmptyTree
@@ -1796,10 +1796,10 @@ object Parsers {
val tparams = typeParamClauseOpt(ParamOwner.Class)
val cmods = constrModsOpt()
val vparamss = paramClauses(name, mods is Case)
- makeConstructor(cmods, tparams, vparamss)
+ makeConstructor(tparams, vparamss).withMods(cmods)
}
val templ = templateOpt(constr)
- TypeDef(mods, name, templ)
+ TypeDef(name, templ).withMods(mods)
}
/** ConstrMods ::= AccessModifier
@@ -1818,7 +1818,7 @@ object Parsers {
def objectDef(mods: Modifiers): ModuleDef = {
val name = ident()
val template = templateOpt(emptyConstructor())
- ModuleDef(mods, name, template)
+ ModuleDef(name, template).withMods(mods)
}
/* -------- TEMPLATES ------------------------------------------- */
@@ -1941,7 +1941,7 @@ object Parsers {
case Typed(tree @ This(tpnme.EMPTY), tpt) =>
self = makeSelfDef(nme.WILDCARD, tpt).withPos(first.pos)
case _ =>
- val ValDef(_, name, tpt, _) = convertToParam(first, expected = "self type clause")
+ val ValDef(name, tpt, _) = convertToParam(first, expected = "self type clause")
self = makeSelfDef(name, tpt).withPos(first.pos)
}
in.nextToken()
diff --git a/src/dotty/tools/dotc/parsing/SymbolicXMLBuilder.scala b/src/dotty/tools/dotc/parsing/SymbolicXMLBuilder.scala
index 138172012..46d2a450e 100644
--- a/src/dotty/tools/dotc/parsing/SymbolicXMLBuilder.scala
+++ b/src/dotty/tools/dotc/parsing/SymbolicXMLBuilder.scala
@@ -165,7 +165,7 @@ class SymbolicXMLBuilder(parser: Parser, preserveWS: Boolean)(implicit ctx: Cont
/** could optimize if args.length == 0, args.length == 1 AND args(0) is <: Node. */
def makeXMLseq(pos: Position, args: Seq[Tree]) = {
- val buffer = ValDef(Modifiers(), _buf, TypeTree(), New(_scala_xml_NodeBuffer, ListOfNil))
+ val buffer = ValDef(_buf, TypeTree(), New(_scala_xml_NodeBuffer, ListOfNil))
val applies = args filterNot isEmptyText map (t => Apply(Select(Ident(_buf), _plus), List(t)))
atPos(pos)( Block(buffer :: applies.toList, Ident(_buf)) )
@@ -235,9 +235,9 @@ class SymbolicXMLBuilder(parser: Parser, preserveWS: Boolean)(implicit ctx: Cont
case _ => handleUnprefixedAttribute(k, v)
}
- lazy val scopeDef = ValDef(Modifiers(), _scope, _scala_xml_NamespaceBinding, Ident(_tmpscope))
- lazy val tmpScopeDef = ValDef(Modifiers(Mutable), _tmpscope, _scala_xml_NamespaceBinding, Ident(_scope))
- lazy val metadataDef = ValDef(Modifiers(Mutable), _md, _scala_xml_MetaData, _scala_xml_Null)
+ lazy val scopeDef = ValDef(_scope, _scala_xml_NamespaceBinding, Ident(_tmpscope))
+ lazy val tmpScopeDef = ValDef(_tmpscope, _scala_xml_NamespaceBinding, Ident(_scope)).withFlags(Mutable)
+ lazy val metadataDef = ValDef(_md, _scala_xml_MetaData, _scala_xml_Null).withFlags(Mutable)
val makeSymbolicAttrs = if (!attributes.isEmpty) Ident(_md) else _scala_xml_Null
val (attrResult, nsResult) =
diff --git a/src/dotty/tools/dotc/printing/RefinedPrinter.scala b/src/dotty/tools/dotc/printing/RefinedPrinter.scala
index 50b73a357..12ac03bd0 100644
--- a/src/dotty/tools/dotc/printing/RefinedPrinter.scala
+++ b/src/dotty/tools/dotc/printing/RefinedPrinter.scala
@@ -307,28 +307,28 @@ class RefinedPrinter(_ctx: Context) extends PlainPrinter(_ctx) {
toTextLocal(extractor) ~
"(" ~ toTextGlobal(patterns, ", ") ~ ")" ~
("(" ~ toTextGlobal(implicits, ", ") ~ ")" provided implicits.nonEmpty)
- case tree @ ValDef(mods, name, tpt, rhs) =>
+ case tree @ ValDef(name, tpt, rhs) =>
dclTextOr {
- modText(mods, if (mods is Mutable) "var" else "val") ~~ nameIdText(tree) ~
+ modText(tree.mods, if (tree.mods is Mutable) "var" else "val") ~~ nameIdText(tree) ~
optAscription(tpt)
} ~ optText(rhs)(" = " ~ _)
- case tree @ DefDef(mods, name, tparams, vparamss, tpt, rhs) =>
+ case tree @ DefDef(name, tparams, vparamss, tpt, rhs) =>
atOwner(tree) {
dclTextOr {
- val first = modText(mods, "def") ~~ nameIdText(tree) ~ tparamsText(tparams)
+ val first = modText(tree.mods, "def") ~~ nameIdText(tree) ~ tparamsText(tparams)
addVparamssText(first, vparamss) ~ optAscription(tpt)
} ~ optText(rhs)(" = " ~ _)
}
- case tree @ TypeDef(mods, name, rhs) =>
+ case tree @ TypeDef(name, rhs) =>
atOwner(tree) {
def typeDefText(rhsText: Text) =
dclTextOr {
val rhsText1 = if (tree.hasType) toText(tree.symbol.info) else rhsText
- modText(mods, "type") ~~ nameIdText(tree) ~ tparamsText(tree.tparams) ~ rhsText1
+ modText(tree.mods, "type") ~~ nameIdText(tree) ~ tparamsText(tree.tparams) ~ rhsText1
}
rhs match {
case impl: Template =>
- modText(mods, if (mods is Trait) "trait" else "class") ~~ nameIdText(tree) ~ toText(impl) ~
+ modText(tree.mods, if (tree.mods is Trait) "trait" else "class") ~~ nameIdText(tree) ~ toText(impl) ~
(if (tree.hasType && ctx.settings.verbose.value) s"[decls = ${tree.symbol.info.decls}]" else "")
case rhs: TypeBoundsTree =>
typeDefText(toText(rhs))
@@ -336,14 +336,14 @@ class RefinedPrinter(_ctx: Context) extends PlainPrinter(_ctx) {
typeDefText(optText(rhs)(" = " ~ _))
}
}
- case Template(constr @ DefDef(mods, _, tparams, vparamss, _, rhs), parents, self, stats) =>
+ case Template(constr @ DefDef(_, tparams, vparamss, _, rhs), parents, self, stats) =>
val tparamsTxt = tparamsText(tparams)
val primaryConstrs = if (rhs.isEmpty) Nil else constr :: Nil
val prefix: Text =
if (vparamss.isEmpty || primaryConstrs.nonEmpty) tparamsTxt
else {
- var modsText = modText(mods, "")
- if (mods.hasAnnotations && !mods.hasFlags) modsText = modsText ~~ " this"
+ var modsText = modText(constr.mods, "")
+ if (constr.mods.hasAnnotations && !constr.mods.hasFlags) modsText = modsText ~~ " this"
addVparamssText(tparamsTxt ~~ modsText, vparamss)
}
val parentsText = Text(parents map constrText, " with ")
@@ -377,9 +377,9 @@ class RefinedPrinter(_ctx: Context) extends PlainPrinter(_ctx) {
"<empty>"
case TypedSplice(t) =>
toText(t)
- case tree @ ModuleDef(mods, name, impl) =>
+ case tree @ ModuleDef(name, impl) =>
atOwner(tree) {
- modText(mods, "object") ~~ nameIdText(tree) ~ toText(impl)
+ modText(tree.mods, "object") ~~ nameIdText(tree) ~ toText(impl)
}
case SymbolLit(str) =>
"'" + str
@@ -395,16 +395,16 @@ class RefinedPrinter(_ctx: Context) extends PlainPrinter(_ctx) {
case Function(args, body) =>
var implicitSeen: Boolean = false
def argToText(arg: Tree) = arg match {
- case ValDef(mods, name, tpt, _) =>
+ case arg @ ValDef(name, tpt, _) =>
val implicitText =
- if ((mods is Implicit) && !implicitSeen) { implicitSeen = true; "implicit " }
+ if ((arg.mods is Implicit) && !implicitSeen) { implicitSeen = true; "implicit " }
else ""
implicitText ~ toText(name) ~ optAscription(tpt)
case _ =>
toText(arg)
}
val argsText = args match {
- case (arg @ ValDef(_, _, tpt, _)) :: Nil if tpt.isEmpty => argToText(arg)
+ case (arg @ ValDef(_, tpt, _)) :: Nil if tpt.isEmpty => argToText(arg)
case _ => "(" ~ Text(args map argToText, ", ") ~ ")"
}
changePrec(GlobalPrec) {
diff --git a/src/dotty/tools/dotc/transform/Constructors.scala b/src/dotty/tools/dotc/transform/Constructors.scala
index 9420ce2c0..2e8196ff0 100644
--- a/src/dotty/tools/dotc/transform/Constructors.scala
+++ b/src/dotty/tools/dotc/transform/Constructors.scala
@@ -62,7 +62,7 @@ class Constructors extends MiniPhaseTransform with SymTransformer { thisTransfor
override def transformTemplate(tree: Template)(implicit ctx: Context, info: TransformerInfo): Tree = {
val cls = ctx.owner.asClass
- val constr @ DefDef(_, nme.CONSTRUCTOR, Nil, vparams :: Nil, _, EmptyTree) = tree.constr
+ val constr @ DefDef(nme.CONSTRUCTOR, Nil, vparams :: Nil, _, EmptyTree) = tree.constr
// Produce aligned accessors and constructor parameters. We have to adjust
// for any outer parameters, which are last in the sequence of original
@@ -157,7 +157,7 @@ class Constructors extends MiniPhaseTransform with SymTransformer { thisTransfor
def splitStats(stats: List[Tree]): Unit = stats match {
case stat :: stats1 =>
stat match {
- case stat @ ValDef(mods, name, tpt, rhs) if !stat.symbol.is(Lazy) =>
+ case stat @ ValDef(name, tpt, rhs) if !stat.symbol.is(Lazy) =>
val sym = stat.symbol
if (isRetained(sym)) {
if (!rhs.isEmpty && !isWildcardArg(rhs))
diff --git a/src/dotty/tools/dotc/transform/ExtensionMethods.scala b/src/dotty/tools/dotc/transform/ExtensionMethods.scala
index 4adbfe164..7606a08a3 100644
--- a/src/dotty/tools/dotc/transform/ExtensionMethods.scala
+++ b/src/dotty/tools/dotc/transform/ExtensionMethods.scala
@@ -180,8 +180,7 @@ class ExtensionMethods extends MiniPhaseTransform with DenotTransformer with Ful
newC
}
store += atGroupEnd(fullyParameterizedDef(extensionMeth, tree)(_))
- cpy.DefDef(tree)(tree.mods, tree.name, tree.tparams, tree.vparamss, tree.tpt,
- atGroupEnd(forwarder(extensionMeth, tree)(_)))
+ cpy.DefDef(tree)(rhs = atGroupEnd(forwarder(extensionMeth, tree)(_)))
} else tree
}
}
diff --git a/src/dotty/tools/dotc/transform/GettersSetters.scala b/src/dotty/tools/dotc/transform/GettersSetters.scala
index b5933cc48..e1b4b59a0 100644
--- a/src/dotty/tools/dotc/transform/GettersSetters.scala
+++ b/src/dotty/tools/dotc/transform/GettersSetters.scala
@@ -89,7 +89,6 @@ import Decorators._
assert(tree.rhs.tpe.exists, tree.show)
val fieldDef =
cpy.ValDef(tree)(
- mods = tree.mods & EmptyFlags | field.flags,
name = field.name,
rhs = tree.rhs.changeOwner(getter, field).ensureConforms(field.info.widen)
).withType(field.valRef)
diff --git a/src/dotty/tools/dotc/transform/LambdaLift.scala b/src/dotty/tools/dotc/transform/LambdaLift.scala
index f36ff6247..b239008fb 100644
--- a/src/dotty/tools/dotc/transform/LambdaLift.scala
+++ b/src/dotty/tools/dotc/transform/LambdaLift.scala
@@ -386,9 +386,7 @@ class LambdaLift extends MiniPhaseTransform with IdentityDenotTransformer { this
val sym = tree.symbol
val proxyHolder = sym.skipConstructor
if (needsLifting(proxyHolder)) {
- var paramsAdded = addFreeParams(tree, proxies(proxyHolder)).asInstanceOf[DefDef]
- if (sym.is(JavaStatic) && !paramsAdded.mods.is(JavaStatic))
- paramsAdded = cpy.DefDef(paramsAdded)(mods = paramsAdded.mods | JavaStatic)
+ val paramsAdded = addFreeParams(tree, proxies(proxyHolder)).asInstanceOf[DefDef]
if (sym.isConstructor) paramsAdded else liftDef(paramsAdded)
}
else tree
diff --git a/src/dotty/tools/dotc/transform/LazyVals.scala b/src/dotty/tools/dotc/transform/LazyVals.scala
index 9c47ce628..8b430aae9 100644
--- a/src/dotty/tools/dotc/transform/LazyVals.scala
+++ b/src/dotty/tools/dotc/transform/LazyVals.scala
@@ -74,7 +74,7 @@ class LazyValsTransform extends MiniPhaseTransform with IdentityDenotTransformer
* dotty.runtime(eg dotty.runtime.LazyInt)
*/
def transformLocalValDef(x: ValDef)(implicit ctx: Context) = x match {
- case x@ValDef(mods, name, tpt, rhs) =>
+ case x@ValDef(name, tpt, rhs) =>
val valueInitter = rhs
val holderName = ctx.freshName(name.toString + StdNames.nme.LAZY_LOCAL).toTermName
val tpe = x.tpe.widen
@@ -141,12 +141,12 @@ class LazyValsTransform extends MiniPhaseTransform with IdentityDenotTransformer
}
def transformFieldValDefNonVolatile(x: ValDef)(implicit ctx: Context) = x match {
- case x@ValDef(mods, name, tpt, rhs) if (mods is Flags.Lazy) =>
+ case x@ValDef(name, tpt, rhs) if (x.mods is Flags.Lazy) =>
val claz = x.symbol.owner.asClass
val tpe = x.tpe.widen
- assert(!(mods is Flags.Mutable))
+ assert(!(x.mods is Flags.Mutable))
val containerName = ctx.freshName(name.toString + StdNames.nme.LAZY_LOCAL).toTermName
- val containerSymbol = ctx.newSymbol(claz, containerName, (mods &~ Flags.Lazy | containerFlags).flags, tpe, coord = x.symbol.coord).enteredAfter(this)
+ val containerSymbol = ctx.newSymbol(claz, containerName, (x.mods &~ Flags.Lazy | containerFlags).flags, tpe, coord = x.symbol.coord).enteredAfter(this)
val containerTree = ValDef(containerSymbol, initValue(tpe))
if (x.tpe.isNotNull && tpe <:< defn.AnyRefType) { // can use 'null' value instead of flag
@@ -260,8 +260,8 @@ class LazyValsTransform extends MiniPhaseTransform with IdentityDenotTransformer
}
def transformFieldValDefVolatile(x: ValDef)(implicit ctx: Context) = x match {
- case x@ValDef(mods, name, tpt, rhs) if (mods is Flags.Lazy) =>
- assert(!(mods is Flags.Mutable))
+ case x@ValDef(name, tpt, rhs) if (x.mods is Flags.Lazy) =>
+ assert(!(x.mods is Flags.Mutable))
val tpe = x.tpe.widen
val claz = x.symbol.owner.asClass
@@ -303,7 +303,7 @@ class LazyValsTransform extends MiniPhaseTransform with IdentityDenotTransformer
}
val containerName = ctx.freshName(name.toString + StdNames.nme.LAZY_LOCAL).toTermName
- val containerSymbol = ctx.newSymbol(claz, containerName, (mods &~ Flags.Lazy | containerFlags).flags, tpe, coord = x.symbol.coord).enteredAfter(this)
+ val containerSymbol = ctx.newSymbol(claz, containerName, (x.mods &~ Flags.Lazy | containerFlags).flags, tpe, coord = x.symbol.coord).enteredAfter(this)
val containerTree = ValDef(containerSymbol, initValue(tpe))
val offset = Select(ref(companion), offsetSymbol.name)
diff --git a/src/dotty/tools/dotc/transform/Mixin.scala b/src/dotty/tools/dotc/transform/Mixin.scala
index 3d68a2687..a96e5f1f5 100644
--- a/src/dotty/tools/dotc/transform/Mixin.scala
+++ b/src/dotty/tools/dotc/transform/Mixin.scala
@@ -105,15 +105,11 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform =>
initBuf.toList.map(_.changeOwner(impl.symbol, isym)),
stat.rhs.changeOwner(vsym, isym))
initBuf.clear()
- List(
- cpy.DefDef(stat)(mods = stat.mods | Deferred, rhs = EmptyTree),
- DefDef(isym, rhs))
+ cpy.DefDef(stat)(rhs = EmptyTree) :: DefDef(isym, rhs) :: Nil
case stat: DefDef if stat.symbol.isSetter =>
- List(cpy.DefDef(stat)(
- mods = stat.mods | Deferred,
- rhs = EmptyTree))
+ cpy.DefDef(stat)(rhs = EmptyTree) :: Nil
case stat: DefTree =>
- List(stat)
+ stat :: Nil
case stat =>
initBuf += stat
Nil
diff --git a/src/dotty/tools/dotc/transform/PrivateToStatic.scala b/src/dotty/tools/dotc/transform/PrivateToStatic.scala
index 5562fc6b2..15697e655 100644
--- a/src/dotty/tools/dotc/transform/PrivateToStatic.scala
+++ b/src/dotty/tools/dotc/transform/PrivateToStatic.scala
@@ -61,9 +61,7 @@ class PrivateToStatic extends MiniPhase with SymTransformer { thisTransform =>
if (shouldBeStatic(tree.symbol)) {
val thisParamDef = ValDef(thisParam.asTerm)
val vparams :: Nil = tree.vparamss
- cpy.DefDef(tree)(
- mods = tree.mods | JavaStatic,
- vparamss = (thisParamDef :: vparams) :: Nil)
+ cpy.DefDef(tree)(vparamss = (thisParamDef :: vparams) :: Nil)
}
else tree
diff --git a/src/dotty/tools/dotc/transform/RestoreScopes.scala b/src/dotty/tools/dotc/transform/RestoreScopes.scala
index 4a4252326..e133ae2f2 100644
--- a/src/dotty/tools/dotc/transform/RestoreScopes.scala
+++ b/src/dotty/tools/dotc/transform/RestoreScopes.scala
@@ -22,7 +22,7 @@ class RestoreScopes extends MiniPhaseTransform with IdentityDenotTransformer { t
override def treeTransformPhase = thisTransform.next
override def transformTypeDef(tree: TypeDef)(implicit ctx: Context, info: TransformerInfo) = {
- val TypeDef(_, _, Template(constr, _, _, body)) = tree
+ val TypeDef(_, Template(constr, _, _, body)) = tree
val restoredDecls = newScope
for (stat <- constr :: body)
if (stat.isInstanceOf[MemberDef] && stat.symbol.exists)
diff --git a/src/dotty/tools/dotc/transform/SuperAccessors.scala b/src/dotty/tools/dotc/transform/SuperAccessors.scala
index 537c8c0c6..8a531de8d 100644
--- a/src/dotty/tools/dotc/transform/SuperAccessors.scala
+++ b/src/dotty/tools/dotc/transform/SuperAccessors.scala
@@ -224,7 +224,7 @@ class SuperAccessors extends MacroTransform with IdentityDenotTransformer { this
case CaseDef(pat, guard, body) =>
cpy.CaseDef(tree)(pat, transform(guard), transform(body))
- case TypeDef(_, _, impl: Template) =>
+ case TypeDef(_, impl: Template) =>
val cls = sym.asClass
checkCompanionNameClashes(cls)
expandQualifiedPrivates(cls)
@@ -368,7 +368,7 @@ class SuperAccessors extends MacroTransform with IdentityDenotTransformer { this
}
transformSelect
- case tree@DefDef(_, _, _, _, _, rhs) =>
+ case tree @ DefDef(_, _, _, _, rhs) =>
cpy.DefDef(tree)(
rhs = if (isMethodWithExtension(sym)) withInvalidOwner(transform(rhs)) else transform(rhs))
diff --git a/src/dotty/tools/dotc/transform/TailRec.scala b/src/dotty/tools/dotc/transform/TailRec.scala
index 376a41646..57f1336ed 100644
--- a/src/dotty/tools/dotc/transform/TailRec.scala
+++ b/src/dotty/tools/dotc/transform/TailRec.scala
@@ -81,7 +81,7 @@ class TailRec extends MiniPhaseTransform with DenotTransformer with FullParamete
override def transformDefDef(tree: tpd.DefDef)(implicit ctx: Context, info: TransformerInfo): tpd.Tree = {
tree match {
- case dd@DefDef(mods, name, tparams, vparamss0, tpt, rhs0)
+ case dd@DefDef(name, tparams, vparamss0, tpt, rhs0)
if (dd.symbol.isEffectivelyFinal) && !((dd.symbol is Flags.Accessor) || (rhs0 eq EmptyTree) || (dd.symbol is Flags.Label)) =>
val mandatory = dd.symbol.hasAnnotation(defn.TailrecAnnotationClass)
atGroupEnd { implicit ctx: Context =>
@@ -296,8 +296,8 @@ class TailRec extends MiniPhaseTransform with DenotTransformer with FullParamete
assert(false, "We should've never gotten inside a pattern")
tree
- case ValDef(_, _, _, _) | EmptyTree | Super(_, _) | This(_) |
- Literal(_) | TypeTree(_) | DefDef(_, _, _, _, _, _) | TypeDef(_, _, _) =>
+ case ValDef(_, _, _) | EmptyTree | Super(_, _) | This(_) |
+ Literal(_) | TypeTree(_) | DefDef(_, _, _, _, _) | TypeDef(_, _) =>
tree
case Return(expr, from) =>
diff --git a/src/dotty/tools/dotc/transform/TreeChecker.scala b/src/dotty/tools/dotc/transform/TreeChecker.scala
index f6e36a129..dd84cd53a 100644
--- a/src/dotty/tools/dotc/transform/TreeChecker.scala
+++ b/src/dotty/tools/dotc/transform/TreeChecker.scala
@@ -144,7 +144,7 @@ class TreeChecker {
}
override def typedClassDef(cdef: untpd.TypeDef, cls: ClassSymbol)(implicit ctx: Context) = {
- val TypeDef(_, _, impl @ Template(constr, _, _, _)) = cdef
+ val TypeDef(_, impl @ Template(constr, _, _, _)) = cdef
assert(cdef.symbol == cls)
assert(impl.symbol.owner == cls)
assert(constr.symbol.owner == cls)
diff --git a/src/dotty/tools/dotc/transform/TreeTransform.scala b/src/dotty/tools/dotc/transform/TreeTransform.scala
index 850563a48..a70ab8aed 100644
--- a/src/dotty/tools/dotc/transform/TreeTransform.scala
+++ b/src/dotty/tools/dotc/transform/TreeTransform.scala
@@ -960,7 +960,7 @@ object TreeTransforms {
val nestedCtx = if (tree.symbol.exists) localContext(tree.symbol) else ctx
val tpt = transform(tree.tpt, mutatedInfo, cur)(nestedCtx)
val rhs = transform(tree.rhs, mutatedInfo, cur)(nestedCtx)
- goValDef(cpy.ValDef(tree)(tree.mods, tree.name, tpt, rhs), mutatedInfo.nx.nxTransValDef(cur))
+ goValDef(cpy.ValDef(tree)(tree.name, tpt, rhs), mutatedInfo.nx.nxTransValDef(cur))
}
case tree: DefDef =>
implicit val mutatedInfo: TransformerInfo = mutateTransformers(info, prepForDefDef, info.nx.nxPrepDefDef, tree, cur)
@@ -971,14 +971,14 @@ object TreeTransforms {
val vparams = tree.vparamss.mapConserve(x => transformSubTrees(x, mutatedInfo, cur)(nestedCtx))
val tpt = transform(tree.tpt, mutatedInfo, cur)(nestedCtx)
val rhs = transform(tree.rhs, mutatedInfo, cur)(nestedCtx)
- goDefDef(cpy.DefDef(tree)(tree.mods, tree.name, tparams, vparams, tpt, rhs), mutatedInfo.nx.nxTransDefDef(cur))
+ goDefDef(cpy.DefDef(tree)(tree.name, tparams, vparams, tpt, rhs), mutatedInfo.nx.nxTransDefDef(cur))
}
case tree: TypeDef =>
implicit val mutatedInfo: TransformerInfo = mutateTransformers(info, prepForTypeDef, info.nx.nxPrepTypeDef, tree, cur)
if (mutatedInfo eq null) tree
else {
val rhs = transform(tree.rhs, mutatedInfo, cur)(localContext(tree.symbol))
- goTypeDef(cpy.TypeDef(tree)(tree.mods, tree.name, rhs, tree.tparams), mutatedInfo.nx.nxTransTypeDef(cur))
+ goTypeDef(cpy.TypeDef(tree)(tree.name, rhs, tree.tparams), mutatedInfo.nx.nxTransTypeDef(cur))
}
case _ =>
tree
diff --git a/src/dotty/tools/dotc/typer/EtaExpansion.scala b/src/dotty/tools/dotc/typer/EtaExpansion.scala
index 394accd03..6ecd90c08 100644
--- a/src/dotty/tools/dotc/typer/EtaExpansion.scala
+++ b/src/dotty/tools/dotc/typer/EtaExpansion.scala
@@ -135,7 +135,7 @@ object EtaExpansion {
if (mt.paramTypes.length == xarity) mt.paramTypes map (_ => TypeTree())
else mt.paramTypes map TypeTree
val params = (mt.paramNames, paramTypes).zipped.map((name, tpe) =>
- ValDef(Modifiers(Synthetic | Param), name, TypeTree(tpe), EmptyTree).withPos(tree.pos))
+ ValDef(name, TypeTree(tpe), EmptyTree).withFlags(Synthetic | Param).withPos(tree.pos))
val ids = mt.paramNames map (name =>
Ident(name).withPos(tree.pos))
val body = Apply(lifted, ids)
diff --git a/src/dotty/tools/dotc/typer/Namer.scala b/src/dotty/tools/dotc/typer/Namer.scala
index e8bb1b9e7..0ca681d32 100644
--- a/src/dotty/tools/dotc/typer/Namer.scala
+++ b/src/dotty/tools/dotc/typer/Namer.scala
@@ -361,14 +361,14 @@ class Namer { typer: Typer =>
*/
def mergeCompanionDefs() = {
val classDef = mutable.Map[TypeName, TypeDef]()
- for (cdef @ TypeDef(mods, name, _) <- stats)
+ for (cdef @ TypeDef(name, _) <- stats)
if (cdef.isClassDef) classDef(name) = cdef
- for (mdef @ ModuleDef(_, name, _) <- stats)
+ for (mdef @ ModuleDef(name, _) <- stats)
classDef get name.toTypeName match {
case Some(cdef) =>
- val Thicket(vdef :: (mcls @ TypeDef(_, _, impl: Template)) :: Nil) = mdef.attachment(ExpandedTree)
+ val Thicket(vdef :: (mcls @ TypeDef(_, impl: Template)) :: Nil) = mdef.attachment(ExpandedTree)
cdef.attachmentOrElse(ExpandedTree, cdef) match {
- case Thicket(cls :: mval :: TypeDef(_, _, compimpl: Template) :: crest) =>
+ case Thicket(cls :: mval :: TypeDef(_, compimpl: Template) :: crest) =>
val mcls1 = cpy.TypeDef(mcls)(
rhs = cpy.Template(impl)(body = compimpl.body ++ impl.body))
mdef.putAttachment(ExpandedTree, Thicket(vdef :: mcls1 :: Nil))
@@ -433,7 +433,7 @@ class Namer { typer: Typer =>
protected implicit val ctx: Context = localContext(cls).setMode(ictx.mode &~ Mode.InSuperCall)
- val TypeDef(_, name, impl @ Template(constr, parents, self, body)) = original
+ val TypeDef(name, impl @ Template(constr, parents, self, body)) = original
val (params, rest) = body span {
case td: TypeDef => td.mods is Param
@@ -635,7 +635,7 @@ class Namer { typer: Typer =>
/** The type signature of a DefDef with given symbol */
def defDefSig(ddef: DefDef, sym: Symbol)(implicit ctx: Context) = {
- val DefDef(_, name, tparams, vparamss, _, _) = ddef
+ val DefDef(name, tparams, vparamss, _, _) = ddef
completeParams(tparams)
vparamss foreach completeParams
val isConstructor = name == nme.CONSTRUCTOR
diff --git a/src/dotty/tools/dotc/typer/ReTyper.scala b/src/dotty/tools/dotc/typer/ReTyper.scala
index 713549840..a2d4ebad8 100644
--- a/src/dotty/tools/dotc/typer/ReTyper.scala
+++ b/src/dotty/tools/dotc/typer/ReTyper.scala
@@ -71,8 +71,9 @@ class ReTyper extends Typer {
override def tryInsertApplyOrImplicit(tree: Tree, pt: ProtoType)(fallBack: (Tree, TyperState) => Tree)(implicit ctx: Context): Tree =
fallBack(tree, ctx.typerState)
- override def addTypedModifiersAnnotations(mods: untpd.Modifiers, sym: Symbol)(implicit ctx: Context): Modifiers =
- typedModifiers(mods, sym)
+ override def addTypedModifiersAnnotations(mdef: untpd.MemberDef, sym: Symbol)(implicit ctx: Context): Unit =
+ () // was: typedModifiers(Modifiers(sym), sym)
+ // but annotations are not transformed after typer, so no use to check them.
override def ensureConstrCall(cls: ClassSymbol, parents: List[Tree])(implicit ctx: Context): List[Tree] =
parents
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index a5396d445..93a8dff7d 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -312,7 +312,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
case templ: untpd.Template =>
import untpd._
val x = tpnme.ANON_CLASS
- val clsDef = TypeDef(Modifiers(Final), x, templ)
+ val clsDef = TypeDef(x, templ).withFlags(Final)
typed(cpy.Block(tree)(clsDef :: Nil, New(Ident(x), Nil)), pt)
case _ =>
val tpt1 = typedType(tree.tpt)
@@ -538,10 +538,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
val inferredParams: List[untpd.ValDef] =
for ((param, i) <- params.zipWithIndex) yield
if (!param.tpt.isEmpty) param
- else {
- val paramTpt = untpd.TypeTree(inferredParamType(param, protoFormal(i)))
- cpy.ValDef(param)(param.mods, param.name, paramTpt, param.rhs)
- }
+ else cpy.ValDef(param)(tpt = untpd.TypeTree(inferredParamType(param, protoFormal(i))))
// Define result type of closure as the expected type, thereby pushing
// down any implicit searches. We do this even if the expected type is not fully
@@ -729,7 +726,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
val tpt1 = if (tree.tpt.isEmpty) TypeTree(defn.ObjectType) else typedAheadType(tree.tpt)
val refineClsDef = desugar.refinedTypeToClass(tree)
val refineCls = createSymbol(refineClsDef).asClass
- val TypeDef(_, _, Template(_, _, _, refinements1)) = typed(refineClsDef)
+ val TypeDef(_, Template(_, _, _, refinements1)) = typed(refineClsDef)
assert(tree.refinements.length == refinements1.length, s"${tree.refinements} != $refinements1")
def addRefinement(parent: Type, refinement: Tree): Type = {
typr.println(s"adding refinement $refinement")
@@ -785,10 +782,9 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
assignType(cpy.Alternative(tree)(trees1), trees1)
}
- def addTypedModifiersAnnotations(mods: untpd.Modifiers, sym: Symbol)(implicit ctx: Context): Modifiers = {
- val mods1 = typedModifiers(mods, sym)
+ def addTypedModifiersAnnotations(mdef: untpd.MemberDef, sym: Symbol)(implicit ctx: Context): Unit = {
+ val mods1 = typedModifiers(untpd.modsDeco(mdef).mods, sym)
for (tree <- mods1.annotations) sym.addAnnotation(Annotation(tree))
- mods1
}
def typedModifiers(mods: untpd.Modifiers, sym: Symbol)(implicit ctx: Context): Modifiers = track("typedModifiers") {
@@ -802,37 +798,37 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
}
def typedValDef(vdef: untpd.ValDef, sym: Symbol)(implicit ctx: Context) = track("typedValDef") {
- val ValDef(mods, name, tpt, rhs) = vdef
- val mods1 = addTypedModifiersAnnotations(mods, sym)
+ val ValDef(name, tpt, rhs) = vdef
+ addTypedModifiersAnnotations(vdef, sym)
val tpt1 = typedType(tpt)
val rhs1 = rhs match {
case Ident(nme.WILDCARD) => rhs withType tpt1.tpe
case _ => typedExpr(rhs, tpt1.tpe)
}
- assignType(cpy.ValDef(vdef)(mods1, name, tpt1, rhs1), sym)
+ assignType(cpy.ValDef(vdef)(name, tpt1, rhs1), sym)
}
def typedDefDef(ddef: untpd.DefDef, sym: Symbol)(implicit ctx: Context) = track("typedDefDef") {
- val DefDef(mods, name, tparams, vparamss, tpt, rhs) = ddef
- val mods1 = addTypedModifiersAnnotations(mods, sym)
+ val DefDef(name, tparams, vparamss, tpt, rhs) = ddef
+ addTypedModifiersAnnotations(ddef, sym)
val tparams1 = tparams mapconserve (typed(_).asInstanceOf[TypeDef])
val vparamss1 = vparamss nestedMapconserve (typed(_).asInstanceOf[ValDef])
if (sym is Implicit) checkImplicitParamsNotSingletons(vparamss1)
val tpt1 = typedType(tpt)
val rhs1 = typedExpr(rhs, tpt1.tpe)
- assignType(cpy.DefDef(ddef)(mods1, name, tparams1, vparamss1, tpt1, rhs1), sym)
+ assignType(cpy.DefDef(ddef)(name, tparams1, vparamss1, tpt1, rhs1), sym)
//todo: make sure dependent method types do not depend on implicits or by-name params
}
def typedTypeDef(tdef: untpd.TypeDef, sym: Symbol)(implicit ctx: Context): Tree = track("typedTypeDef") {
- val TypeDef(mods, name, rhs) = tdef
- val mods1 = addTypedModifiersAnnotations(mods, sym)
+ val TypeDef(name, rhs) = tdef
+ addTypedModifiersAnnotations(tdef, sym)
val _ = typedType(rhs) // unused, typecheck only to remove from typedTree
- assignType(cpy.TypeDef(tdef)(mods1, name, TypeTree(sym.info), Nil), sym)
+ assignType(cpy.TypeDef(tdef)(name, TypeTree(sym.info), Nil), sym)
}
def typedClassDef(cdef: untpd.TypeDef, cls: ClassSymbol)(implicit ctx: Context) = track("typedClassDef") {
- val TypeDef(mods, name, impl @ Template(constr, parents, self, body)) = cdef
+ val TypeDef(name, impl @ Template(constr, parents, self, body)) = cdef
val superCtx = ctx.superCallContext
def typedParent(tree: untpd.Tree): Tree =
if (tree.isType) typedType(tree)(superCtx)
@@ -843,7 +839,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
result
}
- val mods1 = addTypedModifiersAnnotations(mods, cls)
+ addTypedModifiersAnnotations(cdef, cls)
val constr1 = typed(constr).asInstanceOf[DefDef]
val parentsWithClass = ensureFirstIsClass(parents mapconserve typedParent, cdef.pos.toSynthetic)
val parents1 = ensureConstrCall(cls, parentsWithClass)(superCtx)
@@ -854,7 +850,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
val impl1 = cpy.Template(impl)(constr1, parents1, self1, body1)
.withType(dummy.nonMemberTermRef)
checkVariance(impl1)
- assignType(cpy.TypeDef(cdef)(mods1, name, impl1, Nil), cls)
+ assignType(cpy.TypeDef(cdef)(name, impl1, Nil), cls)
// todo later: check that
// 1. If class is non-abstract, it is instantiatable:
diff --git a/src/dotty/tools/dotc/typer/VarianceChecker.scala b/src/dotty/tools/dotc/typer/VarianceChecker.scala
index e1f50ded9..8fff52170 100644
--- a/src/dotty/tools/dotc/typer/VarianceChecker.scala
+++ b/src/dotty/tools/dotc/typer/VarianceChecker.scala
@@ -128,7 +128,7 @@ class VarianceChecker()(implicit ctx: Context) {
traverseChildren(tree)
case tree: ValDef =>
checkVariance(sym)
- case DefDef(_, _, tparams, vparamss, _, _) =>
+ case DefDef(_, tparams, vparamss, _, _) =>
checkVariance(sym)
tparams foreach traverse
vparamss foreach (_ foreach traverse)