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

Side by Side Diff: pkg/analyzer/lib/src/generated/parser.dart

Issue 2439573003: Experiment with new function-type syntax.
Patch Set: Change a few more typedefs. Created 4 years, 2 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
« no previous file with comments | « no previous file | pkg/compiler/lib/compiler.dart » ('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) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 library analyzer.src.generated.parser; 5 library analyzer.src.generated.parser;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 import "dart:math" as math; 8 import "dart:math" as math;
9 9
10 import 'package:analyzer/dart/ast/ast.dart'; 10 import 'package:analyzer/dart/ast/ast.dart';
(...skipping 3946 matching lines...) Expand 10 before | Expand all | Expand 10 after
3957 3957
3958 /** 3958 /**
3959 * Parse a normal formal parameter. Return the normal formal parameter that 3959 * Parse a normal formal parameter. Return the normal formal parameter that
3960 * was parsed. 3960 * was parsed.
3961 * 3961 *
3962 * normalFormalParameter ::= 3962 * normalFormalParameter ::=
3963 * functionSignature 3963 * functionSignature
3964 * | fieldFormalParameter 3964 * | fieldFormalParameter
3965 * | simpleFormalParameter 3965 * | simpleFormalParameter
3966 * 3966 *
3967 * functionSignature: 3967 * legacyFunctionSignature:
3968 * metadata returnType? identifier typeParameters? formalParameterList 3968 * metadata returnType? identifier typeParameters? formalParameterList
3969 * 3969 *
3970 * fieldFormalParameter ::= 3970 * fieldFormalParameter ::=
3971 * metadata finalConstVarOrType? 'this' '.' identifier 3971 * metadata finalConstVarOrType? 'this' '.' identifier
3972 * 3972 *
3973 * simpleFormalParameter ::= 3973 * simpleFormalParameter ::=
3974 * declaredIdentifier 3974 * declaredIdentifier
3975 * | metadata identifier 3975 * | metadata identifier
3976 */ 3976 */
3977 NormalFormalParameter parseNormalFormalParameter() { 3977 NormalFormalParameter parseNormalFormalParameter() {
(...skipping 838 matching lines...) Expand 10 before | Expand all | Expand 10 after
4816 * classTypeAlias 4816 * classTypeAlias
4817 * | functionTypeAlias 4817 * | functionTypeAlias
4818 * 4818 *
4819 * classTypeAlias ::= 4819 * classTypeAlias ::=
4820 * identifier typeParameters? '=' 'abstract'? mixinApplication 4820 * identifier typeParameters? '=' 'abstract'? mixinApplication
4821 * 4821 *
4822 * mixinApplication ::= 4822 * mixinApplication ::=
4823 * qualified withClause implementsClause? ';' 4823 * qualified withClause implementsClause? ';'
4824 * 4824 *
4825 * functionTypeAlias ::= 4825 * functionTypeAlias ::=
4826 * legacyFunctionTypeAlias |
4827 * newFunctionTypeAlias
4828 *
4829 * legacyFunctionTypeAlias ::=
4826 * functionPrefix typeParameterList? formalParameterList ';' 4830 * functionPrefix typeParameterList? formalParameterList ';'
4827 * 4831 *
4828 * functionPrefix ::= 4832 * functionPrefix ::=
4829 * returnType? name 4833 * returnType? name
4834 *
4835 * newFunctionTypeAlias ::=
4836 * identifier typeParameters? '=' functionType ';'
4837 *
4838 * functionType ::= typeParameterList? formalParameterList '-' '>' returnT ype
Lasse Reichstein Nielsen 2016/10/20 19:36:44 I assume you use '-' '>' instead of '->' because i
floitsch 2016/10/21 12:24:34 correct.
4839 *
4830 */ 4840 */
4831 TypeAlias parseTypeAlias(CommentAndMetadata commentAndMetadata) { 4841 TypeAlias parseTypeAlias(CommentAndMetadata commentAndMetadata) {
4832 Token keyword = getAndAdvance(); 4842 Token keyword = getAndAdvance();
4833 if (_matchesIdentifier()) { 4843 if (_matchesIdentifier()) {
4834 Token next = _peek(); 4844 Token next = _peek();
4835 if (_tokenMatches(next, TokenType.LT)) { 4845 if (_tokenMatches(next, TokenType.LT)) {
4836 next = _skipTypeParameterList(next); 4846 next = _skipTypeParameterList(next);
4837 if (next != null && _tokenMatches(next, TokenType.EQ)) { 4847 if (next != null && _tokenMatches(next, TokenType.EQ)) {
4848 next = next.next;
4849 if (next != null &&
4850 (_tokenMatches(next, TokenType.LT) ||
4851 _tokenMatches(next, TokenType.OPEN_PAREN))) {
4852 return _parseNewFunctionTypeAlias(commentAndMetadata, keyword);
4853 }
4854 if (next != null && _tokenMatches(next, TokenType.IDENTIFIER)) {
4855 next = next.next;
4856 if (next != null && _tokenMatches(next, TokenType.MINUS)) {
4857 return _parseNewFunctionTypeAlias(commentAndMetadata, keyword);
4858 }
4859 }
4838 TypeAlias typeAlias = 4860 TypeAlias typeAlias =
4839 parseClassTypeAlias(commentAndMetadata, null, keyword); 4861 parseClassTypeAlias(commentAndMetadata, null, keyword);
4840 _reportErrorForToken( 4862 _reportErrorForToken(
4841 ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keyword); 4863 ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keyword);
4842 return typeAlias; 4864 return typeAlias;
4843 } 4865 }
4844 } else if (_tokenMatches(next, TokenType.EQ)) { 4866 } else if (_tokenMatches(next, TokenType.EQ)) {
4867 next = next.next;
4868 if (next != null &&
4869 (_tokenMatches(next, TokenType.LT) ||
4870 _tokenMatches(next, TokenType.OPEN_PAREN))) {
4871 return _parseNewFunctionTypeAlias(commentAndMetadata, keyword);
4872 } else if (next != null && _tokenMatches(next, TokenType.IDENTIFIER)) {
4873 next = next.next;
4874 if (next != null && _tokenMatches(next, TokenType.MINUS)) {
4875 return _parseNewFunctionTypeAlias(commentAndMetadata, keyword);
4876 }
4877 }
4845 TypeAlias typeAlias = 4878 TypeAlias typeAlias =
4846 parseClassTypeAlias(commentAndMetadata, null, keyword); 4879 parseClassTypeAlias(commentAndMetadata, null, keyword);
4847 _reportErrorForToken( 4880 _reportErrorForToken(
4848 ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keyword); 4881 ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keyword);
4849 return typeAlias; 4882 return typeAlias;
4850 } 4883 }
4851 } 4884 }
4852 return _parseFunctionTypeAlias(commentAndMetadata, keyword); 4885 return _parseFunctionTypeAlias(commentAndMetadata, keyword);
4853 } 4886 }
4854 4887
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after
5315 * a type name or changing the current token. Return the token following the 5348 * a type name or changing the current token. Return the token following the
5316 * type name that was parsed, or `null` if the given token is not the first 5349 * type name that was parsed, or `null` if the given token is not the first
5317 * token in a valid type name. 5350 * token in a valid type name.
5318 * 5351 *
5319 * This method must be kept in sync with [parseTypeName]. 5352 * This method must be kept in sync with [parseTypeName].
5320 * 5353 *
5321 * type ::= 5354 * type ::=
5322 * qualified typeArguments? 5355 * qualified typeArguments?
5323 */ 5356 */
5324 Token skipTypeName(Token startToken) { 5357 Token skipTypeName(Token startToken) {
5325 Token token = skipPrefixedIdentifier(startToken); 5358 Token token;
5359 if (_tokenMatches(startToken, TokenType.LT)) {
5360 token = skipTypeArgumentList(token);
5361 if (token == null) return null;
5362 token = _skipFormalParameterList(token);
5363 if (token == null) return null;
5364 if (!_tokenMatches(token, TokenType.MINUS)) return null;
5365 token = token.next;
5366 if (token == null) return null;
5367 if (!_tokenMatches(token, TokenType.GT)) return null;
5368 return skipTypeName(token);
5369 }
5370
5371 token = skipPrefixedIdentifier(startToken);
5326 if (token == null) { 5372 if (token == null) {
5327 return null; 5373 return null;
5328 } 5374 }
5329 if (_tokenMatches(token, TokenType.LT)) { 5375 if (_tokenMatches(token, TokenType.LT)) {
5330 token = skipTypeArgumentList(token); 5376 token = skipTypeArgumentList(token);
5331 } 5377 }
5332 return token; 5378 return token;
5333 } 5379 }
5334 5380
5335 /** 5381 /**
(...skipping 1174 matching lines...) Expand 10 before | Expand all | Expand 10 after
6510 _reportErrorForToken( 6556 _reportErrorForToken(
6511 ParserErrorCode.GETTER_IN_FUNCTION, propertyKeyword); 6557 ParserErrorCode.GETTER_IN_FUNCTION, propertyKeyword);
6512 } else { 6558 } else {
6513 _reportErrorForToken( 6559 _reportErrorForToken(
6514 ParserErrorCode.SETTER_IN_FUNCTION, propertyKeyword); 6560 ParserErrorCode.SETTER_IN_FUNCTION, propertyKeyword);
6515 } 6561 }
6516 } 6562 }
6517 return new FunctionDeclarationStatement(declaration); 6563 return new FunctionDeclarationStatement(declaration);
6518 } 6564 }
6519 6565
6566 FunctionTypeAlias _parseNewFunctionTypeAlias(CommentAndMetadata commentAndMeta data, Token keyword) {
6567 SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
6568 TypeParameterList typeParameters = null;
6569 if (_matches(TokenType.LT)) {
6570 typeParameters = parseTypeParameterList();
6571 }
6572
6573 _expect(TokenType.EQ); // TODO(floitsch): store the sign in the node.
6574
6575 if (_matches(TokenType.LT)) {
6576 parseTypeParameterList(); // TODO(floitsch): store the generic arguments.
6577 }
6578
6579
6580 TokenType type = _currentToken.type;
6581
6582 if (type == TokenType.OPEN_PAREN || type == TokenType.IDENTIFIER) {
6583 FormalParameterList parameters;
6584 if (type == TokenType.OPEN_PAREN) {
6585 parameters = _parseFormalParameterListUnchecked();
Lasse Reichstein Nielsen 2016/10/20 19:36:44 Using the old formal-parameter list, so a single i
floitsch 2016/10/21 12:24:34 Right. I wanted to see how hard it would be to ch
6586 } else {
6587 var parameter = parseNormalFormalParameter();
6588 parameters = new FormalParameterList(
6589 _createSyntheticToken(TokenType.OPEN_PAREN),
6590 [parameter], null, null,
6591 _createSyntheticToken(TokenType.CLOSE_PAREN));
6592 }
6593 _validateFormalParameterList(parameters);
6594
6595 _expect(TokenType.MINUS);
6596 _expect(TokenType.GT);
6597
6598 TypeName returnType = parseReturnType();
6599
6600 Token semicolon = _expect(TokenType.SEMICOLON);
6601 return new FunctionTypeAlias(
6602 commentAndMetadata.comment,
6603 commentAndMetadata.metadata,
6604 keyword,
6605 returnType,
6606 name,
6607 typeParameters,
6608 parameters,
6609 semicolon);
6610 } else {
6611 _reportErrorForCurrentToken(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS);
6612 // Recovery: At the very least we should skip to the start of the next
6613 // valid compilation unit member, allowing for the possibility of finding
6614 // the typedef parameters before that point.
6615 return new FunctionTypeAlias(
6616 commentAndMetadata.comment,
6617 commentAndMetadata.metadata,
6618 keyword,
6619 null,
6620 name,
6621 typeParameters,
6622 new FormalParameterList(_createSyntheticToken(TokenType.OPEN_PAREN),
6623 null, null, null, _createSyntheticToken(TokenType.CLOSE_PAREN)),
6624 _createSyntheticToken(TokenType.SEMICOLON));
6625 }
6626 }
6627
6520 /** 6628 /**
6521 * Parse a function type alias. The [commentAndMetadata] is the metadata to be 6629 * Parse a function type alias. The [commentAndMetadata] is the metadata to be
6522 * associated with the member. The [keyword] is the token representing the 6630 * associated with the member. The [keyword] is the token representing the
6523 * 'typedef' keyword. Return the function type alias that was parsed. 6631 * 'typedef' keyword. Return the function type alias that was parsed.
6524 * 6632 *
6525 * functionTypeAlias ::= 6633 * functionTypeAlias ::=
6526 * functionPrefix typeParameterList? formalParameterList ';' 6634 * functionPrefix typeParameterList? formalParameterList ';'
6527 * 6635 *
6528 * functionPrefix ::= 6636 * functionPrefix ::=
6529 * returnType? name 6637 * returnType? name
(...skipping 694 matching lines...) Expand 10 before | Expand all | Expand 10 after
7224 } 7332 }
7225 _errorListener.onError(error); 7333 _errorListener.onError(error);
7226 } 7334 }
7227 7335
7228 /** 7336 /**
7229 * Report an error with the given [errorCode] and [arguments] associated with 7337 * Report an error with the given [errorCode] and [arguments] associated with
7230 * the current token. 7338 * the current token.
7231 */ 7339 */
7232 void _reportErrorForCurrentToken(ParserErrorCode errorCode, 7340 void _reportErrorForCurrentToken(ParserErrorCode errorCode,
7233 [List<Object> arguments]) { 7341 [List<Object> arguments]) {
7342 print("error ${StackTrace.current}");
7234 _reportErrorForToken(errorCode, _currentToken, arguments); 7343 _reportErrorForToken(errorCode, _currentToken, arguments);
7235 } 7344 }
7236 7345
7237 /** 7346 /**
7238 * Report an error with the given [errorCode] and [arguments] associated with 7347 * Report an error with the given [errorCode] and [arguments] associated with
7239 * the given [node]. 7348 * the given [node].
7240 */ 7349 */
7241 void _reportErrorForNode(ParserErrorCode errorCode, AstNode node, 7350 void _reportErrorForNode(ParserErrorCode errorCode, AstNode node,
7242 [List<Object> arguments]) { 7351 [List<Object> arguments]) {
7243 _reportError(new AnalysisError( 7352 _reportError(new AnalysisError(
(...skipping 855 matching lines...) Expand 10 before | Expand all | Expand 10 after
8099 */ 8208 */
8100 Parser_SyntheticKeywordToken(Keyword keyword, int offset) 8209 Parser_SyntheticKeywordToken(Keyword keyword, int offset)
8101 : super(keyword, offset); 8210 : super(keyword, offset);
8102 8211
8103 @override 8212 @override
8104 int get length => 0; 8213 int get length => 0;
8105 8214
8106 @override 8215 @override
8107 Token copy() => new Parser_SyntheticKeywordToken(keyword, offset); 8216 Token copy() => new Parser_SyntheticKeywordToken(keyword, offset);
8108 } 8217 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/compiler.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698