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 "platform/utils.h" | 8 #include "platform/utils.h" |
9 #include "vm/ast_transformer.h" | 9 #include "vm/ast_transformer.h" |
10 #include "vm/bootstrap.h" | 10 #include "vm/bootstrap.h" |
(...skipping 3807 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3818 RawFunction::AsyncModifier async_modifier = ParseFunctionModifier(); | 3818 RawFunction::AsyncModifier async_modifier = ParseFunctionModifier(); |
3819 if ((method->IsFactoryOrConstructor() || method->IsSetter()) && | 3819 if ((method->IsFactoryOrConstructor() || method->IsSetter()) && |
3820 (async_modifier != RawFunction::kNoModifier)) { | 3820 (async_modifier != RawFunction::kNoModifier)) { |
3821 ReportError(modifier_pos, | 3821 ReportError(modifier_pos, |
3822 "%s '%s' may not be async, async* or sync*", | 3822 "%s '%s' may not be async, async* or sync*", |
3823 (method->IsSetter()) ? "setter" : "constructor", | 3823 (method->IsSetter()) ? "setter" : "constructor", |
3824 method->name->ToCString()); | 3824 method->name->ToCString()); |
3825 } | 3825 } |
3826 | 3826 |
3827 intptr_t method_end_pos = TokenPos(); | 3827 intptr_t method_end_pos = TokenPos(); |
| 3828 String* native_name = NULL; |
3828 if ((CurrentToken() == Token::kLBRACE) || | 3829 if ((CurrentToken() == Token::kLBRACE) || |
3829 (CurrentToken() == Token::kARROW)) { | 3830 (CurrentToken() == Token::kARROW)) { |
3830 if (method->has_abstract) { | 3831 if (method->has_abstract) { |
3831 ReportError(TokenPos(), | 3832 ReportError(TokenPos(), |
3832 "abstract method '%s' may not have a function body", | 3833 "abstract method '%s' may not have a function body", |
3833 method->name->ToCString()); | 3834 method->name->ToCString()); |
3834 } else if (method->has_external) { | 3835 } else if (method->has_external) { |
3835 ReportError(TokenPos(), | 3836 ReportError(TokenPos(), |
3836 "external %s '%s' may not have a function body", | 3837 "external %s '%s' may not have a function body", |
3837 method->IsFactoryOrConstructor() ? "constructor" : "method", | 3838 method->IsFactoryOrConstructor() ? "constructor" : "method", |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3873 method->name->ToCString()); | 3874 method->name->ToCString()); |
3874 } else if (method->IsConstructor() && method->has_const) { | 3875 } else if (method->IsConstructor() && method->has_const) { |
3875 ReportError(method->name_pos, | 3876 ReportError(method->name_pos, |
3876 "const constructor '%s' may not be native", | 3877 "const constructor '%s' may not be native", |
3877 method->name->ToCString()); | 3878 method->name->ToCString()); |
3878 } | 3879 } |
3879 if (method->redirect_name != NULL) { | 3880 if (method->redirect_name != NULL) { |
3880 ReportError(method->name_pos, | 3881 ReportError(method->name_pos, |
3881 "Constructor with redirection may not have a function body"); | 3882 "Constructor with redirection may not have a function body"); |
3882 } | 3883 } |
3883 ParseNativeDeclaration(); | 3884 native_name = &ParseNativeDeclaration(); |
3884 method_end_pos = TokenPos(); | 3885 method_end_pos = TokenPos(); |
3885 ExpectSemicolon(); | 3886 ExpectSemicolon(); |
3886 method->has_native = true; | 3887 method->has_native = true; |
3887 } else { | 3888 } else { |
3888 // We haven't found a method body. Issue error if one is required. | 3889 // We haven't found a method body. Issue error if one is required. |
3889 const bool must_have_body = | 3890 const bool must_have_body = |
3890 method->has_static && | 3891 method->has_static && |
3891 !method->has_external && | 3892 !method->has_external && |
3892 redirection_type.IsNull(); | 3893 redirection_type.IsNull(); |
3893 if (must_have_body) { | 3894 if (must_have_body) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3951 func.set_result_type(*method->type); | 3952 func.set_result_type(*method->type); |
3952 func.set_end_token_pos(method_end_pos); | 3953 func.set_end_token_pos(method_end_pos); |
3953 func.set_is_redirecting(is_redirecting); | 3954 func.set_is_redirecting(is_redirecting); |
3954 func.set_modifier(async_modifier); | 3955 func.set_modifier(async_modifier); |
3955 if (library_.is_dart_scheme() && library_.IsPrivate(*method->name)) { | 3956 if (library_.is_dart_scheme() && library_.IsPrivate(*method->name)) { |
3956 func.set_is_reflectable(false); | 3957 func.set_is_reflectable(false); |
3957 } | 3958 } |
3958 if (method->metadata_pos > 0) { | 3959 if (method->metadata_pos > 0) { |
3959 library_.AddFunctionMetadata(func, method->metadata_pos); | 3960 library_.AddFunctionMetadata(func, method->metadata_pos); |
3960 } | 3961 } |
| 3962 if (method->has_native) { |
| 3963 func.set_native_name(*native_name); |
| 3964 } |
3961 | 3965 |
3962 // If this method is a redirecting factory, set the redirection information. | 3966 // If this method is a redirecting factory, set the redirection information. |
3963 if (!redirection_type.IsNull()) { | 3967 if (!redirection_type.IsNull()) { |
3964 ASSERT(func.IsFactory()); | 3968 ASSERT(func.IsFactory()); |
3965 func.SetRedirectionType(redirection_type); | 3969 func.SetRedirectionType(redirection_type); |
3966 if (!redirection_identifier.IsNull()) { | 3970 if (!redirection_identifier.IsNull()) { |
3967 func.SetRedirectionIdentifier(redirection_identifier); | 3971 func.SetRedirectionIdentifier(redirection_identifier); |
3968 } | 3972 } |
3969 } | 3973 } |
3970 | 3974 |
(...skipping 1607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5578 const intptr_t function_pos = TokenPos(); | 5582 const intptr_t function_pos = TokenPos(); |
5579 ParamList params; | 5583 ParamList params; |
5580 const bool allow_explicit_default_values = true; | 5584 const bool allow_explicit_default_values = true; |
5581 ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); | 5585 ParseFormalParameterList(allow_explicit_default_values, false, ¶ms); |
5582 | 5586 |
5583 const intptr_t modifier_pos = TokenPos(); | 5587 const intptr_t modifier_pos = TokenPos(); |
5584 RawFunction::AsyncModifier func_modifier = ParseFunctionModifier(); | 5588 RawFunction::AsyncModifier func_modifier = ParseFunctionModifier(); |
5585 | 5589 |
5586 intptr_t function_end_pos = function_pos; | 5590 intptr_t function_end_pos = function_pos; |
5587 bool is_native = false; | 5591 bool is_native = false; |
| 5592 String* native_name = NULL; |
5588 if (is_external) { | 5593 if (is_external) { |
5589 function_end_pos = TokenPos(); | 5594 function_end_pos = TokenPos(); |
5590 ExpectSemicolon(); | 5595 ExpectSemicolon(); |
5591 } else if (CurrentToken() == Token::kLBRACE) { | 5596 } else if (CurrentToken() == Token::kLBRACE) { |
5592 SkipBlock(); | 5597 SkipBlock(); |
5593 function_end_pos = TokenPos(); | 5598 function_end_pos = TokenPos(); |
5594 ExpectToken(Token::kRBRACE); | 5599 ExpectToken(Token::kRBRACE); |
5595 } else if (CurrentToken() == Token::kARROW) { | 5600 } else if (CurrentToken() == Token::kARROW) { |
5596 if ((func_modifier & RawFunction::kGeneratorBit) != 0) { | 5601 if ((func_modifier & RawFunction::kGeneratorBit) != 0) { |
5597 ReportError(modifier_pos, | 5602 ReportError(modifier_pos, |
5598 "=> style function may not be sync* or async* generator"); | 5603 "=> style function may not be sync* or async* generator"); |
5599 } | 5604 } |
5600 ConsumeToken(); | 5605 ConsumeToken(); |
5601 BoolScope allow_await(&this->await_is_keyword_, | 5606 BoolScope allow_await(&this->await_is_keyword_, |
5602 func_modifier != RawFunction::kNoModifier); | 5607 func_modifier != RawFunction::kNoModifier); |
5603 SkipExpr(); | 5608 SkipExpr(); |
5604 function_end_pos = TokenPos(); | 5609 function_end_pos = TokenPos(); |
5605 ExpectSemicolon(); | 5610 ExpectSemicolon(); |
5606 } else if (IsSymbol(Symbols::Native())) { | 5611 } else if (IsSymbol(Symbols::Native())) { |
5607 ParseNativeDeclaration(); | 5612 native_name = &ParseNativeDeclaration(); |
5608 function_end_pos = TokenPos(); | 5613 function_end_pos = TokenPos(); |
5609 ExpectSemicolon(); | 5614 ExpectSemicolon(); |
5610 is_native = true; | 5615 is_native = true; |
5611 } else { | 5616 } else { |
5612 ReportError("function block expected"); | 5617 ReportError("function block expected"); |
5613 } | 5618 } |
5614 Function& func = Function::Handle(Z, | 5619 Function& func = Function::Handle(Z, |
5615 Function::New(func_name, | 5620 Function::New(func_name, |
5616 RawFunction::kRegularFunction, | 5621 RawFunction::kRegularFunction, |
5617 is_static, | 5622 is_static, |
5618 /* is_const = */ false, | 5623 /* is_const = */ false, |
5619 /* is_abstract = */ false, | 5624 /* is_abstract = */ false, |
5620 is_external, | 5625 is_external, |
5621 is_native, | 5626 is_native, |
5622 current_class(), | 5627 current_class(), |
5623 decl_begin_pos)); | 5628 decl_begin_pos)); |
5624 func.set_result_type(result_type); | 5629 func.set_result_type(result_type); |
5625 func.set_end_token_pos(function_end_pos); | 5630 func.set_end_token_pos(function_end_pos); |
5626 func.set_modifier(func_modifier); | 5631 func.set_modifier(func_modifier); |
5627 if (library_.is_dart_scheme() && library_.IsPrivate(func_name)) { | 5632 if (library_.is_dart_scheme() && library_.IsPrivate(func_name)) { |
5628 func.set_is_reflectable(false); | 5633 func.set_is_reflectable(false); |
5629 } | 5634 } |
| 5635 if (is_native) { |
| 5636 func.set_native_name(*native_name); |
| 5637 } |
5630 AddFormalParamsToFunction(¶ms, func); | 5638 AddFormalParamsToFunction(¶ms, func); |
5631 top_level->AddFunction(func); | 5639 top_level->AddFunction(func); |
5632 if (!is_patch) { | 5640 if (!is_patch) { |
5633 library_.AddObject(func, func_name); | 5641 library_.AddObject(func, func_name); |
5634 } else { | 5642 } else { |
5635 library_.ReplaceObject(func, func_name); | 5643 library_.ReplaceObject(func, func_name); |
5636 } | 5644 } |
5637 if (metadata_pos >= 0) { | 5645 if (metadata_pos >= 0) { |
5638 library_.AddFunctionMetadata(func, metadata_pos); | 5646 library_.AddFunctionMetadata(func, metadata_pos); |
5639 } | 5647 } |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5728 | 5736 |
5729 const intptr_t modifier_pos = TokenPos(); | 5737 const intptr_t modifier_pos = TokenPos(); |
5730 RawFunction::AsyncModifier func_modifier = ParseFunctionModifier(); | 5738 RawFunction::AsyncModifier func_modifier = ParseFunctionModifier(); |
5731 if (!is_getter && (func_modifier != RawFunction::kNoModifier)) { | 5739 if (!is_getter && (func_modifier != RawFunction::kNoModifier)) { |
5732 ReportError(modifier_pos, | 5740 ReportError(modifier_pos, |
5733 "setter function cannot be async, async* or sync*"); | 5741 "setter function cannot be async, async* or sync*"); |
5734 } | 5742 } |
5735 | 5743 |
5736 intptr_t accessor_end_pos = accessor_pos; | 5744 intptr_t accessor_end_pos = accessor_pos; |
5737 bool is_native = false; | 5745 bool is_native = false; |
| 5746 String* native_name = NULL; |
5738 if (is_external) { | 5747 if (is_external) { |
5739 accessor_end_pos = TokenPos(); | 5748 accessor_end_pos = TokenPos(); |
5740 ExpectSemicolon(); | 5749 ExpectSemicolon(); |
5741 } else if (CurrentToken() == Token::kLBRACE) { | 5750 } else if (CurrentToken() == Token::kLBRACE) { |
5742 SkipBlock(); | 5751 SkipBlock(); |
5743 accessor_end_pos = TokenPos(); | 5752 accessor_end_pos = TokenPos(); |
5744 ExpectToken(Token::kRBRACE); | 5753 ExpectToken(Token::kRBRACE); |
5745 } else if (CurrentToken() == Token::kARROW) { | 5754 } else if (CurrentToken() == Token::kARROW) { |
5746 if (is_getter && ((func_modifier & RawFunction::kGeneratorBit) != 0)) { | 5755 if (is_getter && ((func_modifier & RawFunction::kGeneratorBit) != 0)) { |
5747 ReportError(modifier_pos, | 5756 ReportError(modifier_pos, |
5748 "=> style getter may not be sync* or async* generator"); | 5757 "=> style getter may not be sync* or async* generator"); |
5749 } | 5758 } |
5750 ConsumeToken(); | 5759 ConsumeToken(); |
5751 BoolScope allow_await(&this->await_is_keyword_, | 5760 BoolScope allow_await(&this->await_is_keyword_, |
5752 func_modifier != RawFunction::kNoModifier); | 5761 func_modifier != RawFunction::kNoModifier); |
5753 SkipExpr(); | 5762 SkipExpr(); |
5754 accessor_end_pos = TokenPos(); | 5763 accessor_end_pos = TokenPos(); |
5755 ExpectSemicolon(); | 5764 ExpectSemicolon(); |
5756 } else if (IsSymbol(Symbols::Native())) { | 5765 } else if (IsSymbol(Symbols::Native())) { |
5757 ParseNativeDeclaration(); | 5766 native_name = &ParseNativeDeclaration(); |
5758 accessor_end_pos = TokenPos(); | 5767 accessor_end_pos = TokenPos(); |
5759 ExpectSemicolon(); | 5768 ExpectSemicolon(); |
5760 is_native = true; | 5769 is_native = true; |
5761 } else { | 5770 } else { |
5762 ReportError("function block expected"); | 5771 ReportError("function block expected"); |
5763 } | 5772 } |
5764 Function& func = Function::Handle(Z, | 5773 Function& func = Function::Handle(Z, |
5765 Function::New(accessor_name, | 5774 Function::New(accessor_name, |
5766 is_getter ? RawFunction::kGetterFunction : | 5775 is_getter ? RawFunction::kGetterFunction : |
5767 RawFunction::kSetterFunction, | 5776 RawFunction::kSetterFunction, |
5768 is_static, | 5777 is_static, |
5769 /* is_const = */ false, | 5778 /* is_const = */ false, |
5770 /* is_abstract = */ false, | 5779 /* is_abstract = */ false, |
5771 is_external, | 5780 is_external, |
5772 is_native, | 5781 is_native, |
5773 current_class(), | 5782 current_class(), |
5774 decl_begin_pos)); | 5783 decl_begin_pos)); |
5775 func.set_result_type(result_type); | 5784 func.set_result_type(result_type); |
5776 func.set_end_token_pos(accessor_end_pos); | 5785 func.set_end_token_pos(accessor_end_pos); |
5777 func.set_modifier(func_modifier); | 5786 func.set_modifier(func_modifier); |
5778 if (is_native) { | 5787 if (is_native) { |
5779 func.set_is_debuggable(false); | 5788 func.set_is_debuggable(false); |
| 5789 func.set_native_name(*native_name); |
5780 } | 5790 } |
5781 if (library_.is_dart_scheme() && library_.IsPrivate(accessor_name)) { | 5791 if (library_.is_dart_scheme() && library_.IsPrivate(accessor_name)) { |
5782 func.set_is_reflectable(false); | 5792 func.set_is_reflectable(false); |
5783 } | 5793 } |
5784 AddFormalParamsToFunction(¶ms, func); | 5794 AddFormalParamsToFunction(¶ms, func); |
5785 top_level->AddFunction(func); | 5795 top_level->AddFunction(func); |
5786 if (!is_patch) { | 5796 if (!is_patch) { |
5787 library_.AddObject(func, accessor_name); | 5797 library_.AddObject(func, accessor_name); |
5788 } else { | 5798 } else { |
5789 library_.ReplaceObject(func, accessor_name); | 5799 library_.ReplaceObject(func, accessor_name); |
(...skipping 8543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14333 void Parser::SkipQualIdent() { | 14343 void Parser::SkipQualIdent() { |
14334 ASSERT(IsIdentifier()); | 14344 ASSERT(IsIdentifier()); |
14335 ConsumeToken(); | 14345 ConsumeToken(); |
14336 if (CurrentToken() == Token::kPERIOD) { | 14346 if (CurrentToken() == Token::kPERIOD) { |
14337 ConsumeToken(); // Consume the kPERIOD token. | 14347 ConsumeToken(); // Consume the kPERIOD token. |
14338 ExpectIdentifier("identifier expected after '.'"); | 14348 ExpectIdentifier("identifier expected after '.'"); |
14339 } | 14349 } |
14340 } | 14350 } |
14341 | 14351 |
14342 } // namespace dart | 14352 } // namespace dart |
OLD | NEW |