diff options
author | Martin Odersky <odersky@gmail.com> | 2014-11-15 12:08:28 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2014-11-15 12:08:28 +0100 |
commit | 222e9a478f7b851582550973df6a9d141766e49a (patch) | |
tree | 78346b8e52317c13a163b89de06a09d95f085c89 /src | |
parent | c1b0ab6f6ed36fed7cc4bfa710704ff197c12b31 (diff) | |
download | dotty-222e9a478f7b851582550973df6a9d141766e49a.tar.gz dotty-222e9a478f7b851582550973df6a9d141766e49a.tar.bz2 dotty-222e9a478f7b851582550973df6a9d141766e49a.zip |
Some fixes to override checking in RefChecks.
`override` was not recognized at all on types.
Diffstat (limited to 'src')
-rw-r--r-- | src/dotty/tools/dotc/transform/SymUtils.scala | 3 | ||||
-rw-r--r-- | src/dotty/tools/dotc/typer/RefChecks.scala | 20 |
2 files changed, 13 insertions, 10 deletions
diff --git a/src/dotty/tools/dotc/transform/SymUtils.scala b/src/dotty/tools/dotc/transform/SymUtils.scala index 449affb9e..7d485f64c 100644 --- a/src/dotty/tools/dotc/transform/SymUtils.scala +++ b/src/dotty/tools/dotc/transform/SymUtils.scala @@ -29,6 +29,9 @@ class SymUtils(val self: Symbol) extends AnyVal { def isVolatile(implicit ctx: Context) = self.hasAnnotation(defn.VolatileAnnot) + def isAnyOverride(implicit ctx: Context) = self.is(Override) || self.is(AbsOverride) + // careful: AbsOverride is a term only flag. combining with Override would catch only terms. + /** If this is a constructor, its owner: otherwise this. */ final def skipConstructor(implicit ctx: Context): Symbol = if (self.isConstructor) self.owner else self diff --git a/src/dotty/tools/dotc/typer/RefChecks.scala b/src/dotty/tools/dotc/typer/RefChecks.scala index 785998549..29ac33498 100644 --- a/src/dotty/tools/dotc/typer/RefChecks.scala +++ b/src/dotty/tools/dotc/typer/RefChecks.scala @@ -5,7 +5,7 @@ import transform._ import core._ import config._ import Symbols._, SymDenotations._, Types._, Contexts._, Decorators._, Flags._, Names._, NameOps._ -import StdNames._, Denotations._, Scopes._, Constants.Constant +import StdNames._, Denotations._, Scopes._, Constants.Constant, SymUtils._ import Annotations._ import util.Positions._ import scala.collection.{ mutable, immutable } @@ -29,9 +29,6 @@ object RefChecks { def apply(pre: Type, name: Name)(implicit ctx: Context): Boolean = isDefaultGetter(name) } - private val AnyOverride = Override | AbsOverride - private val AnyOverrideOrSynthetic = AnyOverride | Synthetic - /** Only one overloaded alternative is allowed to define default arguments */ private def checkOverloadedRestrictions(clazz: Symbol)(implicit ctx: Context): Unit = { // Using the default getters (such as methodName$default$1) as a cheap way of @@ -254,8 +251,10 @@ object RefChecks { overrideError("cannot be used here - classes can only override abstract types") } else if (other.isEffectivelyFinal) { // (1.2) overrideError(i"cannot override final member ${other.showLocated}") - } else if (!other.is(Deferred) && !isDefaultGetter(other.name) && !member.is(AnyOverrideOrSynthetic)) { - // (*) Synthetic exclusion for (at least) default getters, fixes SI-5178. We cannot assign the OVERRIDE flag to + } else if (!other.is(Deferred) && + !isDefaultGetter(other.name) && + !member.isAnyOverride) { + // (*) Exclusion for default getters, fixes SI-5178. We cannot assign the Override flag to // the default getter: one default getter might sometimes override, sometimes not. Example in comment on ticket. if (member.owner != clazz && other.owner != clazz && !(other.owner derivesFrom member.owner)) emitOverrideError( @@ -266,13 +265,13 @@ object RefChecks { overrideError("needs `override' modifier") } else if (other.is(AbsOverride) && other.isIncompleteIn(clazz) && !member.is(AbsOverride)) { overrideError("needs `abstract override' modifiers") - } else if (member.is(AnyOverride) && other.is(Accessor) && + } else if (member.is(Override) && other.is(Accessor) && other.accessedFieldOrGetter.is(Mutable, butNot = Lazy)) { // !?! this is not covered by the spec. We need to resolve this either by changing the spec or removing the test here. // !!! is there a !?! convention? I'm !!!ing this to make sure it turns up on my searches. if (!ctx.settings.overrideVars.value) overrideError("cannot override a mutable variable") - } else if (member.is(AnyOverride) && + } else if (member.isAnyOverride && !(member.owner.thisType.baseClasses exists (_ isSubClass other.owner)) && !member.is(Deferred) && !other.is(Deferred) && intersectionIsEmpty(member.extendedOverriddenSymbols, other.extendedOverriddenSymbols)) { @@ -550,7 +549,7 @@ object RefChecks { // 4. Check that every defined member with an `override` modifier overrides some other member. for (member <- clazz.info.decls) - if (member.is(AnyOverride) && !(clazz.thisType.baseClasses exists (hasMatchingSym(_, member)))) { + if (member.isAnyOverride && !(clazz.thisType.baseClasses exists (hasMatchingSym(_, member)))) { // for (bc <- clazz.info.baseClasses.tail) Console.println("" + bc + " has " + bc.info.decl(member.name) + ":" + bc.info.decl(member.name).tpe);//DEBUG val nonMatching = clazz.info.member(member.name).altsWith(alt => alt.owner != clazz && !alt.is(Final)) @@ -563,7 +562,8 @@ object RefChecks { val superSigs = ms.map(_.showDcl).mkString("\n") issueError(s".\nNote: the super classes of ${member.owner} contain the following, non final members named ${member.name}:\n${superSigs}") } - member.resetFlag(AnyOverride) + member.resetFlag(Override) + member.resetFlag(AbsOverride) } } |