OLD | NEW |
---|---|
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 "lib/invocation_mirror.h" | 7 #include "lib/invocation_mirror.h" |
8 #include "vm/bigint_operations.h" | 8 #include "vm/bigint_operations.h" |
9 #include "vm/bootstrap.h" | 9 #include "vm/bootstrap.h" |
10 #include "vm/class_finalizer.h" | 10 #include "vm/class_finalizer.h" |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
425 String* ident; | 425 String* ident; |
426 }; | 426 }; |
427 | 427 |
428 | 428 |
429 struct ParamDesc { | 429 struct ParamDesc { |
430 ParamDesc() | 430 ParamDesc() |
431 : type(NULL), | 431 : type(NULL), |
432 name_pos(0), | 432 name_pos(0), |
433 name(NULL), | 433 name(NULL), |
434 default_value(NULL), | 434 default_value(NULL), |
435 metadata(NULL), | |
435 is_final(false), | 436 is_final(false), |
436 is_field_initializer(false) { } | 437 is_field_initializer(false) { } |
437 const AbstractType* type; | 438 const AbstractType* type; |
438 intptr_t name_pos; | 439 intptr_t name_pos; |
439 const String* name; | 440 const String* name; |
440 const Object* default_value; // NULL if not an optional parameter. | 441 const Object* default_value; // NULL if not an optional parameter. |
442 const Object* metadata; // NULL if no metadata or metadata not evaluated. | |
441 bool is_final; | 443 bool is_final; |
442 bool is_field_initializer; | 444 bool is_field_initializer; |
443 }; | 445 }; |
444 | 446 |
445 | 447 |
446 struct ParamList { | 448 struct ParamList { |
447 ParamList() { | 449 ParamList() { |
448 Clear(); | 450 Clear(); |
449 } | 451 } |
450 | 452 |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
784 isolate->set_long_jump_base(&jump); | 786 isolate->set_long_jump_base(&jump); |
785 if (setjmp(*jump.Set()) == 0) { | 787 if (setjmp(*jump.Set()) == 0) { |
786 const Script& script = Script::Handle(isolate, func.script()); | 788 const Script& script = Script::Handle(isolate, func.script()); |
787 const Class& owner = Class::Handle(isolate, func.Owner()); | 789 const Class& owner = Class::Handle(isolate, func.Owner()); |
788 ASSERT(!owner.IsNull()); | 790 ASSERT(!owner.IsNull()); |
789 const Library& lib = Library::Handle(isolate, owner.library()); | 791 const Library& lib = Library::Handle(isolate, owner.library()); |
790 Parser parser(script, lib, func.token_pos()); | 792 Parser parser(script, lib, func.token_pos()); |
791 parser.set_current_class(owner); | 793 parser.set_current_class(owner); |
792 parser.SkipFunctionPreamble(); | 794 parser.SkipFunctionPreamble(); |
793 ParamList params; | 795 ParamList params; |
794 parser.ParseFormalParameterList(true, ¶ms); | 796 parser.ParseFormalParameterList(true, true, ¶ms); |
795 ParamDesc* param = params.parameters->data(); | 797 ParamDesc* param = params.parameters->data(); |
796 const int param_cnt = params.num_fixed_parameters + | 798 const int param_cnt = params.num_fixed_parameters + |
797 params.num_optional_parameters; | 799 params.num_optional_parameters; |
798 Array& param_descriptor = Array::Handle(isolate, Array::New(param_cnt * 2)); | 800 Array& param_descriptor = Array::Handle(Array::New(param_cnt * 3)); |
799 for (int i = 0, j = 0; i < param_cnt; i++, j += 2) { | 801 for (int i = 0, j = 0; i < param_cnt; i++, j += 3) { |
800 param_descriptor.SetAt(j, param[i].is_final ? Bool::True() : | 802 param_descriptor.SetAt(j, param[i].is_final ? Bool::True() : |
siva
2013/08/28 23:26:48
Ditto comment about '3' here.
| |
801 Bool::False()); | 803 Bool::False()); |
802 param_descriptor.SetAt(j + 1, | 804 param_descriptor.SetAt(j + 1, |
803 (param[i].default_value == NULL) ? Object::null_instance() : | 805 (param[i].default_value == NULL) ? Object::null_instance() : |
804 *(param[i].default_value)); | 806 *(param[i].default_value)); |
807 const Object* metadata = param[i].metadata; | |
808 if ((metadata != NULL) && (*metadata).IsError()) { | |
809 return (*metadata).raw(); // Error evaluating the metadata. | |
810 } | |
811 param_descriptor.SetAt(j + 2, | |
812 (param[i].metadata == NULL) ? Object::null_instance() : | |
813 *(param[i].metadata)); | |
805 } | 814 } |
806 isolate->set_long_jump_base(base); | 815 isolate->set_long_jump_base(base); |
807 return param_descriptor.raw(); | 816 return param_descriptor.raw(); |
808 } else { | 817 } else { |
809 Error& error = Error::Handle(); | 818 Error& error = Error::Handle(); |
810 error = isolate->object_store()->sticky_error(); | 819 error = isolate->object_store()->sticky_error(); |
811 isolate->object_store()->clear_sticky_error(); | 820 isolate->object_store()->clear_sticky_error(); |
812 isolate->set_long_jump_base(base); | 821 isolate->set_long_jump_base(base); |
813 return error.raw(); | 822 return error.raw(); |
814 } | 823 } |
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1374 } while (!token_stack.is_empty() && is_match && !unexpected_token_found); | 1383 } while (!token_stack.is_empty() && is_match && !unexpected_token_found); |
1375 if (!is_match) { | 1384 if (!is_match) { |
1376 ErrorMsg(token_pos, "unbalanced '%s'", Token::Str(token)); | 1385 ErrorMsg(token_pos, "unbalanced '%s'", Token::Str(token)); |
1377 } else if (unexpected_token_found) { | 1386 } else if (unexpected_token_found) { |
1378 ErrorMsg(block_start_pos, "unterminated block"); | 1387 ErrorMsg(block_start_pos, "unterminated block"); |
1379 } | 1388 } |
1380 } | 1389 } |
1381 | 1390 |
1382 | 1391 |
1383 void Parser::ParseFormalParameter(bool allow_explicit_default_value, | 1392 void Parser::ParseFormalParameter(bool allow_explicit_default_value, |
1393 bool evaluate_metadata, | |
1384 ParamList* params) { | 1394 ParamList* params) { |
1385 TRACE_PARSER("ParseFormalParameter"); | 1395 TRACE_PARSER("ParseFormalParameter"); |
1386 ParamDesc parameter; | 1396 ParamDesc parameter; |
1387 bool var_seen = false; | 1397 bool var_seen = false; |
1388 bool this_seen = false; | 1398 bool this_seen = false; |
1389 | 1399 |
1390 SkipMetadata(); | 1400 if (evaluate_metadata && (CurrentToken() == Token::kAT)) { |
1401 parameter.metadata = &Array::ZoneHandle(EvaluateMetadata()); | |
1402 } else { | |
1403 SkipMetadata(); | |
1404 } | |
1405 | |
1391 if (CurrentToken() == Token::kFINAL) { | 1406 if (CurrentToken() == Token::kFINAL) { |
1392 ConsumeToken(); | 1407 ConsumeToken(); |
1393 parameter.is_final = true; | 1408 parameter.is_final = true; |
1394 } else if (CurrentToken() == Token::kVAR) { | 1409 } else if (CurrentToken() == Token::kVAR) { |
1395 ConsumeToken(); | 1410 ConsumeToken(); |
1396 var_seen = true; | 1411 var_seen = true; |
1397 // The parameter type is the 'dynamic' type. | 1412 // The parameter type is the 'dynamic' type. |
1398 parameter.type = &Type::ZoneHandle(Type::DynamicType()); | 1413 parameter.type = &Type::ZoneHandle(Type::DynamicType()); |
1399 } | 1414 } |
1400 if (CurrentToken() == Token::kTHIS) { | 1415 if (CurrentToken() == Token::kTHIS) { |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1480 // Finish parsing the function type parameter. | 1495 // Finish parsing the function type parameter. |
1481 ParamList func_params; | 1496 ParamList func_params; |
1482 | 1497 |
1483 // Add implicit closure object parameter. | 1498 // Add implicit closure object parameter. |
1484 func_params.AddFinalParameter( | 1499 func_params.AddFinalParameter( |
1485 TokenPos(), | 1500 TokenPos(), |
1486 &Symbols::ClosureParameter(), | 1501 &Symbols::ClosureParameter(), |
1487 &Type::ZoneHandle(Type::DynamicType())); | 1502 &Type::ZoneHandle(Type::DynamicType())); |
1488 | 1503 |
1489 const bool no_explicit_default_values = false; | 1504 const bool no_explicit_default_values = false; |
1490 ParseFormalParameterList(no_explicit_default_values, &func_params); | 1505 ParseFormalParameterList(no_explicit_default_values, false, &func_params); |
1491 | 1506 |
1492 // The field 'is_static' has no meaning for signature functions. | 1507 // The field 'is_static' has no meaning for signature functions. |
1493 const Function& signature_function = Function::Handle( | 1508 const Function& signature_function = Function::Handle( |
1494 Function::New(*parameter.name, | 1509 Function::New(*parameter.name, |
1495 RawFunction::kSignatureFunction, | 1510 RawFunction::kSignatureFunction, |
1496 /* is_static = */ false, | 1511 /* is_static = */ false, |
1497 /* is_const = */ false, | 1512 /* is_const = */ false, |
1498 /* is_abstract = */ false, | 1513 /* is_abstract = */ false, |
1499 /* is_external = */ false, | 1514 /* is_external = */ false, |
1500 current_class(), | 1515 current_class(), |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1564 } | 1579 } |
1565 if (parameter.type->IsVoidType()) { | 1580 if (parameter.type->IsVoidType()) { |
1566 ErrorMsg("parameter '%s' may not be 'void'", parameter.name->ToCString()); | 1581 ErrorMsg("parameter '%s' may not be 'void'", parameter.name->ToCString()); |
1567 } | 1582 } |
1568 params->parameters->Add(parameter); | 1583 params->parameters->Add(parameter); |
1569 } | 1584 } |
1570 | 1585 |
1571 | 1586 |
1572 // Parses a sequence of normal or optional formal parameters. | 1587 // Parses a sequence of normal or optional formal parameters. |
1573 void Parser::ParseFormalParameters(bool allow_explicit_default_values, | 1588 void Parser::ParseFormalParameters(bool allow_explicit_default_values, |
1589 bool evaluate_metadata, | |
1574 ParamList* params) { | 1590 ParamList* params) { |
1575 TRACE_PARSER("ParseFormalParameters"); | 1591 TRACE_PARSER("ParseFormalParameters"); |
1576 do { | 1592 do { |
1577 ConsumeToken(); | 1593 ConsumeToken(); |
1578 if (!params->has_optional_positional_parameters && | 1594 if (!params->has_optional_positional_parameters && |
1579 !params->has_optional_named_parameters && | 1595 !params->has_optional_named_parameters && |
1580 (CurrentToken() == Token::kLBRACK)) { | 1596 (CurrentToken() == Token::kLBRACK)) { |
1581 // End of normal parameters, start of optional positional parameters. | 1597 // End of normal parameters, start of optional positional parameters. |
1582 params->has_optional_positional_parameters = true; | 1598 params->has_optional_positional_parameters = true; |
1583 return; | 1599 return; |
1584 } | 1600 } |
1585 if (!params->has_optional_positional_parameters && | 1601 if (!params->has_optional_positional_parameters && |
1586 !params->has_optional_named_parameters && | 1602 !params->has_optional_named_parameters && |
1587 (CurrentToken() == Token::kLBRACE)) { | 1603 (CurrentToken() == Token::kLBRACE)) { |
1588 // End of normal parameters, start of optional named parameters. | 1604 // End of normal parameters, start of optional named parameters. |
1589 params->has_optional_named_parameters = true; | 1605 params->has_optional_named_parameters = true; |
1590 return; | 1606 return; |
1591 } | 1607 } |
1592 ParseFormalParameter(allow_explicit_default_values, params); | 1608 ParseFormalParameter(allow_explicit_default_values, |
1609 evaluate_metadata, | |
1610 params); | |
1593 } while (CurrentToken() == Token::kCOMMA); | 1611 } while (CurrentToken() == Token::kCOMMA); |
1594 } | 1612 } |
1595 | 1613 |
1596 | 1614 |
1597 void Parser::ParseFormalParameterList(bool allow_explicit_default_values, | 1615 void Parser::ParseFormalParameterList(bool allow_explicit_default_values, |
1616 bool evaluate_metadata, | |
1598 ParamList* params) { | 1617 ParamList* params) { |
1599 TRACE_PARSER("ParseFormalParameterList"); | 1618 TRACE_PARSER("ParseFormalParameterList"); |
1600 ASSERT(CurrentToken() == Token::kLPAREN); | 1619 ASSERT(CurrentToken() == Token::kLPAREN); |
1601 | 1620 |
1602 if (LookaheadToken(1) != Token::kRPAREN) { | 1621 if (LookaheadToken(1) != Token::kRPAREN) { |
1603 // Parse fixed parameters. | 1622 // Parse fixed parameters. |
1604 ParseFormalParameters(allow_explicit_default_values, params); | 1623 ParseFormalParameters(allow_explicit_default_values, |
1624 evaluate_metadata, | |
1625 params); | |
1605 if (params->has_optional_positional_parameters || | 1626 if (params->has_optional_positional_parameters || |
1606 params->has_optional_named_parameters) { | 1627 params->has_optional_named_parameters) { |
1607 // Parse optional parameters. | 1628 // Parse optional parameters. |
1608 ParseFormalParameters(allow_explicit_default_values, params); | 1629 ParseFormalParameters(allow_explicit_default_values, |
1630 evaluate_metadata, | |
1631 params); | |
1609 if (params->has_optional_positional_parameters) { | 1632 if (params->has_optional_positional_parameters) { |
1610 if (CurrentToken() != Token::kRBRACK) { | 1633 if (CurrentToken() != Token::kRBRACK) { |
1611 ErrorMsg("',' or ']' expected"); | 1634 ErrorMsg("',' or ']' expected"); |
1612 } | 1635 } |
1613 } else { | 1636 } else { |
1614 if (CurrentToken() != Token::kRBRACE) { | 1637 if (CurrentToken() != Token::kRBRACE) { |
1615 ErrorMsg("',' or '}' expected"); | 1638 ErrorMsg("',' or '}' expected"); |
1616 } | 1639 } |
1617 } | 1640 } |
1618 ConsumeToken(); // ']' or '}'. | 1641 ConsumeToken(); // ']' or '}'. |
(...skipping 870 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2489 | 2512 |
2490 // Add implicit parameter for construction phase. | 2513 // Add implicit parameter for construction phase. |
2491 params.AddFinalParameter( | 2514 params.AddFinalParameter( |
2492 TokenPos(), | 2515 TokenPos(), |
2493 &Symbols::PhaseParameter(), | 2516 &Symbols::PhaseParameter(), |
2494 &Type::ZoneHandle(Type::SmiType())); | 2517 &Type::ZoneHandle(Type::SmiType())); |
2495 | 2518 |
2496 if (func.is_const()) { | 2519 if (func.is_const()) { |
2497 params.SetImplicitlyFinal(); | 2520 params.SetImplicitlyFinal(); |
2498 } | 2521 } |
2499 ParseFormalParameterList(allow_explicit_default_values, ¶ms); | 2522 ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); |
2500 | 2523 |
2501 SetupDefaultsForOptionalParams(¶ms, default_parameter_values); | 2524 SetupDefaultsForOptionalParams(¶ms, default_parameter_values); |
2502 ASSERT(AbstractType::Handle(func.result_type()).IsResolved()); | 2525 ASSERT(AbstractType::Handle(func.result_type()).IsResolved()); |
2503 ASSERT(func.NumParameters() == params.parameters->length()); | 2526 ASSERT(func.NumParameters() == params.parameters->length()); |
2504 | 2527 |
2505 // Now populate function scope with the formal parameters. | 2528 // Now populate function scope with the formal parameters. |
2506 AddFormalParamsToScope(¶ms, current_block_->scope); | 2529 AddFormalParamsToScope(¶ms, current_block_->scope); |
2507 | 2530 |
2508 // Initialize instance fields that have an explicit initializer expression. | 2531 // Initialize instance fields that have an explicit initializer expression. |
2509 // The formal parameter names must not be visible to the instance | 2532 // The formal parameter names must not be visible to the instance |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2741 // The first parameter of a factory is the AbstractTypeArguments vector of | 2764 // The first parameter of a factory is the AbstractTypeArguments vector of |
2742 // the type of the instance to be allocated. | 2765 // the type of the instance to be allocated. |
2743 params.AddFinalParameter( | 2766 params.AddFinalParameter( |
2744 TokenPos(), | 2767 TokenPos(), |
2745 &Symbols::TypeArgumentsParameter(), | 2768 &Symbols::TypeArgumentsParameter(), |
2746 &Type::ZoneHandle(Type::DynamicType())); | 2769 &Type::ZoneHandle(Type::DynamicType())); |
2747 } | 2770 } |
2748 ASSERT((CurrentToken() == Token::kLPAREN) || func.IsGetterFunction()); | 2771 ASSERT((CurrentToken() == Token::kLPAREN) || func.IsGetterFunction()); |
2749 const bool allow_explicit_default_values = true; | 2772 const bool allow_explicit_default_values = true; |
2750 if (!func.IsGetterFunction()) { | 2773 if (!func.IsGetterFunction()) { |
2751 ParseFormalParameterList(allow_explicit_default_values, ¶ms); | 2774 ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); |
2752 } else { | 2775 } else { |
2753 // TODO(hausner): Remove this once we no longer support the old | 2776 // TODO(hausner): Remove this once we no longer support the old |
2754 // getter syntax with explicit empty parameter list. | 2777 // getter syntax with explicit empty parameter list. |
2755 if (CurrentToken() == Token::kLPAREN) { | 2778 if (CurrentToken() == Token::kLPAREN) { |
2756 ConsumeToken(); | 2779 ConsumeToken(); |
2757 ExpectToken(Token::kRPAREN); | 2780 ExpectToken(Token::kRPAREN); |
2758 } | 2781 } |
2759 } | 2782 } |
2760 | 2783 |
2761 // The number of parameters and their type are not yet set in local functions, | 2784 // The number of parameters and their type are not yet set in local functions, |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2978 if (method->IsConstructor()) { | 3001 if (method->IsConstructor()) { |
2979 method->params.AddFinalParameter( | 3002 method->params.AddFinalParameter( |
2980 TokenPos(), | 3003 TokenPos(), |
2981 &Symbols::PhaseParameter(), | 3004 &Symbols::PhaseParameter(), |
2982 &Type::ZoneHandle(Type::SmiType())); | 3005 &Type::ZoneHandle(Type::SmiType())); |
2983 } | 3006 } |
2984 if (are_implicitly_final) { | 3007 if (are_implicitly_final) { |
2985 method->params.SetImplicitlyFinal(); | 3008 method->params.SetImplicitlyFinal(); |
2986 } | 3009 } |
2987 if (!method->IsGetter()) { | 3010 if (!method->IsGetter()) { |
2988 ParseFormalParameterList(allow_explicit_default_values, &method->params); | 3011 ParseFormalParameterList(allow_explicit_default_values, |
3012 false, | |
3013 &method->params); | |
2989 } | 3014 } |
2990 | 3015 |
2991 // Now that we know the parameter list, we can distinguish between the | 3016 // Now that we know the parameter list, we can distinguish between the |
2992 // unary and binary operator -. | 3017 // unary and binary operator -. |
2993 if (method->has_operator) { | 3018 if (method->has_operator) { |
2994 if ((method->operator_token == Token::kSUB) && | 3019 if ((method->operator_token == Token::kSUB) && |
2995 (method->params.num_fixed_parameters == 1)) { | 3020 (method->params.num_fixed_parameters == 1)) { |
2996 // Patch up name for unary operator - so it does not clash with the | 3021 // Patch up name for unary operator - so it does not clash with the |
2997 // name for binary operator -. | 3022 // name for binary operator -. |
2998 method->operator_token = Token::kNEGATE; | 3023 method->operator_token = Token::kNEGATE; |
(...skipping 1031 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4030 } | 4055 } |
4031 ParamList func_params; | 4056 ParamList func_params; |
4032 | 4057 |
4033 // Add implicit closure object parameter. | 4058 // Add implicit closure object parameter. |
4034 func_params.AddFinalParameter( | 4059 func_params.AddFinalParameter( |
4035 TokenPos(), | 4060 TokenPos(), |
4036 &Symbols::ClosureParameter(), | 4061 &Symbols::ClosureParameter(), |
4037 &Type::ZoneHandle(Type::DynamicType())); | 4062 &Type::ZoneHandle(Type::DynamicType())); |
4038 | 4063 |
4039 const bool no_explicit_default_values = false; | 4064 const bool no_explicit_default_values = false; |
4040 ParseFormalParameterList(no_explicit_default_values, &func_params); | 4065 ParseFormalParameterList(no_explicit_default_values, false, &func_params); |
4041 ExpectSemicolon(); | 4066 ExpectSemicolon(); |
4042 // The field 'is_static' has no meaning for signature functions. | 4067 // The field 'is_static' has no meaning for signature functions. |
4043 Function& signature_function = Function::Handle( | 4068 Function& signature_function = Function::Handle( |
4044 Function::New(*alias_name, | 4069 Function::New(*alias_name, |
4045 RawFunction::kSignatureFunction, | 4070 RawFunction::kSignatureFunction, |
4046 /* is_static = */ false, | 4071 /* is_static = */ false, |
4047 /* is_const = */ false, | 4072 /* is_const = */ false, |
4048 /* is_abstract = */ false, | 4073 /* is_abstract = */ false, |
4049 /* is_external = */ false, | 4074 /* is_external = */ false, |
4050 function_type_alias, | 4075 function_type_alias, |
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4479 } | 4504 } |
4480 // A setter named x= may co-exist with a function named x, thus we do | 4505 // A setter named x= may co-exist with a function named x, thus we do |
4481 // not need to check setters. | 4506 // not need to check setters. |
4482 | 4507 |
4483 if (CurrentToken() != Token::kLPAREN) { | 4508 if (CurrentToken() != Token::kLPAREN) { |
4484 ErrorMsg("'(' expected"); | 4509 ErrorMsg("'(' expected"); |
4485 } | 4510 } |
4486 const intptr_t function_pos = TokenPos(); | 4511 const intptr_t function_pos = TokenPos(); |
4487 ParamList params; | 4512 ParamList params; |
4488 const bool allow_explicit_default_values = true; | 4513 const bool allow_explicit_default_values = true; |
4489 ParseFormalParameterList(allow_explicit_default_values, ¶ms); | 4514 ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); |
4490 | 4515 |
4491 intptr_t function_end_pos = function_pos; | 4516 intptr_t function_end_pos = function_pos; |
4492 if (is_external) { | 4517 if (is_external) { |
4493 function_end_pos = TokenPos(); | 4518 function_end_pos = TokenPos(); |
4494 ExpectSemicolon(); | 4519 ExpectSemicolon(); |
4495 } else if (CurrentToken() == Token::kLBRACE) { | 4520 } else if (CurrentToken() == Token::kLBRACE) { |
4496 SkipBlock(); | 4521 SkipBlock(); |
4497 function_end_pos = TokenPos() - 1; | 4522 function_end_pos = TokenPos() - 1; |
4498 } else if (CurrentToken() == Token::kARROW) { | 4523 } else if (CurrentToken() == Token::kARROW) { |
4499 ConsumeToken(); | 4524 ConsumeToken(); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4568 } | 4593 } |
4569 } | 4594 } |
4570 const intptr_t name_pos = TokenPos(); | 4595 const intptr_t name_pos = TokenPos(); |
4571 const String* field_name = ExpectIdentifier("accessor name expected"); | 4596 const String* field_name = ExpectIdentifier("accessor name expected"); |
4572 | 4597 |
4573 const intptr_t accessor_pos = TokenPos(); | 4598 const intptr_t accessor_pos = TokenPos(); |
4574 ParamList params; | 4599 ParamList params; |
4575 | 4600 |
4576 if (!is_getter) { | 4601 if (!is_getter) { |
4577 const bool allow_explicit_default_values = true; | 4602 const bool allow_explicit_default_values = true; |
4578 ParseFormalParameterList(allow_explicit_default_values, ¶ms); | 4603 ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); |
4579 } | 4604 } |
4580 String& accessor_name = String::ZoneHandle(); | 4605 String& accessor_name = String::ZoneHandle(); |
4581 int expected_num_parameters = -1; | 4606 int expected_num_parameters = -1; |
4582 if (is_getter) { | 4607 if (is_getter) { |
4583 expected_num_parameters = 0; | 4608 expected_num_parameters = 0; |
4584 accessor_name = Field::GetterSymbol(*field_name); | 4609 accessor_name = Field::GetterSymbol(*field_name); |
4585 } else { | 4610 } else { |
4586 expected_num_parameters = 1; | 4611 expected_num_parameters = 1; |
4587 accessor_name = Field::SetterSymbol(*field_name); | 4612 accessor_name = Field::SetterSymbol(*field_name); |
4588 } | 4613 } |
(...skipping 5587 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
10176 if (IsIdentifier()) { | 10201 if (IsIdentifier()) { |
10177 if (LookaheadToken(1) != Token::kLPAREN) { | 10202 if (LookaheadToken(1) != Token::kLPAREN) { |
10178 SkipType(true); | 10203 SkipType(true); |
10179 } | 10204 } |
10180 ExpectIdentifier("function name expected"); | 10205 ExpectIdentifier("function name expected"); |
10181 } | 10206 } |
10182 if (CurrentToken() == Token::kLPAREN) { | 10207 if (CurrentToken() == Token::kLPAREN) { |
10183 const bool allow_explicit_default_values = true; | 10208 const bool allow_explicit_default_values = true; |
10184 ParamList params; | 10209 ParamList params; |
10185 params.skipped = true; | 10210 params.skipped = true; |
10186 ParseFormalParameterList(allow_explicit_default_values, ¶ms); | 10211 ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); |
10187 } | 10212 } |
10188 if (CurrentToken() == Token::kLBRACE) { | 10213 if (CurrentToken() == Token::kLBRACE) { |
10189 SkipBlock(); | 10214 SkipBlock(); |
10190 } else if (CurrentToken() == Token::kARROW) { | 10215 } else if (CurrentToken() == Token::kARROW) { |
10191 ConsumeToken(); | 10216 ConsumeToken(); |
10192 SkipExpr(); | 10217 SkipExpr(); |
10193 } | 10218 } |
10194 } | 10219 } |
10195 | 10220 |
10196 | 10221 |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
10475 void Parser::SkipQualIdent() { | 10500 void Parser::SkipQualIdent() { |
10476 ASSERT(IsIdentifier()); | 10501 ASSERT(IsIdentifier()); |
10477 ConsumeToken(); | 10502 ConsumeToken(); |
10478 if (CurrentToken() == Token::kPERIOD) { | 10503 if (CurrentToken() == Token::kPERIOD) { |
10479 ConsumeToken(); // Consume the kPERIOD token. | 10504 ConsumeToken(); // Consume the kPERIOD token. |
10480 ExpectIdentifier("identifier expected after '.'"); | 10505 ExpectIdentifier("identifier expected after '.'"); |
10481 } | 10506 } |
10482 } | 10507 } |
10483 | 10508 |
10484 } // namespace dart | 10509 } // namespace dart |
OLD | NEW |