diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/dotty/tools/dotc/ast/tpd.scala | 6 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/SuperAccessors.scala | 13 | ||||
-rw-r--r-- | src/dotty/tools/dotc/typer/Namer.scala | 2 |
3 files changed, 16 insertions, 5 deletions
diff --git a/src/dotty/tools/dotc/ast/tpd.scala b/src/dotty/tools/dotc/ast/tpd.scala index de8811115..61e608ddf 100644 --- a/src/dotty/tools/dotc/ast/tpd.scala +++ b/src/dotty/tools/dotc/ast/tpd.scala @@ -183,8 +183,10 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo { def valueParamss(tp: Type): (List[List[TermSymbol]], Type) = tp match { case tp @ MethodType(paramNames, paramTypes) => - def valueParam(name: TermName, info: Type): TermSymbol = - ctx.newSymbol(sym, name, TermParam, info) + def valueParam(name: TermName, info: Type): TermSymbol = { + val maybeImplicit = if (tp.isInstanceOf[ImplicitMethodType]) Implicit else EmptyFlags + ctx.newSymbol(sym, name, TermParam | maybeImplicit, info) + } val params = (paramNames, paramTypes).zipped.map(valueParam) val (paramss, rtp) = valueParamss(tp.instantiate(params map (_.termRef))) (params :: paramss, rtp) diff --git a/src/dotty/tools/dotc/transform/SuperAccessors.scala b/src/dotty/tools/dotc/transform/SuperAccessors.scala index c4ff6e549..b55628868 100644 --- a/src/dotty/tools/dotc/transform/SuperAccessors.scala +++ b/src/dotty/tools/dotc/transform/SuperAccessors.scala @@ -76,6 +76,7 @@ class SuperAccessors extends MacroTransform with IdentityDenotTransformer { this buf += tree } + /** Turn types which are not methodic into ExprTypes. */ private def ensureMethodic(tpe: Type)(implicit ctx: Context) = tpe match { case tpe: MethodicType => tpe case _ => ExprType(tpe) @@ -293,9 +294,17 @@ class SuperAccessors extends MacroTransform with IdentityDenotTransformer { this def transformTemplate = { val ownStats = new ListBuffer[Tree] accDefs(currentClass) = ownStats - val body1 = forwardParamAccessors(transformStats(impl.body, tree.symbol)) + // write super accessors after parameters and type aliases (so + // that order is stable under pickling/unpickling) + val (params, rest) = impl.body span { + case td: TypeDef => !td.isClassDef + case vd: ValOrDefDef => vd.symbol.flags is ParamAccessor + case _ => false + } + ownStats ++= params + val rest1 = forwardParamAccessors(transformStats(rest, tree.symbol)) accDefs -= currentClass - ownStats ++= body1 + ownStats ++= rest1 cpy.Template(impl)(body = ownStats.toList) } transformTemplate diff --git a/src/dotty/tools/dotc/typer/Namer.scala b/src/dotty/tools/dotc/typer/Namer.scala index 47375ba39..357860290 100644 --- a/src/dotty/tools/dotc/typer/Namer.scala +++ b/src/dotty/tools/dotc/typer/Namer.scala @@ -476,7 +476,7 @@ class Namer { typer: Typer => val (params, rest) = impl.body span { case td: TypeDef => td.mods is Param - case td: ValDef => td.mods is ParamAccessor + case vd: ValDef => vd.mods is ParamAccessor case _ => false } |