| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 import 'package:front_end/src/fasta/analyzer/token_utils.dart'; |
| 5 import 'package:front_end/src/fasta/scanner/error_token.dart' as fasta; | 6 import 'package:front_end/src/fasta/scanner/error_token.dart' as fasta; |
| 6 import 'package:front_end/src/fasta/scanner/keyword.dart' as fasta; | 7 import 'package:front_end/src/fasta/scanner/keyword.dart' as fasta; |
| 7 import 'package:front_end/src/fasta/scanner/string_scanner.dart' as fasta; | 8 import 'package:front_end/src/fasta/scanner/string_scanner.dart' as fasta; |
| 8 import 'package:front_end/src/fasta/scanner/token.dart' as fasta; | 9 import 'package:front_end/src/fasta/scanner/token.dart' as fasta; |
| 9 import 'package:front_end/src/fasta/scanner/token_constants.dart' as fasta; | 10 import 'package:front_end/src/fasta/scanner/token_constants.dart' as fasta; |
| 10 import 'package:front_end/src/scanner/errors.dart'; | 11 import 'package:front_end/src/scanner/errors.dart'; |
| 11 import 'package:front_end/src/scanner/token.dart'; | 12 import 'package:front_end/src/scanner/token.dart'; |
| 12 import 'package:test/test.dart'; | 13 import 'package:test/test.dart'; |
| 13 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 14 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| 14 | 15 |
| 15 import 'scanner_test.dart'; | 16 import 'scanner_test.dart'; |
| 16 | 17 |
| 17 main() { | 18 main() { |
| 18 defineReflectiveSuite(() { | 19 defineReflectiveSuite(() { |
| 19 defineReflectiveTests(ScannerTest_Fasta); | 20 defineReflectiveTests(ScannerTest_Fasta); |
| 20 }); | 21 }); |
| 21 } | 22 } |
| 22 | 23 |
| 23 @reflectiveTest | 24 @reflectiveTest |
| 24 class ScannerTest_Fasta extends ScannerTestBase { | 25 class ScannerTest_Fasta extends ScannerTestBase { |
| 25 final _keywordMap = { | |
| 26 "assert": Keyword.ASSERT, | |
| 27 "break": Keyword.BREAK, | |
| 28 "case": Keyword.CASE, | |
| 29 "catch": Keyword.CATCH, | |
| 30 "class": Keyword.CLASS, | |
| 31 "const": Keyword.CONST, | |
| 32 "continue": Keyword.CONTINUE, | |
| 33 "default": Keyword.DEFAULT, | |
| 34 "do": Keyword.DO, | |
| 35 "else": Keyword.ELSE, | |
| 36 "enum": Keyword.ENUM, | |
| 37 "extends": Keyword.EXTENDS, | |
| 38 "false": Keyword.FALSE, | |
| 39 "final": Keyword.FINAL, | |
| 40 "finally": Keyword.FINALLY, | |
| 41 "for": Keyword.FOR, | |
| 42 "if": Keyword.IF, | |
| 43 "in": Keyword.IN, | |
| 44 "new": Keyword.NEW, | |
| 45 "null": Keyword.NULL, | |
| 46 "rethrow": Keyword.RETHROW, | |
| 47 "return": Keyword.RETURN, | |
| 48 "super": Keyword.SUPER, | |
| 49 "switch": Keyword.SWITCH, | |
| 50 "this": Keyword.THIS, | |
| 51 "throw": Keyword.THROW, | |
| 52 "true": Keyword.TRUE, | |
| 53 "try": Keyword.TRY, | |
| 54 "var": Keyword.VAR, | |
| 55 "void": Keyword.VOID, | |
| 56 "while": Keyword.WHILE, | |
| 57 "with": Keyword.WITH, | |
| 58 "is": Keyword.IS, | |
| 59 "abstract": Keyword.ABSTRACT, | |
| 60 "as": Keyword.AS, | |
| 61 "covariant": Keyword.COVARIANT, | |
| 62 "dynamic": Keyword.DYNAMIC, | |
| 63 "export": Keyword.EXPORT, | |
| 64 "external": Keyword.EXTERNAL, | |
| 65 "factory": Keyword.FACTORY, | |
| 66 "get": Keyword.GET, | |
| 67 "implements": Keyword.IMPLEMENTS, | |
| 68 "import": Keyword.IMPORT, | |
| 69 "library": Keyword.LIBRARY, | |
| 70 "operator": Keyword.OPERATOR, | |
| 71 "part": Keyword.PART, | |
| 72 "set": Keyword.SET, | |
| 73 "static": Keyword.STATIC, | |
| 74 "typedef": Keyword.TYPEDEF, | |
| 75 "deferred": Keyword.DEFERRED, | |
| 76 }; | |
| 77 | |
| 78 @override | 26 @override |
| 79 Token scanWithListener(String source, ErrorListener listener, | 27 Token scanWithListener(String source, ErrorListener listener, |
| 80 {bool genericMethodComments: false, | 28 {bool genericMethodComments: false, |
| 81 bool lazyAssignmentOperators: false}) { | 29 bool lazyAssignmentOperators: false}) { |
| 82 if (genericMethodComments) { | 30 if (genericMethodComments) { |
| 83 // Fasta doesn't support generic method comments. | 31 // Fasta doesn't support generic method comments. |
| 84 // TODO(paulberry): once the analyzer toolchain no longer needs generic | 32 // TODO(paulberry): once the analyzer toolchain no longer needs generic |
| 85 // method comments, remove tests that exercise them. | 33 // method comments, remove tests that exercise them. |
| 86 fail('No generic method comment support in Fasta'); | 34 fail('No generic method comment support in Fasta'); |
| 87 } | 35 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 115 : TokenType.SINGLE_LINE_COMMENT; | 63 : TokenType.SINGLE_LINE_COMMENT; |
| 116 var translatedToken = | 64 var translatedToken = |
| 117 new CommentToken(type, token.value, token.charOffset); | 65 new CommentToken(type, token.value, token.charOffset); |
| 118 if (currentCommentHead == null) { | 66 if (currentCommentHead == null) { |
| 119 currentCommentHead = currentCommentTail = translatedToken; | 67 currentCommentHead = currentCommentTail = translatedToken; |
| 120 } else { | 68 } else { |
| 121 currentCommentTail.setNext(translatedToken); | 69 currentCommentTail.setNext(translatedToken); |
| 122 currentCommentTail = translatedToken; | 70 currentCommentTail = translatedToken; |
| 123 } | 71 } |
| 124 } else { | 72 } else { |
| 125 var translatedToken = _translateToken(token, currentCommentHead); | 73 var translatedToken = toAnalyzerToken(token, currentCommentHead); |
| 126 translatedToken.setNext(translatedToken); | 74 translatedToken.setNext(translatedToken); |
| 127 currentCommentHead = currentCommentTail = null; | 75 currentCommentHead = currentCommentTail = null; |
| 128 analyzerTokenTail.setNext(translatedToken); | 76 analyzerTokenTail.setNext(translatedToken); |
| 129 translatedToken.previous = analyzerTokenTail; | 77 translatedToken.previous = analyzerTokenTail; |
| 130 analyzerTokenTail = translatedToken; | 78 analyzerTokenTail = translatedToken; |
| 131 } | 79 } |
| 132 if (token.isEof) { | 80 if (token.isEof) { |
| 133 return analyzerTokenHead.next; | 81 return analyzerTokenHead.next; |
| 134 } | 82 } |
| 135 token = token.next; | 83 token = token.next; |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 case fasta.ErrorKind.NonAsciiIdentifier: | 270 case fasta.ErrorKind.NonAsciiIdentifier: |
| 323 case fasta.ErrorKind.NonAsciiWhitespace: | 271 case fasta.ErrorKind.NonAsciiWhitespace: |
| 324 return _makeError( | 272 return _makeError( |
| 325 ScannerErrorCode.ILLEGAL_CHARACTER, [token.character]); | 273 ScannerErrorCode.ILLEGAL_CHARACTER, [token.character]); |
| 326 case fasta.ErrorKind.UnexpectedDollarInString: | 274 case fasta.ErrorKind.UnexpectedDollarInString: |
| 327 return null; | 275 return null; |
| 328 default: | 276 default: |
| 329 throw new UnimplementedError('$errorCode'); | 277 throw new UnimplementedError('$errorCode'); |
| 330 } | 278 } |
| 331 } | 279 } |
| 332 | |
| 333 Keyword _translateKeyword(String syntax) => | |
| 334 _keywordMap[syntax] ?? (throw new UnimplementedError('$syntax')); | |
| 335 | |
| 336 Token _translateToken(fasta.Token token, CommentToken comment) { | |
| 337 var type = _translateTokenInfoKind(token.info.kind); | |
| 338 int offset = token.charOffset; | |
| 339 Token makeStringToken(String value) { | |
| 340 if (comment == null) { | |
| 341 return new StringToken(type, value, offset); | |
| 342 } else { | |
| 343 return new StringTokenWithComment(type, value, offset, comment); | |
| 344 } | |
| 345 } | |
| 346 | |
| 347 Token makeKeywordToken(Keyword keyword) { | |
| 348 if (comment == null) { | |
| 349 return new KeywordToken(keyword, offset); | |
| 350 } else { | |
| 351 return new KeywordTokenWithComment(keyword, offset, comment); | |
| 352 } | |
| 353 } | |
| 354 | |
| 355 Token makeBeginToken() { | |
| 356 if (comment == null) { | |
| 357 return new BeginToken(type, offset); | |
| 358 } else { | |
| 359 return new BeginTokenWithComment(type, offset, comment); | |
| 360 } | |
| 361 } | |
| 362 | |
| 363 if (token is fasta.StringToken) { | |
| 364 return makeStringToken(token.value); | |
| 365 } else if (token is fasta.KeywordToken) { | |
| 366 return makeKeywordToken(_translateKeyword(token.keyword.syntax)); | |
| 367 } else if (token is fasta.SymbolToken) { | |
| 368 if (token is fasta.BeginGroupToken) { | |
| 369 if (type == TokenType.LT) { | |
| 370 return makeStringToken(token.value); | |
| 371 } else { | |
| 372 return makeBeginToken(); | |
| 373 } | |
| 374 } else { | |
| 375 return makeStringToken(token.value); | |
| 376 } | |
| 377 } | |
| 378 throw new UnimplementedError('${token.runtimeType}'); | |
| 379 } | |
| 380 | |
| 381 TokenType _translateTokenInfoKind(int kind) { | |
| 382 switch (kind) { | |
| 383 case fasta.EOF_TOKEN: | |
| 384 return TokenType.EOF; | |
| 385 case fasta.KEYWORD_TOKEN: | |
| 386 return TokenType.KEYWORD; | |
| 387 case fasta.IDENTIFIER_TOKEN: | |
| 388 return TokenType.IDENTIFIER; | |
| 389 case fasta.BAD_INPUT_TOKEN: | |
| 390 return TokenType.STRING; | |
| 391 case fasta.DOUBLE_TOKEN: | |
| 392 return TokenType.DOUBLE; | |
| 393 case fasta.INT_TOKEN: | |
| 394 return TokenType.INT; | |
| 395 case fasta.HEXADECIMAL_TOKEN: | |
| 396 return TokenType.HEXADECIMAL; | |
| 397 case fasta.STRING_TOKEN: | |
| 398 return TokenType.STRING; | |
| 399 case fasta.AMPERSAND_TOKEN: | |
| 400 return TokenType.AMPERSAND; | |
| 401 case fasta.BACKPING_TOKEN: | |
| 402 return TokenType.BACKPING; | |
| 403 case fasta.BACKSLASH_TOKEN: | |
| 404 return TokenType.BACKSLASH; | |
| 405 case fasta.BANG_TOKEN: | |
| 406 return TokenType.BANG; | |
| 407 case fasta.BAR_TOKEN: | |
| 408 return TokenType.BAR; | |
| 409 case fasta.COLON_TOKEN: | |
| 410 return TokenType.COLON; | |
| 411 case fasta.COMMA_TOKEN: | |
| 412 return TokenType.COMMA; | |
| 413 case fasta.EQ_TOKEN: | |
| 414 return TokenType.EQ; | |
| 415 case fasta.GT_TOKEN: | |
| 416 return TokenType.GT; | |
| 417 case fasta.HASH_TOKEN: | |
| 418 return TokenType.HASH; | |
| 419 case fasta.OPEN_CURLY_BRACKET_TOKEN: | |
| 420 return TokenType.OPEN_CURLY_BRACKET; | |
| 421 case fasta.OPEN_SQUARE_BRACKET_TOKEN: | |
| 422 return TokenType.OPEN_SQUARE_BRACKET; | |
| 423 case fasta.OPEN_PAREN_TOKEN: | |
| 424 return TokenType.OPEN_PAREN; | |
| 425 case fasta.LT_TOKEN: | |
| 426 return TokenType.LT; | |
| 427 case fasta.MINUS_TOKEN: | |
| 428 return TokenType.MINUS; | |
| 429 case fasta.PERIOD_TOKEN: | |
| 430 return TokenType.PERIOD; | |
| 431 case fasta.PLUS_TOKEN: | |
| 432 return TokenType.PLUS; | |
| 433 case fasta.QUESTION_TOKEN: | |
| 434 return TokenType.QUESTION; | |
| 435 case fasta.AT_TOKEN: | |
| 436 return TokenType.AT; | |
| 437 case fasta.CLOSE_CURLY_BRACKET_TOKEN: | |
| 438 return TokenType.CLOSE_CURLY_BRACKET; | |
| 439 case fasta.CLOSE_SQUARE_BRACKET_TOKEN: | |
| 440 return TokenType.CLOSE_SQUARE_BRACKET; | |
| 441 case fasta.CLOSE_PAREN_TOKEN: | |
| 442 return TokenType.CLOSE_PAREN; | |
| 443 case fasta.SEMICOLON_TOKEN: | |
| 444 return TokenType.SEMICOLON; | |
| 445 case fasta.SLASH_TOKEN: | |
| 446 return TokenType.SLASH; | |
| 447 case fasta.TILDE_TOKEN: | |
| 448 return TokenType.TILDE; | |
| 449 case fasta.STAR_TOKEN: | |
| 450 return TokenType.STAR; | |
| 451 case fasta.PERCENT_TOKEN: | |
| 452 return TokenType.PERCENT; | |
| 453 case fasta.CARET_TOKEN: | |
| 454 return TokenType.CARET; | |
| 455 case fasta.STRING_INTERPOLATION_TOKEN: | |
| 456 return TokenType.STRING_INTERPOLATION_EXPRESSION; | |
| 457 case fasta.LT_EQ_TOKEN: | |
| 458 return TokenType.LT_EQ; | |
| 459 case fasta.FUNCTION_TOKEN: | |
| 460 return TokenType.FUNCTION; | |
| 461 case fasta.SLASH_EQ_TOKEN: | |
| 462 return TokenType.SLASH_EQ; | |
| 463 case fasta.PERIOD_PERIOD_PERIOD_TOKEN: | |
| 464 return TokenType.PERIOD_PERIOD_PERIOD; | |
| 465 case fasta.PERIOD_PERIOD_TOKEN: | |
| 466 return TokenType.PERIOD_PERIOD; | |
| 467 case fasta.EQ_EQ_EQ_TOKEN: | |
| 468 // TODO(paulberry,ahe): what is this? | |
| 469 throw new UnimplementedError(); | |
| 470 case fasta.EQ_EQ_TOKEN: | |
| 471 return TokenType.EQ_EQ; | |
| 472 case fasta.LT_LT_EQ_TOKEN: | |
| 473 return TokenType.LT_LT_EQ; | |
| 474 case fasta.LT_LT_TOKEN: | |
| 475 return TokenType.LT_LT; | |
| 476 case fasta.GT_EQ_TOKEN: | |
| 477 return TokenType.GT_EQ; | |
| 478 case fasta.GT_GT_EQ_TOKEN: | |
| 479 return TokenType.GT_GT_EQ; | |
| 480 case fasta.INDEX_EQ_TOKEN: | |
| 481 return TokenType.INDEX_EQ; | |
| 482 case fasta.INDEX_TOKEN: | |
| 483 return TokenType.INDEX; | |
| 484 case fasta.BANG_EQ_EQ_TOKEN: | |
| 485 // TODO(paulberry,ahe): what is this? | |
| 486 throw new UnimplementedError(); | |
| 487 case fasta.BANG_EQ_TOKEN: | |
| 488 return TokenType.BANG_EQ; | |
| 489 case fasta.AMPERSAND_AMPERSAND_TOKEN: | |
| 490 return TokenType.AMPERSAND_AMPERSAND; | |
| 491 case fasta.AMPERSAND_EQ_TOKEN: | |
| 492 return TokenType.AMPERSAND_EQ; | |
| 493 case fasta.BAR_BAR_TOKEN: | |
| 494 return TokenType.BAR_BAR; | |
| 495 case fasta.BAR_EQ_TOKEN: | |
| 496 return TokenType.BAR_EQ; | |
| 497 case fasta.STAR_EQ_TOKEN: | |
| 498 return TokenType.STAR_EQ; | |
| 499 case fasta.PLUS_PLUS_TOKEN: | |
| 500 return TokenType.PLUS_PLUS; | |
| 501 case fasta.PLUS_EQ_TOKEN: | |
| 502 return TokenType.PLUS_EQ; | |
| 503 case fasta.MINUS_MINUS_TOKEN: | |
| 504 return TokenType.MINUS_MINUS; | |
| 505 case fasta.MINUS_EQ_TOKEN: | |
| 506 return TokenType.MINUS_EQ; | |
| 507 case fasta.TILDE_SLASH_EQ_TOKEN: | |
| 508 return TokenType.TILDE_SLASH_EQ; | |
| 509 case fasta.TILDE_SLASH_TOKEN: | |
| 510 return TokenType.TILDE_SLASH; | |
| 511 case fasta.PERCENT_EQ_TOKEN: | |
| 512 return TokenType.PERCENT_EQ; | |
| 513 case fasta.GT_GT_TOKEN: | |
| 514 return TokenType.GT_GT; | |
| 515 case fasta.CARET_EQ_TOKEN: | |
| 516 return TokenType.CARET_EQ; | |
| 517 case fasta.STRING_INTERPOLATION_IDENTIFIER_TOKEN: | |
| 518 return TokenType.STRING_INTERPOLATION_IDENTIFIER; | |
| 519 case fasta.QUESTION_PERIOD_TOKEN: | |
| 520 return TokenType.QUESTION_PERIOD; | |
| 521 case fasta.QUESTION_QUESTION_TOKEN: | |
| 522 return TokenType.QUESTION_QUESTION; | |
| 523 case fasta.QUESTION_QUESTION_EQ_TOKEN: | |
| 524 return TokenType.QUESTION_QUESTION_EQ; | |
| 525 default: | |
| 526 throw new UnimplementedError('$kind'); | |
| 527 } | |
| 528 } | |
| 529 } | 280 } |
| OLD | NEW |