diff options
author | Martin Odersky <odersky@gmail.com> | 2015-03-08 21:08:41 +0100 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-03-18 11:16:36 +0100 |
commit | 90b05b4554f888f458db886f2644445aedadc7fa (patch) | |
tree | 65dd1a52373a08ea9a8d8d05b4e148b6e41c6bab /src/dotty/tools | |
parent | 26babc32bcef74aec1526c10a2040de0740c59ba (diff) | |
download | dotty-90b05b4554f888f458db886f2644445aedadc7fa.tar.gz dotty-90b05b4554f888f458db886f2644445aedadc7fa.tar.bz2 dotty-90b05b4554f888f458db886f2644445aedadc7fa.zip |
Two more tweaks to make pickling invariant under printing
1) DefDefs with implicit method types generate implicit parameters
2) Super accessors are inserted after class parameters.
With these changes files in core also print the same after pickling,
with the exception of Types and TypeOps which have some spurious differences:
Types are equal but appear in more simplified form after pickling.
Diffstat (limited to 'src/dotty/tools')
-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 } |