| Index: pkg/front_end/lib/src/fasta/kernel/body_builder.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
|
| index bec7393f04bcdcd55c7f061ab9338ca0ee1aebfc..37d5f8c7345f878bcfd7f6358d90f026ef76ebe2 100644
|
| --- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
|
| +++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
|
| @@ -901,35 +901,35 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| @override
|
| Expression toSuperMethodInvocation(MethodInvocation node) {
|
| Member target = lookupSuperMember(node.name);
|
| - bool isNoSuchMethod = target == null;
|
| - if (target is Procedure) {
|
| - if (!target.isAccessor) {
|
| - if (areArgumentsCompatible(target.function, node.arguments)) {
|
| - Expression result = new KernelDirectMethodInvocation(
|
| - new KernelThisExpression()..fileOffset = node.fileOffset,
|
| - target,
|
| - node.arguments)
|
| - ..fileOffset = node.fileOffset;
|
| - // TODO(ahe): Use [DirectMethodInvocation] when possible, that is,
|
| - // remove the next line:
|
| - result =
|
| - new KernelSuperMethodInvocation(node.name, node.arguments, target)
|
| - ..fileOffset = node.fileOffset;
|
| - return result;
|
| - } else {
|
| - isNoSuchMethod = true;
|
| - }
|
| - }
|
| - }
|
| - if (isNoSuchMethod) {
|
| - return invokeSuperNoSuchMethod(
|
| - node.name.name, node.arguments, node.fileOffset);
|
| + if (target == null || (target is Procedure && !target.isAccessor)) {
|
| + if (target == null) {
|
| + warnUnresolvedSuperMethod(node.name, node.fileOffset);
|
| + } else if (!areArgumentsCompatible(target.function, node.arguments)) {
|
| + target = null;
|
| + warning(
|
| + "Super class doesn't have a method named '${node.name.name}' "
|
| + "with matching arguments.",
|
| + node.fileOffset);
|
| + }
|
| + Expression result;
|
| + if (target != null) {
|
| + result = new KernelDirectMethodInvocation(
|
| + new KernelThisExpression()..fileOffset = node.fileOffset,
|
| + target,
|
| + node.arguments);
|
| + }
|
| + // TODO(ahe): Use [DirectMethodInvocation] when possible, that is,
|
| + // make the next line conditional:
|
| + result =
|
| + new KernelSuperMethodInvocation(node.name, node.arguments, target);
|
| + return result..fileOffset = node.fileOffset;
|
| }
|
| +
|
| Expression receiver = new KernelDirectPropertyGet(
|
| new KernelThisExpression()..fileOffset = node.fileOffset, target)
|
| ..fileOffset = node.fileOffset;
|
| - // TODO(ahe): Use [DirectPropertyGet] when possible, that is, remove the
|
| - // next line:
|
| + // TODO(ahe): Use [DirectPropertyGet] when possible, that is, make the next
|
| + // line conditional:
|
| receiver = new KernelSuperPropertyGet(node.name, target)
|
| ..fileOffset = node.fileOffset;
|
| return buildMethodInvocation(
|
| @@ -977,51 +977,18 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
|
| }
|
|
|
| @override
|
| - Expression invokeSuperNoSuchMethod(
|
| - String name, Arguments arguments, int charOffset,
|
| - {bool isGetter: false, bool isSetter: false}) {
|
| - String errorName = "super.$name";
|
| - String message;
|
| - if (isGetter) {
|
| - message = "Getter not found: '$errorName'.";
|
| - name = "get:$name";
|
| - } else if (isSetter) {
|
| - message = "Setter not found: '$errorName'.";
|
| - name = "set:$name";
|
| - } else {
|
| - message = "Method not found: '$errorName'.";
|
| - }
|
| - warning(message, charOffset);
|
| - VariableDeclaration value;
|
| - if (isSetter) {
|
| - value = new VariableDeclaration.forValue(arguments.positional.single,
|
| - isFinal: true)
|
| - ..fileOffset = charOffset;
|
| - arguments = new Arguments(<Expression>[
|
| - new VariableGet(value)..fileOffset = arguments.fileOffset
|
| - ]);
|
| - }
|
| - Expression result = new SuperMethodInvocation(
|
| - noSuchMethodName,
|
| - new Arguments(<Expression>[
|
| - library.loader.instantiateInvocation(
|
| - new KernelThisExpression()..fileOffset = charOffset,
|
| - name,
|
| - arguments,
|
| - charOffset,
|
| - true)
|
| - ])
|
| - ..fileOffset = arguments.fileOffset);
|
| - if (isSetter) {
|
| - result = new Let(
|
| - value,
|
| - new Let(
|
| - new VariableDeclaration.forValue(result, isFinal: true)
|
| - ..fileOffset = charOffset,
|
| - new VariableGet(value)..fileOffset = value.fileOffset))
|
| - ..fileOffset = charOffset;
|
| - }
|
| - return result;
|
| + void warnUnresolvedSuperGet(Name name, int charOffset) {
|
| + warning("Super class has no getter named '${name.name}'.", charOffset);
|
| + }
|
| +
|
| + @override
|
| + void warnUnresolvedSuperSet(Name name, int charOffset) {
|
| + warning("Super class has no setter named '${name.name}'.", charOffset);
|
| + }
|
| +
|
| + @override
|
| + void warnUnresolvedSuperMethod(Name name, int charOffset) {
|
| + warning("Super class has no method named '${name.name}'.", charOffset);
|
| }
|
|
|
| @override
|
|
|