Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Side by Side Diff: runtime/vm/parser.cc

Issue 10695137: Provide better error message when passing wrong number of arguments. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/resolver.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/parser.h" 5 #include "vm/parser.h"
6 6
7 #include "vm/bigint_operations.h" 7 #include "vm/bigint_operations.h"
8 #include "vm/class_finalizer.h" 8 #include "vm/class_finalizer.h"
9 #include "vm/compiler.h" 9 #include "vm/compiler.h"
10 #include "vm/compiler_stats.h" 10 #include "vm/compiler_stats.h"
(...skipping 1460 matching lines...) Expand 10 before | Expand all | Expand 10 after
1471 ResolveDynamicFunction(super_class, field_name)); 1471 ResolveDynamicFunction(super_class, field_name));
1472 if (super_function.IsNull()) { 1472 if (super_function.IsNull()) {
1473 ErrorMsg(field_pos, "field or getter '%s' not found in superclass", 1473 ErrorMsg(field_pos, "field or getter '%s' not found in superclass",
1474 field_name.ToCString()); 1474 field_name.ToCString());
1475 } 1475 }
1476 return CreateImplicitClosureNode(super_function, 1476 return CreateImplicitClosureNode(super_function,
1477 field_pos, 1477 field_pos,
1478 implicit_argument); 1478 implicit_argument);
1479 } 1479 }
1480 // All dynamic getters take one argument and no named arguments. 1480 // All dynamic getters take one argument and no named arguments.
1481 ASSERT(super_getter.AreValidArgumentCounts(1, 0)); 1481 ASSERT(super_getter.AreValidArgumentCounts(1, 0, NULL));
1482 ArgumentListNode* getter_arguments = new ArgumentListNode(field_pos); 1482 ArgumentListNode* getter_arguments = new ArgumentListNode(field_pos);
1483 getter_arguments->Add(implicit_argument); 1483 getter_arguments->Add(implicit_argument);
1484 AstNode* super_field = 1484 AstNode* super_field =
1485 new StaticCallNode(field_pos, super_getter, getter_arguments); 1485 new StaticCallNode(field_pos, super_getter, getter_arguments);
1486 1486
1487 if (Token::IsAssignmentOperator(CurrentToken())) { 1487 if (Token::IsAssignmentOperator(CurrentToken())) {
1488 const String& setter_name = 1488 const String& setter_name =
1489 String::ZoneHandle(Field::SetterName(field_name)); 1489 String::ZoneHandle(Field::SetterName(field_name));
1490 const Function& super_setter = Function::ZoneHandle( 1490 const Function& super_setter = Function::ZoneHandle(
1491 ResolveDynamicFunction(super_class, setter_name)); 1491 ResolveDynamicFunction(super_class, setter_name));
1492 if (super_setter.IsNull()) { 1492 if (super_setter.IsNull()) {
1493 ErrorMsg(field_pos, 1493 ErrorMsg(field_pos,
1494 "field '%s' not assignable in superclass", 1494 "field '%s' not assignable in superclass",
1495 field_name.ToCString()); 1495 field_name.ToCString());
1496 } 1496 }
1497 // All dynamic setters take two arguments and no named arguments. 1497 // All dynamic setters take two arguments and no named arguments.
1498 ASSERT(super_setter.AreValidArgumentCounts(2, 0)); 1498 ASSERT(super_setter.AreValidArgumentCounts(2, 0, NULL));
1499 1499
1500 Token::Kind assignment_op = CurrentToken(); 1500 Token::Kind assignment_op = CurrentToken();
1501 ConsumeToken(); 1501 ConsumeToken();
1502 AstNode* value = ParseExpr(kAllowConst); 1502 AstNode* value = ParseExpr(kAllowConst);
1503 value = ExpandAssignableOp(field_pos, assignment_op, super_field, value); 1503 value = ExpandAssignableOp(field_pos, assignment_op, super_field, value);
1504 1504
1505 ArgumentListNode* setter_arguments = new ArgumentListNode(field_pos); 1505 ArgumentListNode* setter_arguments = new ArgumentListNode(field_pos);
1506 setter_arguments->Add(implicit_argument); 1506 setter_arguments->Add(implicit_argument);
1507 setter_arguments->Add(value); 1507 setter_arguments->Add(value);
1508 super_field = new StaticCallNode(field_pos, super_setter, setter_arguments); 1508 super_field = new StaticCallNode(field_pos, super_setter, setter_arguments);
(...skipping 19 matching lines...) Expand all
1528 // Implicit 'this' parameter is the first argument. 1528 // Implicit 'this' parameter is the first argument.
1529 AstNode* implicit_argument = new LoadLocalNode(supercall_pos, *receiver); 1529 AstNode* implicit_argument = new LoadLocalNode(supercall_pos, *receiver);
1530 arguments->Add(implicit_argument); 1530 arguments->Add(implicit_argument);
1531 // Implicit construction phase parameter is second argument. 1531 // Implicit construction phase parameter is second argument.
1532 AstNode* phase_parameter = 1532 AstNode* phase_parameter =
1533 new LiteralNode(supercall_pos, 1533 new LiteralNode(supercall_pos,
1534 Smi::ZoneHandle(Smi::New(Function::kCtorPhaseAll))); 1534 Smi::ZoneHandle(Smi::New(Function::kCtorPhaseAll)));
1535 arguments->Add(phase_parameter); 1535 arguments->Add(phase_parameter);
1536 const Function& super_ctor = Function::ZoneHandle( 1536 const Function& super_ctor = Function::ZoneHandle(
1537 super_class.LookupConstructor(ctor_name)); 1537 super_class.LookupConstructor(ctor_name));
1538 if (super_ctor.IsNull() || 1538 if (super_ctor.IsNull()) {
1539 !super_ctor.AreValidArguments(arguments->length(), 1539 ErrorMsg(supercall_pos,
1540 arguments->names())) { 1540 "unresolved implicit call to super constructor '%s()'",
1541 String::Handle(super_class.Name()).ToCString());
1542 }
1543 String& error_message = String::Handle();
1544 if (!super_ctor.AreValidArguments(arguments->length(),
1545 arguments->names(),
1546 &error_message)) {
1541 ErrorMsg(supercall_pos, 1547 ErrorMsg(supercall_pos,
1542 "unresolved implicit call to super constructor '%s()'", 1548 "invalid arguments passed to super constructor '%s()': %s",
1543 String::Handle(super_class.Name()).ToCString()); 1549 String::Handle(super_class.Name()).ToCString(),
1550 error_message.ToCString());
1544 } 1551 }
1545 CheckFunctionIsCallable(supercall_pos, super_ctor); 1552 CheckFunctionIsCallable(supercall_pos, super_ctor);
1546 current_block_->statements->Add( 1553 current_block_->statements->Add(
1547 new StaticCallNode(supercall_pos, super_ctor, arguments)); 1554 new StaticCallNode(supercall_pos, super_ctor, arguments));
1548 } 1555 }
1549 1556
1550 1557
1551 AstNode* Parser::ParseSuperInitializer(const Class& cls, 1558 AstNode* Parser::ParseSuperInitializer(const Class& cls,
1552 LocalVariable* receiver) { 1559 LocalVariable* receiver) {
1553 TRACE_PARSER("ParseSuperInitializer"); 1560 TRACE_PARSER("ParseSuperInitializer");
(...skipping 27 matching lines...) Expand all
1581 Smi::ZoneHandle(Smi::New(Function::kCtorPhaseAll))); 1588 Smi::ZoneHandle(Smi::New(Function::kCtorPhaseAll)));
1582 arguments->Add(phase_parameter); 1589 arguments->Add(phase_parameter);
1583 // 'this' parameter must not be accessible to the other super call arguments. 1590 // 'this' parameter must not be accessible to the other super call arguments.
1584 receiver->set_invisible(true); 1591 receiver->set_invisible(true);
1585 ParseActualParameters(arguments, kAllowConst); 1592 ParseActualParameters(arguments, kAllowConst);
1586 receiver->set_invisible(false); 1593 receiver->set_invisible(false);
1587 1594
1588 // Resolve the constructor. 1595 // Resolve the constructor.
1589 const Function& super_ctor = Function::ZoneHandle( 1596 const Function& super_ctor = Function::ZoneHandle(
1590 super_class.LookupConstructor(ctor_name)); 1597 super_class.LookupConstructor(ctor_name));
1591 if (super_ctor.IsNull() || 1598 if (super_ctor.IsNull()) {
1592 !super_ctor.AreValidArguments(arguments->length(),
1593 arguments->names())) {
1594 ErrorMsg(supercall_pos, 1599 ErrorMsg(supercall_pos,
1595 "super class constructor '%s' not found", 1600 "super class constructor '%s' not found",
1596 ctor_name.ToCString()); 1601 ctor_name.ToCString());
1597 } 1602 }
1603 String& error_message = String::Handle();
1604 if (!super_ctor.AreValidArguments(arguments->length(),
1605 arguments->names(),
1606 &error_message)) {
1607 ErrorMsg(supercall_pos,
1608 "invalid arguments passed to super class constructor '%s': %s",
1609 ctor_name.ToCString(),
1610 error_message.ToCString());
1611 }
1598 CheckFunctionIsCallable(supercall_pos, super_ctor); 1612 CheckFunctionIsCallable(supercall_pos, super_ctor);
1599 return new StaticCallNode(supercall_pos, super_ctor, arguments); 1613 return new StaticCallNode(supercall_pos, super_ctor, arguments);
1600 } 1614 }
1601 1615
1602 1616
1603 AstNode* Parser::ParseInitializer(const Class& cls, LocalVariable* receiver) { 1617 AstNode* Parser::ParseInitializer(const Class& cls, LocalVariable* receiver) {
1604 TRACE_PARSER("ParseInitializer"); 1618 TRACE_PARSER("ParseInitializer");
1605 const intptr_t field_pos = TokenPos(); 1619 const intptr_t field_pos = TokenPos();
1606 if (CurrentToken() == Token::kTHIS) { 1620 if (CurrentToken() == Token::kTHIS) {
1607 ConsumeToken(); 1621 ConsumeToken();
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
1755 // Construction phase parameter is second argument. 1769 // Construction phase parameter is second argument.
1756 LocalVariable* phase_param = LookupPhaseParameter(); 1770 LocalVariable* phase_param = LookupPhaseParameter();
1757 ASSERT(phase_param != NULL); 1771 ASSERT(phase_param != NULL);
1758 AstNode* phase_argument = new LoadLocalNode(call_pos, *phase_param); 1772 AstNode* phase_argument = new LoadLocalNode(call_pos, *phase_param);
1759 arguments->Add(phase_argument); 1773 arguments->Add(phase_argument);
1760 ParseActualParameters(arguments, kAllowConst); 1774 ParseActualParameters(arguments, kAllowConst);
1761 1775
1762 // Resolve the constructor. 1776 // Resolve the constructor.
1763 const Function& redirect_ctor = Function::ZoneHandle( 1777 const Function& redirect_ctor = Function::ZoneHandle(
1764 cls.LookupConstructor(ctor_name)); 1778 cls.LookupConstructor(ctor_name));
1765 if (redirect_ctor.IsNull() || 1779 if (redirect_ctor.IsNull()) {
1766 !redirect_ctor.AreValidArguments(arguments->length(), 1780 ErrorMsg(call_pos, "constructor '%s' not found", ctor_name.ToCString());
1767 arguments->names())) { 1781 }
1768 ErrorMsg(call_pos, "constructor '%s' not found", 1782 String& error_message = String::Handle();
1769 ctor_name.ToCString()); 1783 if (!redirect_ctor.AreValidArguments(arguments->length(),
1784 arguments->names(),
1785 &error_message)) {
1786 ErrorMsg(call_pos,
1787 "invalid arguments passed to constructor '%s': %s",
1788 ctor_name.ToCString(),
1789 error_message.ToCString());
1770 } 1790 }
1771 CheckFunctionIsCallable(call_pos, redirect_ctor); 1791 CheckFunctionIsCallable(call_pos, redirect_ctor);
1772 current_block_->statements->Add( 1792 current_block_->statements->Add(
1773 new StaticCallNode(call_pos, redirect_ctor, arguments)); 1793 new StaticCallNode(call_pos, redirect_ctor, arguments));
1774 } 1794 }
1775 1795
1776 1796
1777 SequenceNode* Parser::MakeImplicitConstructor(const Function& func) { 1797 SequenceNode* Parser::MakeImplicitConstructor(const Function& func) {
1778 ASSERT(func.IsConstructor()); 1798 ASSERT(func.IsConstructor());
1779 const intptr_t ctor_pos = TokenPos(); 1799 const intptr_t ctor_pos = TokenPos();
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
2020 if (arg->IsLoadLocalNode()) { 2040 if (arg->IsLoadLocalNode()) {
2021 const LocalVariable& temp = arg->AsLoadLocalNode()->local(); 2041 const LocalVariable& temp = arg->AsLoadLocalNode()->local();
2022 super_call_args->Add(new LoadLocalNode(TokenPos(), temp)); 2042 super_call_args->Add(new LoadLocalNode(TokenPos(), temp));
2023 } else if (arg->IsStoreLocalNode()) { 2043 } else if (arg->IsStoreLocalNode()) {
2024 const LocalVariable& temp = arg->AsStoreLocalNode()->local(); 2044 const LocalVariable& temp = arg->AsStoreLocalNode()->local();
2025 super_call_args->Add(new LoadLocalNode(TokenPos(), temp)); 2045 super_call_args->Add(new LoadLocalNode(TokenPos(), temp));
2026 } 2046 }
2027 } 2047 }
2028 } 2048 }
2029 ASSERT(super_ctor.AreValidArguments(super_call_args->length(), 2049 ASSERT(super_ctor.AreValidArguments(super_call_args->length(),
2030 super_call_args->names())); 2050 super_call_args->names(),
2051 NULL));
2031 current_block_->statements->Add( 2052 current_block_->statements->Add(
2032 new StaticCallNode(TokenPos(), super_ctor, super_call_args)); 2053 new StaticCallNode(TokenPos(), super_ctor, super_call_args));
2033 } 2054 }
2034 2055
2035 if (CurrentToken() == Token::kLBRACE) { 2056 if (CurrentToken() == Token::kLBRACE) {
2036 ConsumeToken(); 2057 ConsumeToken();
2037 ParseStatementSequence(); 2058 ParseStatementSequence();
2038 ExpectToken(Token::kRBRACE); 2059 ExpectToken(Token::kRBRACE);
2039 } else if (CurrentToken() == Token::kARROW) { 2060 } else if (CurrentToken() == Token::kARROW) {
2040 ErrorMsg("constructors may not return a value"); 2061 ErrorMsg("constructors may not return a value");
(...skipping 5863 matching lines...) Expand 10 before | Expand all | Expand 10 after
7904 const String& external_constructor_name = 7925 const String& external_constructor_name =
7905 (named_constructor ? constructor_name : type_class_name); 7926 (named_constructor ? constructor_name : type_class_name);
7906 Function& constructor = Function::ZoneHandle( 7927 Function& constructor = Function::ZoneHandle(
7907 type_class.LookupConstructor(constructor_name)); 7928 type_class.LookupConstructor(constructor_name));
7908 if (constructor.IsNull()) { 7929 if (constructor.IsNull()) {
7909 ErrorMsg(type_pos, 7930 ErrorMsg(type_pos,
7910 "interface '%s' has no constructor named '%s'", 7931 "interface '%s' has no constructor named '%s'",
7911 type_class_name.ToCString(), 7932 type_class_name.ToCString(),
7912 external_constructor_name.ToCString()); 7933 external_constructor_name.ToCString());
7913 } 7934 }
7914 if (!constructor.AreValidArguments(arguments_length, arguments->names())) { 7935 String& error_message = String::Handle();
7936 if (!constructor.AreValidArguments(arguments_length,
7937 arguments->names(),
7938 &error_message)) {
7915 ErrorMsg(call_pos, 7939 ErrorMsg(call_pos,
7916 "invalid arguments passed to constructor '%s' " 7940 "invalid arguments passed to constructor '%s' "
7917 "for interface '%s'", 7941 "for interface '%s': %s",
7918 external_constructor_name.ToCString(), 7942 external_constructor_name.ToCString(),
7919 type_class_name.ToCString()); 7943 type_class_name.ToCString(),
7944 error_message.ToCString());
7920 } 7945 }
7921 if (!type_class.HasFactoryClass()) { 7946 if (!type_class.HasFactoryClass()) {
7922 ErrorMsg(type_pos, 7947 ErrorMsg(type_pos,
7923 "cannot allocate interface '%s' without factory class", 7948 "cannot allocate interface '%s' without factory class",
7924 type_class_name.ToCString()); 7949 type_class_name.ToCString());
7925 } 7950 }
7926 if (!type_class.HasResolvedFactoryClass()) { 7951 if (!type_class.HasResolvedFactoryClass()) {
7927 // This error can occur only with bootstrap classes. 7952 // This error can occur only with bootstrap classes.
7928 const UnresolvedClass& unresolved = 7953 const UnresolvedClass& unresolved =
7929 UnresolvedClass::Handle(type_class.UnresolvedFactoryClass()); 7954 UnresolvedClass::Handle(type_class.UnresolvedFactoryClass());
(...skipping 29 matching lines...) Expand all
7959 arguments_length -= 1; 7984 arguments_length -= 1;
7960 } 7985 }
7961 if (constructor.IsNull()) { 7986 if (constructor.IsNull()) {
7962 const String& external_constructor_name = 7987 const String& external_constructor_name =
7963 (named_constructor ? constructor_name : constructor_class_name); 7988 (named_constructor ? constructor_name : constructor_class_name);
7964 ErrorMsg(type_pos, 7989 ErrorMsg(type_pos,
7965 "class '%s' has no constructor or factory named '%s'", 7990 "class '%s' has no constructor or factory named '%s'",
7966 String::Handle(constructor_class.Name()).ToCString(), 7991 String::Handle(constructor_class.Name()).ToCString(),
7967 external_constructor_name.ToCString()); 7992 external_constructor_name.ToCString());
7968 } 7993 }
7969 if (!constructor.AreValidArguments(arguments_length, arguments->names())) { 7994 String& error_message = String::Handle();
7995 if (!constructor.AreValidArguments(arguments_length,
7996 arguments->names(),
7997 &error_message)) {
7970 const String& external_constructor_name = 7998 const String& external_constructor_name =
7971 (named_constructor ? constructor_name : constructor_class_name); 7999 (named_constructor ? constructor_name : constructor_class_name);
7972 ErrorMsg(call_pos, 8000 ErrorMsg(call_pos,
7973 "invalid arguments passed to constructor '%s' for class '%s'", 8001 "invalid arguments passed to constructor '%s' for class '%s': %s",
7974 external_constructor_name.ToCString(), 8002 external_constructor_name.ToCString(),
7975 String::Handle(constructor_class.Name()).ToCString()); 8003 String::Handle(constructor_class.Name()).ToCString(),
8004 error_message.ToCString());
7976 } 8005 }
7977 8006
7978 // Now that the constructor to be called is identified, finalize the type 8007 // Now that the constructor to be called is identified, finalize the type
7979 // argument vector to be passed. 8008 // argument vector to be passed.
7980 // The type argument vector of the parsed type was finalized in ParseType. 8009 // The type argument vector of the parsed type was finalized in ParseType.
7981 // If the constructor class was changed from the interface class to the 8010 // If the constructor class was changed from the interface class to the
7982 // factory class, we need to finalize the type argument vector again, because 8011 // factory class, we need to finalize the type argument vector again, because
7983 // it may be longer due to the factory class extending a class, or/and because 8012 // it may be longer due to the factory class extending a class, or/and because
7984 // the bounds on the factory class may be tighter than on the interface. 8013 // the bounds on the factory class may be tighter than on the interface.
7985 if (constructor_class.raw() != type_class.raw()) { 8014 if (constructor_class.raw() != type_class.raw()) {
(...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after
8624 void Parser::SkipQualIdent() { 8653 void Parser::SkipQualIdent() {
8625 ASSERT(IsIdentifier()); 8654 ASSERT(IsIdentifier());
8626 ConsumeToken(); 8655 ConsumeToken();
8627 if (CurrentToken() == Token::kPERIOD) { 8656 if (CurrentToken() == Token::kPERIOD) {
8628 ConsumeToken(); // Consume the kPERIOD token. 8657 ConsumeToken(); // Consume the kPERIOD token.
8629 ExpectIdentifier("identifier expected after '.'"); 8658 ExpectIdentifier("identifier expected after '.'");
8630 } 8659 }
8631 } 8660 }
8632 8661
8633 } // namespace dart 8662 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/resolver.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698