aboutsummaryrefslogtreecommitdiff
path: root/compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala')
-rw-r--r--compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala40
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) = {