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 #include "vm/flags.h" | 6 #include "vm/flags.h" |
7 | 7 |
8 #ifndef DART_PRECOMPILED_RUNTIME | 8 #ifndef DART_PRECOMPILED_RUNTIME |
9 | 9 |
10 #include "lib/invocation_mirror.h" | 10 #include "lib/invocation_mirror.h" |
(...skipping 5524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5535 Token::Kind token = CurrentToken(); | 5535 Token::Kind token = CurrentToken(); |
5536 if ((token == Token::kGT) || (token == Token::kSHR)) { | 5536 if ((token == Token::kGT) || (token == Token::kSHR)) { |
5537 ConsumeRightAngleBracket(); | 5537 ConsumeRightAngleBracket(); |
5538 } else { | 5538 } else { |
5539 ReportError("right angle bracket expected"); | 5539 ReportError("right angle bracket expected"); |
5540 } | 5540 } |
5541 } | 5541 } |
5542 } | 5542 } |
5543 | 5543 |
5544 | 5544 |
| 5545 void Parser::SkipTypeParameters() { |
| 5546 // Function already parsed, no need to check FLAG_generic_method_syntax. |
| 5547 if (IsTypeParameters()) { |
| 5548 const bool skipped = TryParseTypeParameters(); |
| 5549 ASSERT(skipped); |
| 5550 } |
| 5551 } |
| 5552 |
| 5553 |
5545 void Parser::SkipType(bool allow_void) { | 5554 void Parser::SkipType(bool allow_void) { |
5546 if (CurrentToken() == Token::kVOID) { | 5555 if (CurrentToken() == Token::kVOID) { |
5547 if (!allow_void) { | 5556 if (!allow_void) { |
5548 ReportError("'void' not allowed here"); | 5557 ReportError("'void' not allowed here"); |
5549 } | 5558 } |
5550 ConsumeToken(); | 5559 ConsumeToken(); |
5551 } else { | 5560 } else { |
5552 ExpectIdentifier("type name expected"); | 5561 ExpectIdentifier("type name expected"); |
5553 if (CurrentToken() == Token::kPERIOD) { | 5562 if (CurrentToken() == Token::kPERIOD) { |
5554 ConsumeToken(); | 5563 ConsumeToken(); |
(...skipping 9295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14850 SkipExpr(); | 14859 SkipExpr(); |
14851 } | 14860 } |
14852 } | 14861 } |
14853 | 14862 |
14854 | 14863 |
14855 // Skips function/method/constructor/getter/setter preambles until the formal | 14864 // Skips function/method/constructor/getter/setter preambles until the formal |
14856 // parameter list. It is enough to skip the tokens, since we have already | 14865 // parameter list. It is enough to skip the tokens, since we have already |
14857 // previously parsed the function. | 14866 // previously parsed the function. |
14858 void Parser::SkipFunctionPreamble() { | 14867 void Parser::SkipFunctionPreamble() { |
14859 while (true) { | 14868 while (true) { |
14860 const Token::Kind token = CurrentToken(); | |
14861 if (IsFunctionTypeSymbol()) { | 14869 if (IsFunctionTypeSymbol()) { |
14862 ConsumeToken(); | 14870 ConsumeToken(); |
14863 SkipTypeArguments(); | 14871 SkipTypeParameters(); |
14864 SkipToMatchingParenthesis(); | 14872 SkipToMatchingParenthesis(); |
14865 continue; | 14873 continue; |
14866 } | 14874 } |
| 14875 const Token::Kind token = CurrentToken(); |
14867 if (token == Token::kLPAREN) { | 14876 if (token == Token::kLPAREN) { |
14868 return; | 14877 return; |
14869 } | 14878 } |
14870 if (token == Token::kGET) { | 14879 if (token == Token::kGET) { |
| 14880 if (LookaheadToken(1) == Token::kLT) { |
| 14881 // Case: Generic Function/method named get. |
| 14882 ConsumeToken(); // Parse away 'get' (the function's name). |
| 14883 SkipTypeParameters(); |
| 14884 continue; |
| 14885 } |
14871 if (LookaheadToken(1) == Token::kLPAREN) { | 14886 if (LookaheadToken(1) == Token::kLPAREN) { |
14872 // Case: Function/method named get. | 14887 // Case: Function/method named get. |
14873 ConsumeToken(); // Parse away 'get' (the function's name). | 14888 ConsumeToken(); // Parse away 'get' (the function's name). |
14874 return; | 14889 return; |
14875 } | 14890 } |
14876 // Case: Getter. | 14891 // Case: Getter. |
14877 ConsumeToken(); // Parse away 'get'. | 14892 ConsumeToken(); // Parse away 'get'. |
14878 ConsumeToken(); // Parse away the getter name. | 14893 ConsumeToken(); // Parse away the getter name. |
14879 return; | 14894 return; |
14880 } | 14895 } |
14881 ConsumeToken(); | 14896 ConsumeToken(); // Can be static, factory, operator, void, ident, etc... |
14882 } | 14897 } |
14883 } | 14898 } |
14884 | 14899 |
14885 | 14900 |
14886 void Parser::SkipListLiteral() { | 14901 void Parser::SkipListLiteral() { |
14887 if (CurrentToken() == Token::kINDEX) { | 14902 if (CurrentToken() == Token::kINDEX) { |
14888 // Empty list literal. | 14903 // Empty list literal. |
14889 ConsumeToken(); | 14904 ConsumeToken(); |
14890 return; | 14905 return; |
14891 } | 14906 } |
(...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15298 TokenPosition* start, | 15313 TokenPosition* start, |
15299 TokenPosition* end) { | 15314 TokenPosition* end) { |
15300 UNREACHABLE(); | 15315 UNREACHABLE(); |
15301 return false; | 15316 return false; |
15302 } | 15317 } |
15303 | 15318 |
15304 | 15319 |
15305 } // namespace dart | 15320 } // namespace dart |
15306 | 15321 |
15307 #endif // DART_PRECOMPILED_RUNTIME | 15322 #endif // DART_PRECOMPILED_RUNTIME |
OLD | NEW |