@@ -7426,45 +7426,10 @@ bool Function::AreValidArguments(NNBDMode mode,
7426
7426
intptr_t num_arguments,
7427
7427
const Array& argument_names,
7428
7428
String* error_message) const {
7429
- const intptr_t num_named_arguments =
7430
- argument_names.IsNull() ? 0 : argument_names.Length();
7431
- if (!AreValidArgumentCounts(num_type_arguments, num_arguments,
7432
- num_named_arguments, error_message)) {
7433
- return false;
7434
- }
7435
- // Verify that all argument names are valid parameter names.
7436
- Zone* zone = Thread::Current()->zone();
7437
- String& argument_name = String::Handle(zone);
7438
- String& parameter_name = String::Handle(zone);
7439
- for (intptr_t i = 0; i < num_named_arguments; i++) {
7440
- argument_name ^= argument_names.At(i);
7441
- ASSERT(argument_name.IsSymbol());
7442
- bool found = false;
7443
- const intptr_t num_positional_args = num_arguments - num_named_arguments;
7444
- const intptr_t num_parameters = NumParameters();
7445
- for (intptr_t j = num_positional_args; !found && (j < num_parameters);
7446
- j++) {
7447
- parameter_name = ParameterNameAt(j);
7448
- ASSERT(argument_name.IsSymbol());
7449
- if (argument_name.Equals(parameter_name)) {
7450
- found = true;
7451
- }
7452
- }
7453
- if (!found) {
7454
- if (error_message != NULL) {
7455
- const intptr_t kMessageBufferSize = 64;
7456
- char message_buffer[kMessageBufferSize];
7457
- Utils::SNPrint(message_buffer, kMessageBufferSize,
7458
- "no optional formal parameter named '%s'",
7459
- argument_name.ToCString());
7460
- // Allocate in old space because it can be invoked in background
7461
- // optimizing compilation.
7462
- *error_message = String::New(message_buffer, Heap::kOld);
7463
- }
7464
- return false;
7465
- }
7466
- }
7467
- return true;
7429
+ const Array& args_desc_array = Array::Handle(ArgumentsDescriptor::New(
7430
+ num_type_arguments, num_arguments, argument_names, Heap::kNew));
7431
+ ArgumentsDescriptor args_desc(args_desc_array);
7432
+ return AreValidArguments(mode, args_desc, error_message);
7468
7433
}
7469
7434
7470
7435
bool Function::AreValidArguments(NNBDMode mode,
@@ -7478,41 +7443,65 @@ bool Function::AreValidArguments(NNBDMode mode,
7478
7443
num_named_arguments, error_message)) {
7479
7444
return false;
7480
7445
}
7481
- if (FLAG_null_safety) {
7482
- // TODO(regis): Check required named arguments.
7483
- }
7484
7446
// Verify that all argument names are valid parameter names.
7485
7447
Zone* zone = Thread::Current()->zone();
7486
7448
String& argument_name = String::Handle(zone);
7487
7449
String& parameter_name = String::Handle(zone);
7450
+ const intptr_t num_positional_args = num_arguments - num_named_arguments;
7451
+ const intptr_t num_parameters = NumParameters();
7488
7452
for (intptr_t i = 0; i < num_named_arguments; i++) {
7489
7453
argument_name = args_desc.NameAt(i);
7490
7454
ASSERT(argument_name.IsSymbol());
7491
7455
bool found = false;
7492
- const intptr_t num_positional_args = num_arguments - num_named_arguments;
7493
- const int num_parameters = NumParameters();
7494
- for (intptr_t j = num_positional_args; !found && (j < num_parameters);
7495
- j++) {
7456
+ for (intptr_t j = num_positional_args; j < num_parameters; j++) {
7496
7457
parameter_name = ParameterNameAt(j);
7497
- ASSERT(argument_name .IsSymbol());
7458
+ ASSERT(parameter_name .IsSymbol());
7498
7459
if (argument_name.Equals(parameter_name)) {
7499
7460
found = true;
7461
+ break;
7500
7462
}
7501
7463
}
7502
7464
if (!found) {
7503
- if (error_message != NULL ) {
7465
+ if (error_message != nullptr ) {
7504
7466
const intptr_t kMessageBufferSize = 64;
7505
7467
char message_buffer[kMessageBufferSize];
7506
7468
Utils::SNPrint(message_buffer, kMessageBufferSize,
7507
7469
"no optional formal parameter named '%s'",
7508
7470
argument_name.ToCString());
7509
- // Allocate in old space because it can be invoked in background
7510
- // optimizing compilation.
7511
- *error_message = String::New(message_buffer, Heap::kOld);
7471
+ *error_message = String::New(message_buffer);
7512
7472
}
7513
7473
return false;
7514
7474
}
7515
7475
}
7476
+ if (FLAG_null_safety) {
7477
+ // Verify that all required named parameters are filled.
7478
+ for (intptr_t j = num_positional_args; j < num_parameters; j++) {
7479
+ if (IsRequiredAt(j)) {
7480
+ parameter_name = ParameterNameAt(j);
7481
+ ASSERT(parameter_name.IsSymbol());
7482
+ bool found = false;
7483
+ for (intptr_t i = 0; i < num_named_arguments; i++) {
7484
+ argument_name = args_desc.NameAt(i);
7485
+ ASSERT(argument_name.IsSymbol());
7486
+ if (argument_name.Equals(parameter_name)) {
7487
+ found = true;
7488
+ break;
7489
+ }
7490
+ }
7491
+ if (!found) {
7492
+ if (error_message != nullptr) {
7493
+ const intptr_t kMessageBufferSize = 64;
7494
+ char message_buffer[kMessageBufferSize];
7495
+ Utils::SNPrint(message_buffer, kMessageBufferSize,
7496
+ "missing required named parameter '%s'",
7497
+ parameter_name.ToCString());
7498
+ *error_message = String::New(message_buffer);
7499
+ }
7500
+ return false;
7501
+ }
7502
+ }
7503
+ }
7504
+ }
7516
7505
return true;
7517
7506
}
7518
7507
0 commit comments