Index: runtime/vm/parser.cc |
=================================================================== |
--- runtime/vm/parser.cc (revision 9601) |
+++ runtime/vm/parser.cc (working copy) |
@@ -1478,7 +1478,7 @@ |
implicit_argument); |
} |
// All dynamic getters take one argument and no named arguments. |
- ASSERT(super_getter.AreValidArgumentCounts(1, 0)); |
+ ASSERT(super_getter.AreValidArgumentCounts(1, 0, NULL)); |
ArgumentListNode* getter_arguments = new ArgumentListNode(field_pos); |
getter_arguments->Add(implicit_argument); |
AstNode* super_field = |
@@ -1495,7 +1495,7 @@ |
field_name.ToCString()); |
} |
// All dynamic setters take two arguments and no named arguments. |
- ASSERT(super_setter.AreValidArgumentCounts(2, 0)); |
+ ASSERT(super_setter.AreValidArgumentCounts(2, 0, NULL)); |
Token::Kind assignment_op = CurrentToken(); |
ConsumeToken(); |
@@ -1535,12 +1535,19 @@ |
arguments->Add(phase_parameter); |
const Function& super_ctor = Function::ZoneHandle( |
super_class.LookupConstructor(ctor_name)); |
- if (super_ctor.IsNull() || |
- !super_ctor.AreValidArguments(arguments->length(), |
- arguments->names())) { |
+ if (super_ctor.IsNull()) { |
+ ErrorMsg(supercall_pos, |
+ "unresolved implicit call to super constructor '%s()'", |
+ String::Handle(super_class.Name()).ToCString()); |
+ } |
+ String& error_message = String::Handle(); |
+ if (!super_ctor.AreValidArguments(arguments->length(), |
+ arguments->names(), |
+ &error_message)) { |
ErrorMsg(supercall_pos, |
- "unresolved implicit call to super constructor '%s()'", |
- String::Handle(super_class.Name()).ToCString()); |
+ "invalid arguments passed to super constructor '%s()': %s", |
+ String::Handle(super_class.Name()).ToCString(), |
+ error_message.ToCString()); |
} |
CheckFunctionIsCallable(supercall_pos, super_ctor); |
current_block_->statements->Add( |
@@ -1588,13 +1595,20 @@ |
// Resolve the constructor. |
const Function& super_ctor = Function::ZoneHandle( |
super_class.LookupConstructor(ctor_name)); |
- if (super_ctor.IsNull() || |
- !super_ctor.AreValidArguments(arguments->length(), |
- arguments->names())) { |
+ if (super_ctor.IsNull()) { |
ErrorMsg(supercall_pos, |
"super class constructor '%s' not found", |
ctor_name.ToCString()); |
} |
+ String& error_message = String::Handle(); |
+ if (!super_ctor.AreValidArguments(arguments->length(), |
+ arguments->names(), |
+ &error_message)) { |
+ ErrorMsg(supercall_pos, |
+ "invalid arguments passed to super class constructor '%s': %s", |
+ ctor_name.ToCString(), |
+ error_message.ToCString()); |
+ } |
CheckFunctionIsCallable(supercall_pos, super_ctor); |
return new StaticCallNode(supercall_pos, super_ctor, arguments); |
} |
@@ -1762,12 +1776,18 @@ |
// Resolve the constructor. |
const Function& redirect_ctor = Function::ZoneHandle( |
cls.LookupConstructor(ctor_name)); |
- if (redirect_ctor.IsNull() || |
- !redirect_ctor.AreValidArguments(arguments->length(), |
- arguments->names())) { |
- ErrorMsg(call_pos, "constructor '%s' not found", |
- ctor_name.ToCString()); |
+ if (redirect_ctor.IsNull()) { |
+ ErrorMsg(call_pos, "constructor '%s' not found", ctor_name.ToCString()); |
} |
+ String& error_message = String::Handle(); |
+ if (!redirect_ctor.AreValidArguments(arguments->length(), |
+ arguments->names(), |
+ &error_message)) { |
+ ErrorMsg(call_pos, |
+ "invalid arguments passed to constructor '%s': %s", |
+ ctor_name.ToCString(), |
+ error_message.ToCString()); |
+ } |
CheckFunctionIsCallable(call_pos, redirect_ctor); |
current_block_->statements->Add( |
new StaticCallNode(call_pos, redirect_ctor, arguments)); |
@@ -2027,7 +2047,8 @@ |
} |
} |
ASSERT(super_ctor.AreValidArguments(super_call_args->length(), |
- super_call_args->names())); |
+ super_call_args->names(), |
+ NULL)); |
current_block_->statements->Add( |
new StaticCallNode(TokenPos(), super_ctor, super_call_args)); |
} |
@@ -7911,12 +7932,16 @@ |
type_class_name.ToCString(), |
external_constructor_name.ToCString()); |
} |
- if (!constructor.AreValidArguments(arguments_length, arguments->names())) { |
+ String& error_message = String::Handle(); |
+ if (!constructor.AreValidArguments(arguments_length, |
+ arguments->names(), |
+ &error_message)) { |
ErrorMsg(call_pos, |
"invalid arguments passed to constructor '%s' " |
- "for interface '%s'", |
+ "for interface '%s': %s", |
external_constructor_name.ToCString(), |
- type_class_name.ToCString()); |
+ type_class_name.ToCString(), |
+ error_message.ToCString()); |
} |
if (!type_class.HasFactoryClass()) { |
ErrorMsg(type_pos, |
@@ -7966,13 +7991,17 @@ |
String::Handle(constructor_class.Name()).ToCString(), |
external_constructor_name.ToCString()); |
} |
- if (!constructor.AreValidArguments(arguments_length, arguments->names())) { |
+ String& error_message = String::Handle(); |
+ if (!constructor.AreValidArguments(arguments_length, |
+ arguments->names(), |
+ &error_message)) { |
const String& external_constructor_name = |
(named_constructor ? constructor_name : constructor_class_name); |
ErrorMsg(call_pos, |
- "invalid arguments passed to constructor '%s' for class '%s'", |
+ "invalid arguments passed to constructor '%s' for class '%s': %s", |
external_constructor_name.ToCString(), |
- String::Handle(constructor_class.Name()).ToCString()); |
+ String::Handle(constructor_class.Name()).ToCString(), |
+ error_message.ToCString()); |
} |
// Now that the constructor to be called is identified, finalize the type |