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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | pkg/compiler/lib/compiler.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/generated/parser.dart
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 7e913103634855449dd58c091f34a7a6a2990b6f..1fa0959b1eaed845565fa9e5a8d300e31990b500 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -3964,7 +3964,7 @@ class Parser {
* | fieldFormalParameter
* | simpleFormalParameter
*
- * functionSignature:
+ * legacyFunctionSignature:
* metadata returnType? identifier typeParameters? formalParameterList
*
* fieldFormalParameter ::=
@@ -4823,10 +4823,20 @@ class Parser {
* qualified withClause implementsClause? ';'
*
* functionTypeAlias ::=
+ * legacyFunctionTypeAlias |
+ * newFunctionTypeAlias
+ *
+ * legacyFunctionTypeAlias ::=
* functionPrefix typeParameterList? formalParameterList ';'
*
* functionPrefix ::=
* returnType? name
+ *
+ * newFunctionTypeAlias ::=
+ * identifier typeParameters? '=' functionType ';'
+ *
+ * functionType ::= typeParameterList? formalParameterList '-' '>' returnType
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.
+ *
*/
TypeAlias parseTypeAlias(CommentAndMetadata commentAndMetadata) {
Token keyword = getAndAdvance();
@@ -4835,6 +4845,18 @@ class Parser {
if (_tokenMatches(next, TokenType.LT)) {
next = _skipTypeParameterList(next);
if (next != null && _tokenMatches(next, TokenType.EQ)) {
+ next = next.next;
+ if (next != null &&
+ (_tokenMatches(next, TokenType.LT) ||
+ _tokenMatches(next, TokenType.OPEN_PAREN))) {
+ return _parseNewFunctionTypeAlias(commentAndMetadata, keyword);
+ }
+ if (next != null && _tokenMatches(next, TokenType.IDENTIFIER)) {
+ next = next.next;
+ if (next != null && _tokenMatches(next, TokenType.MINUS)) {
+ return _parseNewFunctionTypeAlias(commentAndMetadata, keyword);
+ }
+ }
TypeAlias typeAlias =
parseClassTypeAlias(commentAndMetadata, null, keyword);
_reportErrorForToken(
@@ -4842,6 +4864,17 @@ class Parser {
return typeAlias;
}
} else if (_tokenMatches(next, TokenType.EQ)) {
+ next = next.next;
+ if (next != null &&
+ (_tokenMatches(next, TokenType.LT) ||
+ _tokenMatches(next, TokenType.OPEN_PAREN))) {
+ return _parseNewFunctionTypeAlias(commentAndMetadata, keyword);
+ } else if (next != null && _tokenMatches(next, TokenType.IDENTIFIER)) {
+ next = next.next;
+ if (next != null && _tokenMatches(next, TokenType.MINUS)) {
+ return _parseNewFunctionTypeAlias(commentAndMetadata, keyword);
+ }
+ }
TypeAlias typeAlias =
parseClassTypeAlias(commentAndMetadata, null, keyword);
_reportErrorForToken(
@@ -5322,7 +5355,20 @@ class Parser {
* qualified typeArguments?
*/
Token skipTypeName(Token startToken) {
- Token token = skipPrefixedIdentifier(startToken);
+ Token token;
+ if (_tokenMatches(startToken, TokenType.LT)) {
+ token = skipTypeArgumentList(token);
+ if (token == null) return null;
+ token = _skipFormalParameterList(token);
+ if (token == null) return null;
+ if (!_tokenMatches(token, TokenType.MINUS)) return null;
+ token = token.next;
+ if (token == null) return null;
+ if (!_tokenMatches(token, TokenType.GT)) return null;
+ return skipTypeName(token);
+ }
+
+ token = skipPrefixedIdentifier(startToken);
if (token == null) {
return null;
}
@@ -6517,6 +6563,68 @@ class Parser {
return new FunctionDeclarationStatement(declaration);
}
+ FunctionTypeAlias _parseNewFunctionTypeAlias(CommentAndMetadata commentAndMetadata, Token keyword) {
+ SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
+ TypeParameterList typeParameters = null;
+ if (_matches(TokenType.LT)) {
+ typeParameters = parseTypeParameterList();
+ }
+
+ _expect(TokenType.EQ); // TODO(floitsch): store the sign in the node.
+
+ if (_matches(TokenType.LT)) {
+ parseTypeParameterList(); // TODO(floitsch): store the generic arguments.
+ }
+
+
+ TokenType type = _currentToken.type;
+
+ if (type == TokenType.OPEN_PAREN || type == TokenType.IDENTIFIER) {
+ FormalParameterList parameters;
+ if (type == TokenType.OPEN_PAREN) {
+ 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
+ } else {
+ var parameter = parseNormalFormalParameter();
+ parameters = new FormalParameterList(
+ _createSyntheticToken(TokenType.OPEN_PAREN),
+ [parameter], null, null,
+ _createSyntheticToken(TokenType.CLOSE_PAREN));
+ }
+ _validateFormalParameterList(parameters);
+
+ _expect(TokenType.MINUS);
+ _expect(TokenType.GT);
+
+ TypeName returnType = parseReturnType();
+
+ Token semicolon = _expect(TokenType.SEMICOLON);
+ return new FunctionTypeAlias(
+ commentAndMetadata.comment,
+ commentAndMetadata.metadata,
+ keyword,
+ returnType,
+ name,
+ typeParameters,
+ parameters,
+ semicolon);
+ } else {
+ _reportErrorForCurrentToken(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS);
+ // Recovery: At the very least we should skip to the start of the next
+ // valid compilation unit member, allowing for the possibility of finding
+ // the typedef parameters before that point.
+ return new FunctionTypeAlias(
+ commentAndMetadata.comment,
+ commentAndMetadata.metadata,
+ keyword,
+ null,
+ name,
+ typeParameters,
+ new FormalParameterList(_createSyntheticToken(TokenType.OPEN_PAREN),
+ null, null, null, _createSyntheticToken(TokenType.CLOSE_PAREN)),
+ _createSyntheticToken(TokenType.SEMICOLON));
+ }
+ }
+
/**
* Parse a function type alias. The [commentAndMetadata] is the metadata to be
* associated with the member. The [keyword] is the token representing the
@@ -7231,6 +7339,7 @@ class Parser {
*/
void _reportErrorForCurrentToken(ParserErrorCode errorCode,
[List<Object> arguments]) {
+ print("error ${StackTrace.current}");
_reportErrorForToken(errorCode, _currentToken, arguments);
}
« 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