diff options
Diffstat (limited to 'compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala')
-rw-r--r-- | compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala b/compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala index 3d20583f4..6d0fc08f9 100644 --- a/compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala +++ b/compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala @@ -291,26 +291,28 @@ trait TypeAssigner { def assignType(tree: untpd.Super, qual: Tree, inConstrCall: Boolean, mixinClass: Symbol = NoSymbol)(implicit ctx: Context) = { val mix = tree.mix - val qtype @ ThisType(_) = qual.tpe - val cls = qtype.cls - - def findMixinSuper(site: Type): Type = site.parents filter (_.name == mix.name) match { - case p :: Nil => - p - case Nil => - errorType(SuperQualMustBeParent(mix, cls), tree.pos) - case p :: q :: _ => - errorType("ambiguous parent class qualifier", tree.pos) + qual.tpe match { + case err: ErrorType => untpd.cpy.Super(tree)(qual, mix).withType(err) + case qtype @ ThisType(_) => + val cls = qtype.cls + def findMixinSuper(site: Type): Type = site.parents filter (_.name == mix.name) match { + case p :: Nil => + p + case Nil => + errorType(SuperQualMustBeParent(mix, cls), tree.pos) + case p :: q :: _ => + errorType("ambiguous parent class qualifier", tree.pos) + } + val owntype = + if (mixinClass.exists) mixinClass.typeRef + else if (!mix.isEmpty) findMixinSuper(cls.info) + else if (inConstrCall || ctx.erasedTypes) cls.info.firstParent + else { + val ps = cls.classInfo.parentsWithArgs + if (ps.isEmpty) defn.AnyType else ps.reduceLeft((x: Type, y: Type) => x & y) + } + tree.withType(SuperType(cls.thisType, owntype)) } - val owntype = - if (mixinClass.exists) mixinClass.typeRef - else if (!mix.isEmpty) findMixinSuper(cls.info) - else if (inConstrCall || ctx.erasedTypes) cls.info.firstParent - else { - val ps = cls.classInfo.parentsWithArgs - if (ps.isEmpty) defn.AnyType else ps.reduceLeft((x: Type, y: Type) => x & y) - } - tree.withType(SuperType(cls.thisType, owntype)) } def assignType(tree: untpd.Apply, fn: Tree, args: List[Tree])(implicit ctx: Context) = { |