Complain about bad operator parameters.

R=karlklose@google.com

Review-Url: https://codereview.chromium.org/2782843002 .
This commit is contained in:
Peter von der Ahé 2017-03-29 13:12:39 +02:00
parent a994d0e47e
commit 695ebae97a
5 changed files with 58 additions and 32 deletions

View file

@ -11,6 +11,9 @@ import 'builder.dart'
abstract class FormalParameterBuilder<T extends TypeBuilder>
extends ModifierBuilder {
@override
final int charOffset;
final List<MetadataBuilder> metadata;
final int modifiers;
@ -25,7 +28,7 @@ abstract class FormalParameterBuilder<T extends TypeBuilder>
FormalParameterType kind = FormalParameterType.REQUIRED;
FormalParameterBuilder(this.metadata, this.modifiers, this.type, this.name,
this.hasThis, LibraryBuilder compilationUnit, int charOffset)
this.hasThis, LibraryBuilder compilationUnit, this.charOffset)
: super(compilationUnit, charOffset);
bool get isRequired => kind.isRequired;

View file

@ -99,3 +99,34 @@ String operatorToString(Operator operator) {
}
return null;
}
int operatorRequiredArgumentCount(Operator operator) {
switch (operator) {
case Operator.bitwiseNot:
case Operator.unaryMinus:
return 0;
case Operator.add:
case Operator.bitwiseAnd:
case Operator.bitwiseOr:
case Operator.bitwiseXor:
case Operator.divide:
case Operator.equals:
case Operator.greaterThan:
case Operator.greaterThanEquals:
case Operator.indexGet:
case Operator.leftShift:
case Operator.lessThan:
case Operator.lessThanEquals:
case Operator.modulo:
case Operator.multiply:
case Operator.rightShift:
case Operator.subtract:
case Operator.truncatingDivide:
return 1;
case Operator.indexSet:
return 2;
}
return -1;
}

View file

@ -31,7 +31,12 @@ import 'unhandled_listener.dart' show NullValue, Unhandled, UnhandledListener;
import '../parser/dart_vm_native.dart'
show removeNativeClause, skipNativeClause;
import '../operator.dart' show Operator, operatorFromString, operatorToString;
import '../operator.dart'
show
Operator,
operatorFromString,
operatorToString,
operatorRequiredArgumentCount;
import '../quote.dart' show unescapeString;
@ -369,6 +374,22 @@ class OutlineBuilder extends UnhandledListener {
if (nameOrOperator is Operator) {
name = operatorToString(nameOrOperator);
kind = ProcedureKind.Operator;
int requiredArgumentCount = operatorRequiredArgumentCount(nameOrOperator);
if ((formals?.length ?? 0) != requiredArgumentCount) {
library.addCompileTimeError(
charOffset,
"Operator '$name' must have exactly $requiredArgumentCount "
"parameters.");
} else {
if (formals != null) {
for (FormalParameterBuilder formal in formals) {
if (!formal.isRequired) {
library.addCompileTimeError(formal.charOffset,
"An operator can't have optional parameters.");
}
}
}
}
} else {
name = nameOrOperator;
kind = computeProcedureKind(getOrSet);

View file

@ -44,34 +44,6 @@ Language/Classes/Getters/syntax_t03: MissingCompileTimeError
Language/Classes/Getters/syntax_t04: MissingCompileTimeError
Language/Classes/Getters/syntax_t05: MissingCompileTimeError
Language/Classes/Getters/syntax_t07: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_0_or_1_t02: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_0_t02: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t01: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t02: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t03: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t04: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t05: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t06: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t07: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t08: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t09: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t10: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t11: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t12: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t13: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t14: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t15: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t16: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t17: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_1_t18: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_2_t01: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/arity_2_t02: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/optional_parameter_t01: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/optional_parameter_t02: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/optional_parameter_t03: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/optional_parameter_t04: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/optional_parameter_t06: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/optional_parameter_t08: MissingCompileTimeError
Language/Classes/Instance_Methods/Operators/syntax_t04: MissingCompileTimeError
Language/Classes/Instance_Methods/same_name_setter_t01: CompileTimeError
Language/Classes/Instance_Variables/constant_t01: MissingCompileTimeError

View file

@ -3,8 +3,7 @@
# BSD-style license that can be found in the LICENSE file.
[ $compiler == dartk || $compiler == dartkp ]
arg_param_trailing_comma_test/107: MissingCompileTimeError
await_for_test: RuntimeError
await_for_test: RuntimeError # Kernel Issue 29192
bad_constructor_test/05: CompileTimeError
bad_initializer1_negative_test: Crash
bad_raw_string_negative_test: Fail