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

Side by Side Diff: pkg/front_end/lib/src/fasta/parser/parser.dart

Issue 2716433002: Add support for FieldFormalParameter. (Closed)
Patch Set: Created 3 years, 10 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
OLDNEW
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 library fasta.parser.parser; 5 library fasta.parser.parser;
6 6
7 import '../scanner.dart' show 7 import '../scanner.dart' show
8 ErrorToken; 8 ErrorToken;
9 9
10 import '../scanner/recover.dart' show 10 import '../scanner/recover.dart' show
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 // This enables the case where `covariant` is the name of the parameter: 471 // This enables the case where `covariant` is the name of the parameter:
472 // void foo(covariant); 472 // void foo(covariant);
473 if (identical(token.stringValue, 'covariant') && 473 if (identical(token.stringValue, 'covariant') &&
474 (token.next.isIdentifier() || isModifier(token.next))) { 474 (token.next.isIdentifier() || isModifier(token.next))) {
475 token = token.next; 475 token = token.next;
476 } 476 }
477 token = parseModifiers(token); 477 token = parseModifiers(token);
478 // TODO(ahe): Validate that there are formal parameters if void. 478 // TODO(ahe): Validate that there are formal parameters if void.
479 token = parseReturnTypeOpt(token); 479 token = parseReturnTypeOpt(token);
480 Token thisKeyword = null; 480 Token thisKeyword = null;
481 Token period = null;
481 if (optional('this', token)) { 482 if (optional('this', token)) {
482 thisKeyword = token; 483 thisKeyword = token;
484 period = token.next;
Paul Berry 2017/02/22 20:41:09 This seems problematic for error recovery. If the
scheglov 2017/02/23 06:43:50 This is the pattern that is used everywhere else i
ahe 2017/02/23 16:27:11 I agree that it is a problem for error recovery.
483 // TODO(ahe): Validate field initializers are only used in 485 // TODO(ahe): Validate field initializers are only used in
484 // constructors, and not for function-typed arguments. 486 // constructors, and not for function-typed arguments.
485 token = expect('.', token.next); 487 token = expect('.', period);
486 } 488 }
487 token = parseIdentifier(token); 489 token = parseIdentifier(token);
488 if (optional('(', token)) { 490 if (optional('(', token)) {
489 listener.beginFunctionTypedFormalParameter(token); 491 listener.beginFunctionTypedFormalParameter(token);
490 listener.handleNoTypeVariables(token); 492 listener.handleNoTypeVariables(token);
491 token = parseFormalParameters(token); 493 token = parseFormalParameters(token);
492 listener.endFunctionTypedFormalParameter(token); 494 listener.endFunctionTypedFormalParameter(token);
493 } else if (optional('<', token)) { 495 } else if (optional('<', token)) {
494 listener.beginFunctionTypedFormalParameter(token); 496 listener.beginFunctionTypedFormalParameter(token);
495 token = parseTypeVariablesOpt(token); 497 token = parseTypeVariablesOpt(token);
496 token = parseFormalParameters(token); 498 token = parseFormalParameters(token);
497 listener.endFunctionTypedFormalParameter(token); 499 listener.endFunctionTypedFormalParameter(token);
498 } 500 }
499 String value = token.stringValue; 501 String value = token.stringValue;
500 if ((identical('=', value)) || (identical(':', value))) { 502 if ((identical('=', value)) || (identical(':', value))) {
501 // TODO(ahe): Validate that these are only used for optional parameters. 503 // TODO(ahe): Validate that these are only used for optional parameters.
502 Token equal = token; 504 Token equal = token;
503 token = parseExpression(token.next); 505 token = parseExpression(token.next);
504 listener.handleValuedFormalParameter(equal, token); 506 listener.handleValuedFormalParameter(equal, token);
505 if (type.isRequired) { 507 if (type.isRequired) {
506 reportRecoverableError( 508 reportRecoverableError(
507 equal, ErrorKind.RequiredParameterWithDefault); 509 equal, ErrorKind.RequiredParameterWithDefault);
508 } else if (type.isPositional && identical(':', value)) { 510 } else if (type.isPositional && identical(':', value)) {
509 reportRecoverableError( 511 reportRecoverableError(
510 equal, ErrorKind.PositionalParameterWithEquals); 512 equal, ErrorKind.PositionalParameterWithEquals);
511 } 513 }
512 } 514 }
513 listener.endFormalParameter(thisKeyword); 515 listener.endFormalParameter(thisKeyword, period);
ahe 2017/02/23 16:27:11 This isn't necessary. The period can be found with
514 return token; 516 return token;
515 } 517 }
516 518
517 Token parseOptionalFormalParameters(Token token, bool isNamed) { 519 Token parseOptionalFormalParameters(Token token, bool isNamed) {
518 Token begin = token; 520 Token begin = token;
519 listener.beginOptionalFormalParameters(begin); 521 listener.beginOptionalFormalParameters(begin);
520 assert((isNamed && optional('{', token)) || optional('[', token)); 522 assert((isNamed && optional('{', token)) || optional('[', token));
521 int parameterCount = 0; 523 int parameterCount = 0;
522 do { 524 do {
523 token = token.next; 525 token = token.next;
(...skipping 2799 matching lines...) Expand 10 before | Expand all | Expand 10 after
3323 break; 3325 break;
3324 } 3326 }
3325 if (isRecoverable) { 3327 if (isRecoverable) {
3326 listener.handleRecoverableError(token, kind, arguments); 3328 listener.handleRecoverableError(token, kind, arguments);
3327 return null; 3329 return null;
3328 } else { 3330 } else {
3329 return listener.handleUnrecoverableError(token, kind, arguments); 3331 return listener.handleUnrecoverableError(token, kind, arguments);
3330 } 3332 }
3331 } 3333 }
3332 } 3334 }
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/parser/listener.dart ('k') | pkg/front_end/lib/src/fasta/source/outline_builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698