| 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 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 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 455 } else if (identical(value, '{')) { | 455 } else if (identical(value, '{')) { |
| 456 token = parseOptionalFormalParameters(token, true); | 456 token = parseOptionalFormalParameters(token, true); |
| 457 break; | 457 break; |
| 458 } | 458 } |
| 459 token = parseFormalParameter(token, FormalParameterType.REQUIRED); | 459 token = parseFormalParameter(token, FormalParameterType.REQUIRED); |
| 460 } while (optional(',', token)); | 460 } while (optional(',', token)); |
| 461 listener.endFormalParameters(parameterCount, begin, token); | 461 listener.endFormalParameters(parameterCount, begin, token); |
| 462 return expect(')', token); | 462 return expect(')', token); |
| 463 } | 463 } |
| 464 | 464 |
| 465 Token parseFormalParameter(Token token, FormalParameterType type) { | 465 Token parseFormalParameter(Token token, FormalParameterType kind) { |
| 466 token = parseMetadataStar(token, forParameter: true); | 466 token = parseMetadataStar(token, forParameter: true); |
| 467 listener.beginFormalParameter(token); | 467 listener.beginFormalParameter(token); |
| 468 | 468 |
| 469 // Skip over `covariant` token, if the next token is an identifier or | 469 // Skip over `covariant` token, if the next token is an identifier or |
| 470 // modifier. | 470 // modifier. |
| 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; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 495 token = parseTypeVariablesOpt(token); | 495 token = parseTypeVariablesOpt(token); |
| 496 token = parseFormalParameters(token); | 496 token = parseFormalParameters(token); |
| 497 listener.endFunctionTypedFormalParameter(token); | 497 listener.endFunctionTypedFormalParameter(token); |
| 498 } | 498 } |
| 499 String value = token.stringValue; | 499 String value = token.stringValue; |
| 500 if ((identical('=', value)) || (identical(':', value))) { | 500 if ((identical('=', value)) || (identical(':', value))) { |
| 501 // TODO(ahe): Validate that these are only used for optional parameters. | 501 // TODO(ahe): Validate that these are only used for optional parameters. |
| 502 Token equal = token; | 502 Token equal = token; |
| 503 token = parseExpression(token.next); | 503 token = parseExpression(token.next); |
| 504 listener.handleValuedFormalParameter(equal, token); | 504 listener.handleValuedFormalParameter(equal, token); |
| 505 if (type.isRequired) { | 505 if (kind.isRequired) { |
| 506 reportRecoverableError( | 506 reportRecoverableError( |
| 507 equal, ErrorKind.RequiredParameterWithDefault); | 507 equal, ErrorKind.RequiredParameterWithDefault); |
| 508 } else if (type.isPositional && identical(':', value)) { | 508 } else if (kind.isPositional && identical(':', value)) { |
| 509 reportRecoverableError( | 509 reportRecoverableError( |
| 510 equal, ErrorKind.PositionalParameterWithEquals); | 510 equal, ErrorKind.PositionalParameterWithEquals); |
| 511 } | 511 } |
| 512 } else { |
| 513 listener.handleFormalParameterWithoutValue(token); |
| 512 } | 514 } |
| 513 listener.endFormalParameter(thisKeyword); | 515 listener.endFormalParameter(thisKeyword, kind); |
| 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 Loading... |
| 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 } |
| OLD | NEW |