diff options
author | Martin Odersky <odersky@gmail.com> | 2009-11-24 14:40:04 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2009-11-24 14:40:04 +0000 |
commit | d6b43c4b48dceb4ba6682c4a17dae02a0bc7f138 (patch) | |
tree | a5ba46910ecd1ff6835d79ffc01437f7374cbc04 | |
parent | b93068347ee73cf092e2f902cdd0d591a7d9ae1d (diff) | |
download | scala-d6b43c4b48dceb4ba6682c4a17dae02a0bc7f138.tar.gz scala-d6b43c4b48dceb4ba6682c4a17dae02a0bc7f138.tar.bz2 scala-d6b43c4b48dceb4ba6682c4a17dae02a0bc7f138.zip |
relaxed rule requiring `override` modifiers so ...
relaxed rule requiring `override` modifiers so that it's OK if self type
contains overridden symbol.
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/RefChecks.scala | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala index fbe01c7fac..c4a3981a51 100644 --- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala +++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala @@ -453,21 +453,25 @@ abstract class RefChecks extends InfoTransform { if (!(clazz hasFlag ABSTRACT)) checkNoAbstractDecls(clazz) } - /** Does there exists a symbol declared in class `inclazz` with name `name` and - * whose type seen as a member of `class.thisType` matches `tpe`? + /** Returns whether there is a symbol declared in class `inclazz` + * (which must be different from `clazz`) whose name and type + * seen as a member of `class.thisType` matches `member`'s. */ - def hasMatchingSym(inclazz: Symbol, name: Name, tpe: Type): Boolean = - inclazz.info.nonPrivateDecl(name).filter(sym => - !sym.isTerm || (tpe matches clazz.thisType.memberType(sym))) != NoSymbol + def hasMatchingSym(inclazz: Symbol, member: Symbol): Boolean = + inclazz != clazz && { + val isVarargs = hasRepeatedParam(member.tpe) + inclazz.info.nonPrivateDecl(member.name).filter { sym => + !sym.isTerm || { + val symtpe = clazz.thisType.memberType(sym) + (member.tpe matches symtpe) || isVarargs && (toJavaRepeatedParam(member.tpe) matches symtpe) + } + } != NoSymbol + } // 4. Check that every defined member with an `override' modifier overrides some other member. for (member <- clazz.info.decls.toList) if ((member hasFlag (OVERRIDE | ABSOVERRIDE)) && - !(clazz.ancestors exists { bc => - hasMatchingSym(bc, member.name, member.tpe) || - hasRepeatedParam(member.tpe) && - hasMatchingSym(bc, member.name, toJavaRepeatedParam(member.tpe)) - })) { + !(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 unit.error(member.pos, member.toString() + " overrides nothing"); member resetFlag OVERRIDE |