| Index: sdk/lib/_internal/compiler/implementation/resolution/members.dart
|
| diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
|
| index 87f1de46a577fde4391e8f9b39c3c278644d0eee..8bbd24d2af41604be8ed132a888c64e2943b25b4 100644
|
| --- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
|
| +++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
|
| @@ -643,13 +643,16 @@ class ResolverTask extends CompilerTask {
|
| if (value == null) return;
|
| if (!(isUserDefinableOperator(value) || identical(value, 'unary-'))) return;
|
|
|
| + bool isMinus = false;
|
| int requiredParameterCount;
|
| MessageKind messageKind;
|
| FunctionSignature signature = function.computeSignature(compiler);
|
| if (identical(value, 'unary-')) {
|
| + isMinus = true;
|
| messageKind = MessageKind.MINUS_OPERATOR_BAD_ARITY;
|
| requiredParameterCount = 0;
|
| } else if (isMinusOperator(value)) {
|
| + isMinus = true;
|
| messageKind = MessageKind.MINUS_OPERATOR_BAD_ARITY;
|
| requiredParameterCount = 1;
|
| } else if (isUnaryOperator(value)) {
|
| @@ -665,17 +668,40 @@ class ResolverTask extends CompilerTask {
|
| compiler.internalErrorOnElement(function,
|
| 'Unexpected user defined operator $value');
|
| }
|
| - checkArity(function, requiredParameterCount, messageKind);
|
| + checkArity(function, requiredParameterCount, messageKind, isMinus);
|
| }
|
|
|
| void checkArity(FunctionElement function,
|
| - int requiredParameterCount, MessageKind messageKind) {
|
| + int requiredParameterCount, MessageKind messageKind,
|
| + bool isMinus) {
|
| FunctionExpression node = function.parseNode(compiler);
|
| FunctionSignature signature = function.computeSignature(compiler);
|
| if (signature.requiredParameterCount != requiredParameterCount) {
|
| Node errorNode = node;
|
| if (node.parameters != null) {
|
| - if (signature.requiredParameterCount < requiredParameterCount) {
|
| + if (isMinus ||
|
| + signature.requiredParameterCount < requiredParameterCount) {
|
| + // If there are too few parameters, point to the whole parameter list.
|
| + // For instance
|
| + //
|
| + // int operator +() {}
|
| + // ^^
|
| + //
|
| + // int operator []=(value) {}
|
| + // ^^^^^^^
|
| + //
|
| + // For operator -, always point the whole parameter list, like
|
| + //
|
| + // int operator -(a, b) {}
|
| + // ^^^^^^
|
| + //
|
| + // instead of
|
| + //
|
| + // int operator -(a, b) {}
|
| + // ^
|
| + //
|
| + // since the correction might not be to remove 'b' but instead to
|
| + // remove 'a, b'.
|
| errorNode = node.parameters;
|
| } else {
|
| errorNode = node.parameters.nodes.skip(requiredParameterCount).head;
|
|
|