aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc
diff options
context:
space:
mode:
Diffstat (limited to 'src/dotty/tools/dotc')
-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
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
}