OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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/base/errors.dart'; | 5 import 'package:front_end/src/base/errors.dart'; |
6 import 'package:front_end/src/base/jenkins_smi_hash.dart'; | 6 import 'package:front_end/src/base/jenkins_smi_hash.dart'; |
7 import 'package:front_end/src/scanner/errors.dart'; | 7 import 'package:front_end/src/scanner/errors.dart'; |
8 import 'package:front_end/src/scanner/reader.dart'; | 8 import 'package:front_end/src/scanner/reader.dart'; |
9 import 'package:front_end/src/scanner/scanner.dart'; | 9 import 'package:front_end/src/scanner/scanner.dart'; |
10 import 'package:front_end/src/scanner/token.dart'; | 10 import 'package:front_end/src/scanner/token.dart'; |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 // Analyzer's token streams don't consider "<" to be an opener | 173 // Analyzer's token streams don't consider "<" to be an opener |
174 // but fasta does. | 174 // but fasta does. |
175 if (lessThan is BeginToken) { | 175 if (lessThan is BeginToken) { |
176 expect(lessThan.endToken, greaterThan); | 176 expect(lessThan.endToken, greaterThan); |
177 } | 177 } |
178 expect(greaterThan, isNot(new isInstanceOf<BeginToken>())); | 178 expect(greaterThan, isNot(new isInstanceOf<BeginToken>())); |
179 } | 179 } |
180 | 180 |
181 void test_async_star() { | 181 void test_async_star() { |
182 Token token = _scan("async*"); | 182 Token token = _scan("async*"); |
183 expect(token.type, TokenType.IDENTIFIER); | 183 expect(token.type, TokenType.KEYWORD); |
184 expect(token.lexeme, 'async'); | 184 expect(token.lexeme, 'async'); |
185 expect(token.next.type, TokenType.STAR); | 185 expect(token.next.type, TokenType.STAR); |
186 expect(token.next.next.type, TokenType.EOF); | 186 expect(token.next.next.type, TokenType.EOF); |
187 } | 187 } |
188 | 188 |
189 void test_at() { | 189 void test_at() { |
190 _assertToken(TokenType.AT, "@"); | 190 _assertToken(TokenType.AT, "@"); |
191 } | 191 } |
192 | 192 |
193 void test_backping() { | 193 void test_backping() { |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
464 | 464 |
465 void test_keyword_as() { | 465 void test_keyword_as() { |
466 _assertKeywordToken("as"); | 466 _assertKeywordToken("as"); |
467 } | 467 } |
468 | 468 |
469 void test_keyword_assert() { | 469 void test_keyword_assert() { |
470 _assertKeywordToken("assert"); | 470 _assertKeywordToken("assert"); |
471 } | 471 } |
472 | 472 |
473 void test_keyword_async() { | 473 void test_keyword_async() { |
474 _assertIdentifierToken("async"); | 474 _assertKeywordToken("async"); |
475 } | 475 } |
476 | 476 |
477 void test_keyword_await() { | 477 void test_keyword_await() { |
478 _assertIdentifierToken("await"); | 478 _assertKeywordToken("await"); |
479 } | 479 } |
480 | 480 |
481 void test_keyword_break() { | 481 void test_keyword_break() { |
482 _assertKeywordToken("break"); | 482 _assertKeywordToken("break"); |
483 } | 483 } |
484 | 484 |
485 void test_keyword_case() { | 485 void test_keyword_case() { |
486 _assertKeywordToken("case"); | 486 _assertKeywordToken("case"); |
487 } | 487 } |
488 | 488 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
552 | 552 |
553 void test_keyword_for() { | 553 void test_keyword_for() { |
554 _assertKeywordToken("for"); | 554 _assertKeywordToken("for"); |
555 } | 555 } |
556 | 556 |
557 void test_keyword_get() { | 557 void test_keyword_get() { |
558 _assertKeywordToken("get"); | 558 _assertKeywordToken("get"); |
559 } | 559 } |
560 | 560 |
561 void test_keyword_hide() { | 561 void test_keyword_hide() { |
562 _assertIdentifierToken("hide"); | 562 _assertKeywordToken("hide"); |
563 } | 563 } |
564 | 564 |
565 void test_keyword_if() { | 565 void test_keyword_if() { |
566 _assertKeywordToken("if"); | 566 _assertKeywordToken("if"); |
567 } | 567 } |
568 | 568 |
569 void test_keyword_implements() { | 569 void test_keyword_implements() { |
570 _assertKeywordToken("implements"); | 570 _assertKeywordToken("implements"); |
571 } | 571 } |
572 | 572 |
573 void test_keyword_import() { | 573 void test_keyword_import() { |
574 _assertKeywordToken("import"); | 574 _assertKeywordToken("import"); |
575 } | 575 } |
576 | 576 |
577 void test_keyword_in() { | 577 void test_keyword_in() { |
578 _assertKeywordToken("in"); | 578 _assertKeywordToken("in"); |
579 } | 579 } |
580 | 580 |
581 void test_keyword_is() { | 581 void test_keyword_is() { |
582 _assertKeywordToken("is"); | 582 _assertKeywordToken("is"); |
583 } | 583 } |
584 | 584 |
585 void test_keyword_library() { | 585 void test_keyword_library() { |
586 _assertKeywordToken("library"); | 586 _assertKeywordToken("library"); |
587 } | 587 } |
588 | 588 |
589 void test_keyword_native() { | 589 void test_keyword_native() { |
590 _assertIdentifierToken("native"); | 590 _assertKeywordToken("native"); |
591 } | 591 } |
592 | 592 |
593 void test_keyword_new() { | 593 void test_keyword_new() { |
594 _assertKeywordToken("new"); | 594 _assertKeywordToken("new"); |
595 } | 595 } |
596 | 596 |
597 void test_keyword_null() { | 597 void test_keyword_null() { |
598 _assertKeywordToken("null"); | 598 _assertKeywordToken("null"); |
599 } | 599 } |
600 | 600 |
601 void test_keyword_of() { | 601 void test_keyword_of() { |
602 _assertIdentifierToken("of"); | 602 _assertKeywordToken("of"); |
603 } | 603 } |
604 | 604 |
605 void test_keyword_on() { | 605 void test_keyword_on() { |
606 _assertIdentifierToken("on"); | 606 _assertKeywordToken("on"); |
607 } | 607 } |
608 | 608 |
609 void test_keyword_operator() { | 609 void test_keyword_operator() { |
610 _assertKeywordToken("operator"); | 610 _assertKeywordToken("operator"); |
611 } | 611 } |
612 | 612 |
613 void test_keyword_part() { | 613 void test_keyword_part() { |
614 _assertKeywordToken("part"); | 614 _assertKeywordToken("part"); |
615 } | 615 } |
616 | 616 |
617 void test_keyword_patch() { | 617 void test_keyword_patch() { |
618 _assertIdentifierToken("patch"); | 618 _assertKeywordToken("patch"); |
619 } | 619 } |
620 | 620 |
621 void test_keyword_rethrow() { | 621 void test_keyword_rethrow() { |
622 _assertKeywordToken("rethrow"); | 622 _assertKeywordToken("rethrow"); |
623 } | 623 } |
624 | 624 |
625 void test_keyword_return() { | 625 void test_keyword_return() { |
626 _assertKeywordToken("return"); | 626 _assertKeywordToken("return"); |
627 } | 627 } |
628 | 628 |
629 void test_keyword_set() { | 629 void test_keyword_set() { |
630 _assertKeywordToken("set"); | 630 _assertKeywordToken("set"); |
631 } | 631 } |
632 | 632 |
633 void test_keyword_show() { | 633 void test_keyword_show() { |
634 _assertIdentifierToken("show"); | 634 _assertKeywordToken("show"); |
635 } | 635 } |
636 | 636 |
637 void test_keyword_source() { | 637 void test_keyword_source() { |
638 _assertIdentifierToken("source"); | 638 _assertKeywordToken("source"); |
639 } | 639 } |
640 | 640 |
641 void test_keyword_static() { | 641 void test_keyword_static() { |
642 _assertKeywordToken("static"); | 642 _assertKeywordToken("static"); |
643 } | 643 } |
644 | 644 |
645 void test_keyword_super() { | 645 void test_keyword_super() { |
646 _assertKeywordToken("super"); | 646 _assertKeywordToken("super"); |
647 } | 647 } |
648 | 648 |
649 void test_keyword_switch() { | 649 void test_keyword_switch() { |
650 _assertKeywordToken("switch"); | 650 _assertKeywordToken("switch"); |
651 } | 651 } |
652 | 652 |
653 void test_keyword_sync() { | 653 void test_keyword_sync() { |
654 _assertIdentifierToken("sync"); | 654 _assertKeywordToken("sync"); |
655 } | 655 } |
656 | 656 |
657 void test_keyword_this() { | 657 void test_keyword_this() { |
658 _assertKeywordToken("this"); | 658 _assertKeywordToken("this"); |
659 } | 659 } |
660 | 660 |
661 void test_keyword_throw() { | 661 void test_keyword_throw() { |
662 _assertKeywordToken("throw"); | 662 _assertKeywordToken("throw"); |
663 } | 663 } |
664 | 664 |
(...skipping 19 matching lines...) Expand all Loading... |
684 | 684 |
685 void test_keyword_while() { | 685 void test_keyword_while() { |
686 _assertKeywordToken("while"); | 686 _assertKeywordToken("while"); |
687 } | 687 } |
688 | 688 |
689 void test_keyword_with() { | 689 void test_keyword_with() { |
690 _assertKeywordToken("with"); | 690 _assertKeywordToken("with"); |
691 } | 691 } |
692 | 692 |
693 void test_keyword_yield() { | 693 void test_keyword_yield() { |
694 _assertIdentifierToken("yield"); | 694 _assertKeywordToken("yield"); |
695 } | 695 } |
696 | 696 |
697 void test_lt() { | 697 void test_lt() { |
698 _assertToken(TokenType.LT, "<"); | 698 _assertToken(TokenType.LT, "<"); |
699 } | 699 } |
700 | 700 |
701 void test_lt_eq() { | 701 void test_lt_eq() { |
702 _assertToken(TokenType.LT_EQ, "<="); | 702 _assertToken(TokenType.LT_EQ, "<="); |
703 } | 703 } |
704 | 704 |
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1161 ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 5, "'\$name", [ | 1161 ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 5, "'\$name", [ |
1162 new StringToken(TokenType.STRING, "'", 0), | 1162 new StringToken(TokenType.STRING, "'", 0), |
1163 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1), | 1163 new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1), |
1164 new StringToken(TokenType.IDENTIFIER, "name", 2), | 1164 new StringToken(TokenType.IDENTIFIER, "name", 2), |
1165 new StringToken(TokenType.STRING, "", 6) | 1165 new StringToken(TokenType.STRING, "", 6) |
1166 ]); | 1166 ]); |
1167 } | 1167 } |
1168 | 1168 |
1169 void test_sync_star() { | 1169 void test_sync_star() { |
1170 Token token = _scan("sync*"); | 1170 Token token = _scan("sync*"); |
1171 expect(token.type, TokenType.IDENTIFIER); | 1171 expect(token.type, TokenType.KEYWORD); |
1172 expect(token.lexeme, 'sync'); | 1172 expect(token.lexeme, 'sync'); |
1173 expect(token.next.type, TokenType.STAR); | 1173 expect(token.next.type, TokenType.STAR); |
1174 expect(token.next.next.type, TokenType.EOF); | 1174 expect(token.next.next.type, TokenType.EOF); |
1175 } | 1175 } |
1176 | 1176 |
1177 void test_tilde() { | 1177 void test_tilde() { |
1178 _assertToken(TokenType.TILDE, "~"); | 1178 _assertToken(TokenType.TILDE, "~"); |
1179 } | 1179 } |
1180 | 1180 |
1181 void test_tilde_slash() { | 1181 void test_tilde_slash() { |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1257 */ | 1257 */ |
1258 void _assertErrorAndTokens(ScannerErrorCode expectedError, int expectedOffset, | 1258 void _assertErrorAndTokens(ScannerErrorCode expectedError, int expectedOffset, |
1259 String source, List<Token> expectedTokens) { | 1259 String source, List<Token> expectedTokens) { |
1260 ErrorListener listener = new ErrorListener(); | 1260 ErrorListener listener = new ErrorListener(); |
1261 Token token = scanWithListener(source, listener); | 1261 Token token = scanWithListener(source, listener); |
1262 listener.assertErrors([new TestError(expectedOffset, expectedError, null)]); | 1262 listener.assertErrors([new TestError(expectedOffset, expectedError, null)]); |
1263 _checkTokens(token, expectedTokens); | 1263 _checkTokens(token, expectedTokens); |
1264 } | 1264 } |
1265 | 1265 |
1266 /** | 1266 /** |
1267 * Assert that when scanned the given [source] contains a single identifier | |
1268 * token with the same lexeme as the original source. | |
1269 */ | |
1270 void _assertIdentifierToken(String source) { | |
1271 void check(String s, int expectedOffset) { | |
1272 Token token = _scan(s); | |
1273 expect(token, isNotNull); | |
1274 expect(token.type, TokenType.IDENTIFIER); | |
1275 expect(token.offset, expectedOffset); | |
1276 expect(token.length, source.length); | |
1277 expect(token.lexeme, source); | |
1278 expect(token.value(), source); | |
1279 expect(token.next.type, TokenType.EOF); | |
1280 } | |
1281 | |
1282 check(source, 0); | |
1283 check(' $source ', 1); | |
1284 } | |
1285 | |
1286 /** | |
1287 * Assert that when scanned the given [source] contains a single keyword token | 1267 * Assert that when scanned the given [source] contains a single keyword token |
1288 * with the same lexeme as the original source. | 1268 * with the same lexeme as the original source. |
1289 */ | 1269 */ |
1290 void _assertKeywordToken(String source) { | 1270 void _assertKeywordToken(String source) { |
1291 Token token = _scan(source); | 1271 Token token = _scan(source); |
1292 expect(token, isNotNull); | 1272 expect(token, isNotNull); |
1293 expect(token.type, TokenType.KEYWORD); | 1273 expect(token.type, TokenType.KEYWORD); |
1294 expect(token.offset, 0); | 1274 expect(token.offset, 0); |
1295 expect(token.length, source.length); | 1275 expect(token.length, source.length); |
1296 expect(token.lexeme, source); | 1276 expect(token.lexeme, source); |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1519 _TestScanner(CharacterReader reader, [this.listener]) : super.create(reader); | 1499 _TestScanner(CharacterReader reader, [this.listener]) : super.create(reader); |
1520 | 1500 |
1521 @override | 1501 @override |
1522 void reportError( | 1502 void reportError( |
1523 ScannerErrorCode errorCode, int offset, List<Object> arguments) { | 1503 ScannerErrorCode errorCode, int offset, List<Object> arguments) { |
1524 if (listener != null) { | 1504 if (listener != null) { |
1525 listener.errors.add(new TestError(offset, errorCode, arguments)); | 1505 listener.errors.add(new TestError(offset, errorCode, arguments)); |
1526 } | 1506 } |
1527 } | 1507 } |
1528 } | 1508 } |
OLD | NEW |