Chromium Code Reviews| Index: dart/lib/compiler/implementation/resolver.dart |
| diff --git a/dart/lib/compiler/implementation/resolver.dart b/dart/lib/compiler/implementation/resolver.dart |
| index 3ab84c7dc809e0ce33018a5d292fe93d2917124b..94faf24a05a986c73eac58ed45b7b4308deaa6cf 100644 |
| --- a/dart/lib/compiler/implementation/resolver.dart |
| +++ b/dart/lib/compiler/implementation/resolver.dart |
| @@ -229,6 +229,50 @@ class ResolverTask extends CompilerTask { |
| new ClassResolverVisitor(compiler, element.getLibrary(), element); |
| visitor.visit(tree); |
| element.isResolved = true; |
| + |
| + while (!toResolve.isEmpty()) { |
| + ClassElement classElement = toResolve.removeFirst(); |
| + classElement.ensureResolved(compiler); |
| + } |
| + |
| + checkOverrides(element); |
| + }); |
| + } |
| + |
| + checkOverrides(ClassElement cls) { |
| + if (cls === compiler.objectClass) return; |
| + cls.forEachMember((holder, member) { |
| + Element superMember = cls.lookupSuperMember(member.name); |
| + if (superMember !== null) { |
| + if (member.modifiers.isStatic()) { |
| + compiler.cancel('Static members cannot override', element: member); |
| + } else { |
| + FunctionElement superFunction = superMember.asFunctionElement(); |
| + FunctionElement function = member.asFunctionElement(); |
| + if (superFunction === null || superFunction.isAccessor()) { |
| + // Field or accessor in super. |
| + if (function !== null && !function.isAccessor()) { |
| + // But a plain method in this class. |
| + compiler.cancel('Cannot override field with method', |
| + element: member); |
| + } |
| + } else { |
| + // Instance method in super. |
| + if (function === null || function.isAccessor()) { |
| + // But a field in this class. |
|
karlklose
2012/06/20 13:51:31
... or accessor ...?
ahe
2012/06/22 12:50:33
Done.
|
| + compiler.cancel('Cannot override method with field', |
| + element: member); |
| + } else { |
| + // Both are plain instance methods. |
| + if (superFunction.requiredParameterCount(compiler) != |
| + function.requiredParameterCount(compiler)) { |
| + compiler.cancel('Bad override', element: member); |
| + } |
| + // TODO(ahe): Check optional parameters. |
| + } |
| + } |
| + } |
| + } |
| }); |
| } |