aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-03-08 21:08:41 +0100
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2015-03-18 11:16:36 +0100
commit90b05b4554f888f458db886f2644445aedadc7fa (patch)
tree65dd1a52373a08ea9a8d8d05b4e148b6e41c6bab
parent26babc32bcef74aec1526c10a2040de0740c59ba (diff)
downloaddotty-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.
-rw-r--r--src/dotty/tools/dotc/ast/tpd.scala6
-rw-r--r--src/dotty/tools/dotc/transform/SuperAccessors.scala13
-rw-r--r--src/dotty/tools/dotc/typer/Namer.scala2
-rw-r--r--test/dotc/tests.scala1
4 files changed, 17 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
}
diff --git a/test/dotc/tests.scala b/test/dotc/tests.scala
index 303bf46cd..187b91ba6 100644
--- a/test/dotc/tests.scala
+++ b/test/dotc/tests.scala
@@ -39,6 +39,7 @@ class tests extends CompilerTest {
@Test def pickle_pickleOK = compileDir(posDir + "pickleOK/", testPickling)
@Test def pickle_pickling = compileDir(dotcDir + "tools/dotc/core/pickling/", testPickling)
+ @Test def pickle_core = compileDir(dotcDir + "tools/dotc/core/pickling/", testPickling, xerrors = 2) // two spurious comparison errors in Types and TypeOps
@Test def pos_t2168_pat = compileFile(posDir, "t2168")
@Test def pos_erasure = compileFile(posDir, "erasure")