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

Side by Side Diff: pkg/analyzer/test/generated/scanner_test.dart

Issue 1000913004: Fix line info for multi-line strings (issue 22794) (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « pkg/analyzer/lib/src/generated/scanner.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 engine.scanner_test; 5 library engine.scanner_test;
6 6
7 import 'package:analyzer/src/generated/error.dart'; 7 import 'package:analyzer/src/generated/error.dart';
8 import 'package:analyzer/src/generated/scanner.dart'; 8 import 'package:analyzer/src/generated/scanner.dart';
9 import 'package:analyzer/src/generated/source.dart'; 9 import 'package:analyzer/src/generated/source.dart';
10 import 'package:unittest/unittest.dart'; 10 import 'package:unittest/unittest.dart';
11 11
12 import '../reflective_tests.dart'; 12 import '../reflective_tests.dart';
13 import 'test_support.dart'; 13 import 'test_support.dart';
14 14
15 main() { 15 main() {
16 groupSep = ' | '; 16 groupSep = ' | ';
17 runReflectiveTests(CharSequenceReaderTest); 17 runReflectiveTests(CharSequenceReaderTest);
18 runReflectiveTests(KeywordStateTest); 18 runReflectiveTests(KeywordStateTest);
19 runReflectiveTests(ScannerTest); 19 runReflectiveTests(ScannerTest);
20 runReflectiveTests(TokenTypeTest); 20 runReflectiveTests(TokenTypeTest);
21 } 21 }
22 22
23 @reflectiveTest
24 class CharSequenceReaderTest {
25 void test_advance() {
26 CharSequenceReader reader = new CharSequenceReader("x");
27 expect(reader.advance(), 0x78);
28 expect(reader.advance(), -1);
29 expect(reader.advance(), -1);
30 }
31
32 void test_creation() {
33 expect(new CharSequenceReader("x"), isNotNull);
34 }
35
36 void test_getOffset() {
37 CharSequenceReader reader = new CharSequenceReader("x");
38 expect(reader.offset, -1);
39 reader.advance();
40 expect(reader.offset, 0);
41 reader.advance();
42 expect(reader.offset, 0);
43 }
44
45 void test_getString() {
46 CharSequenceReader reader = new CharSequenceReader("xyzzy");
47 reader.offset = 3;
48 expect(reader.getString(1, 0), "yzz");
49 expect(reader.getString(2, 1), "zzy");
50 }
51
52 void test_peek() {
53 CharSequenceReader reader = new CharSequenceReader("xy");
54 expect(reader.peek(), 0x78);
55 expect(reader.peek(), 0x78);
56 reader.advance();
57 expect(reader.peek(), 0x79);
58 expect(reader.peek(), 0x79);
59 reader.advance();
60 expect(reader.peek(), -1);
61 expect(reader.peek(), -1);
62 }
63
64 void test_setOffset() {
65 CharSequenceReader reader = new CharSequenceReader("xyz");
66 reader.offset = 2;
67 expect(reader.offset, 2);
68 }
69 }
70
71 class CharacterRangeReaderTest extends EngineTestCase { 23 class CharacterRangeReaderTest extends EngineTestCase {
72 void test_advance() { 24 void test_advance() {
73 CharSequenceReader baseReader = new CharSequenceReader("xyzzy"); 25 CharSequenceReader baseReader = new CharSequenceReader("xyzzy");
74 CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 4); 26 CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 4);
75 expect(reader.advance(), 0x79); 27 expect(reader.advance(), 0x79);
76 expect(reader.advance(), 0x80); 28 expect(reader.advance(), 0x80);
77 expect(reader.advance(), 0x80); 29 expect(reader.advance(), 0x80);
78 expect(reader.advance(), -1); 30 expect(reader.advance(), -1);
79 expect(reader.advance(), -1); 31 expect(reader.advance(), -1);
80 } 32 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 expect(reader.peek(), -1); 67 expect(reader.peek(), -1);
116 expect(reader.peek(), -1); 68 expect(reader.peek(), -1);
117 } 69 }
118 70
119 void test_setOffset() { 71 void test_setOffset() {
120 CharSequenceReader baseReader = new CharSequenceReader("xyzzy"); 72 CharSequenceReader baseReader = new CharSequenceReader("xyzzy");
121 CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 4); 73 CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 4);
122 reader.offset = 2; 74 reader.offset = 2;
123 expect(reader.offset, 2); 75 expect(reader.offset, 2);
124 } 76 }
77 }
78
79 @reflectiveTest
80 class CharSequenceReaderTest {
81 void test_advance() {
82 CharSequenceReader reader = new CharSequenceReader("x");
83 expect(reader.advance(), 0x78);
84 expect(reader.advance(), -1);
85 expect(reader.advance(), -1);
86 }
87
88 void test_creation() {
89 expect(new CharSequenceReader("x"), isNotNull);
90 }
91
92 void test_getOffset() {
93 CharSequenceReader reader = new CharSequenceReader("x");
94 expect(reader.offset, -1);
95 reader.advance();
96 expect(reader.offset, 0);
97 reader.advance();
98 expect(reader.offset, 0);
99 }
100
101 void test_getString() {
102 CharSequenceReader reader = new CharSequenceReader("xyzzy");
103 reader.offset = 3;
104 expect(reader.getString(1, 0), "yzz");
105 expect(reader.getString(2, 1), "zzy");
106 }
107
108 void test_peek() {
109 CharSequenceReader reader = new CharSequenceReader("xy");
110 expect(reader.peek(), 0x78);
111 expect(reader.peek(), 0x78);
112 reader.advance();
113 expect(reader.peek(), 0x79);
114 expect(reader.peek(), 0x79);
115 reader.advance();
116 expect(reader.peek(), -1);
117 expect(reader.peek(), -1);
118 }
119
120 void test_setOffset() {
121 CharSequenceReader reader = new CharSequenceReader("xyz");
122 reader.offset = 2;
123 expect(reader.offset, 2);
124 }
125 } 125 }
126 126
127 @reflectiveTest 127 @reflectiveTest
128 class KeywordStateTest { 128 class KeywordStateTest {
129 void test_KeywordState() { 129 void test_KeywordState() {
130 // 130 //
131 // Generate the test data to be scanned. 131 // Generate the test data to be scanned.
132 // 132 //
133 List<Keyword> keywords = Keyword.values; 133 List<Keyword> keywords = Keyword.values;
134 int keywordCount = keywords.length; 134 int keywordCount = keywords.length;
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 586
587 void test_lineInfo_multilineString() { 587 void test_lineInfo_multilineString() {
588 String source = "'''a\r\nbc\r\nd'''"; 588 String source = "'''a\r\nbc\r\nd'''";
589 _assertLineInfo(source, [ 589 _assertLineInfo(source, [
590 new ScannerTest_ExpectedLocation(0, 1, 1), 590 new ScannerTest_ExpectedLocation(0, 1, 1),
591 new ScannerTest_ExpectedLocation(7, 2, 2), 591 new ScannerTest_ExpectedLocation(7, 2, 2),
592 new ScannerTest_ExpectedLocation(source.length - 1, 3, 4) 592 new ScannerTest_ExpectedLocation(source.length - 1, 3, 4)
593 ]); 593 ]);
594 } 594 }
595 595
596 void test_lineInfo_multilineString_raw() {
597 String source = "var a = r'''\nblah\n''';\n\nfoo";
598 _assertLineInfo(source, [
599 new ScannerTest_ExpectedLocation(0, 1, 1),
600 new ScannerTest_ExpectedLocation(14, 2, 2),
601 new ScannerTest_ExpectedLocation(source.length - 2, 5, 2)
602 ]);
603 }
604
596 void test_lineInfo_simpleClass() { 605 void test_lineInfo_simpleClass() {
597 String source = 606 String source =
598 "class Test {\r\n String s = '...';\r\n int get x => s.MISSING_GET TER;\r\n}"; 607 "class Test {\r\n String s = '...';\r\n int get x => s.MISSING_GET TER;\r\n}";
599 _assertLineInfo(source, [ 608 _assertLineInfo(source, [
600 new ScannerTest_ExpectedLocation(0, 1, 1), 609 new ScannerTest_ExpectedLocation(0, 1, 1),
601 new ScannerTest_ExpectedLocation(source.indexOf("MISSING_GETTER"), 3, 20), 610 new ScannerTest_ExpectedLocation(source.indexOf("MISSING_GETTER"), 3, 20),
602 new ScannerTest_ExpectedLocation(source.length - 1, 4, 1) 611 new ScannerTest_ExpectedLocation(source.length - 1, 4, 1)
603 ]); 612 ]);
604 } 613 }
605 614
(...skipping 26 matching lines...) Expand all
632 } 641 }
633 642
634 void test_minus_eq() { 643 void test_minus_eq() {
635 _assertToken(TokenType.MINUS_EQ, "-="); 644 _assertToken(TokenType.MINUS_EQ, "-=");
636 } 645 }
637 646
638 void test_minus_minus() { 647 void test_minus_minus() {
639 _assertToken(TokenType.MINUS_MINUS, "--"); 648 _assertToken(TokenType.MINUS_MINUS, "--");
640 } 649 }
641 650
642 void test_openSquareBracket() {
643 _assertToken(TokenType.OPEN_SQUARE_BRACKET, "[");
644 }
645
646 void test_open_curly_bracket() { 651 void test_open_curly_bracket() {
647 _assertToken(TokenType.OPEN_CURLY_BRACKET, "{"); 652 _assertToken(TokenType.OPEN_CURLY_BRACKET, "{");
648 } 653 }
649 654
650 void test_open_paren() { 655 void test_open_paren() {
651 _assertToken(TokenType.OPEN_PAREN, "("); 656 _assertToken(TokenType.OPEN_PAREN, "(");
652 } 657 }
653 658
654 void test_open_square_bracket() { 659 void test_open_square_bracket() {
655 _assertToken(TokenType.OPEN_SQUARE_BRACKET, "["); 660 _assertToken(TokenType.OPEN_SQUARE_BRACKET, "[");
656 } 661 }
657 662
663 void test_openSquareBracket() {
664 _assertToken(TokenType.OPEN_SQUARE_BRACKET, "[");
665 }
666
658 void test_percent() { 667 void test_percent() {
659 _assertToken(TokenType.PERCENT, "%"); 668 _assertToken(TokenType.PERCENT, "%");
660 } 669 }
661 670
662 void test_percent_eq() { 671 void test_percent_eq() {
663 _assertToken(TokenType.PERCENT_EQ, "%="); 672 _assertToken(TokenType.PERCENT_EQ, "%=");
664 } 673 }
665 674
666 void test_period() { 675 void test_period() {
667 _assertToken(TokenType.PERIOD, "."); 676 _assertToken(TokenType.PERIOD, ".");
668 } 677 }
669 678
679 void test_period_period() {
680 _assertToken(TokenType.PERIOD_PERIOD, "..");
681 }
682
683 void test_period_period_period() {
684 _assertToken(TokenType.PERIOD_PERIOD_PERIOD, "...");
685 }
686
670 void test_periodAfterNumberNotIncluded_identifier() { 687 void test_periodAfterNumberNotIncluded_identifier() {
671 _assertTokens("42.isEven()", [ 688 _assertTokens("42.isEven()", [
672 new StringToken(TokenType.INT, "42", 0), 689 new StringToken(TokenType.INT, "42", 0),
673 new Token(TokenType.PERIOD, 2), 690 new Token(TokenType.PERIOD, 2),
674 new StringToken(TokenType.IDENTIFIER, "isEven", 3), 691 new StringToken(TokenType.IDENTIFIER, "isEven", 3),
675 new Token(TokenType.OPEN_PAREN, 9), 692 new Token(TokenType.OPEN_PAREN, 9),
676 new Token(TokenType.CLOSE_PAREN, 10) 693 new Token(TokenType.CLOSE_PAREN, 10)
677 ]); 694 ]);
678 } 695 }
679 696
680 void test_periodAfterNumberNotIncluded_period() { 697 void test_periodAfterNumberNotIncluded_period() {
681 _assertTokens("42..isEven()", [ 698 _assertTokens("42..isEven()", [
682 new StringToken(TokenType.INT, "42", 0), 699 new StringToken(TokenType.INT, "42", 0),
683 new Token(TokenType.PERIOD_PERIOD, 2), 700 new Token(TokenType.PERIOD_PERIOD, 2),
684 new StringToken(TokenType.IDENTIFIER, "isEven", 4), 701 new StringToken(TokenType.IDENTIFIER, "isEven", 4),
685 new Token(TokenType.OPEN_PAREN, 10), 702 new Token(TokenType.OPEN_PAREN, 10),
686 new Token(TokenType.CLOSE_PAREN, 11) 703 new Token(TokenType.CLOSE_PAREN, 11)
687 ]); 704 ]);
688 } 705 }
689 706
690 void test_period_period() {
691 _assertToken(TokenType.PERIOD_PERIOD, "..");
692 }
693
694 void test_period_period_period() {
695 _assertToken(TokenType.PERIOD_PERIOD_PERIOD, "...");
696 }
697
698 void test_plus() { 707 void test_plus() {
699 _assertToken(TokenType.PLUS, "+"); 708 _assertToken(TokenType.PLUS, "+");
700 } 709 }
701 710
702 void test_plus_eq() { 711 void test_plus_eq() {
703 _assertToken(TokenType.PLUS_EQ, "+="); 712 _assertToken(TokenType.PLUS_EQ, "+=");
704 } 713 }
705 714
706 void test_plus_plus() { 715 void test_plus_plus() {
707 _assertToken(TokenType.PLUS_PLUS, "++"); 716 _assertToken(TokenType.PLUS_PLUS, "++");
708 } 717 }
709 718
710 void test_question() { 719 void test_question() {
711 _assertToken(TokenType.QUESTION, "?"); 720 _assertToken(TokenType.QUESTION, "?");
712 } 721 }
713 722
714 void test_scriptTag_withArgs() { 723 void test_scriptTag_withArgs() {
715 _assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart -debug"); 724 _assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart -debug");
716 } 725 }
717 726
727 void test_scriptTag_withoutSpace() {
728 _assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart");
729 }
730
718 void test_scriptTag_withSpace() { 731 void test_scriptTag_withSpace() {
719 _assertToken(TokenType.SCRIPT_TAG, "#! /bin/dart"); 732 _assertToken(TokenType.SCRIPT_TAG, "#! /bin/dart");
720 } 733 }
721 734
722 void test_scriptTag_withoutSpace() {
723 _assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart");
724 }
725
726 void test_semicolon() { 735 void test_semicolon() {
727 _assertToken(TokenType.SEMICOLON, ";"); 736 _assertToken(TokenType.SEMICOLON, ";");
728 } 737 }
729 738
730 void test_setSourceStart() { 739 void test_setSourceStart() {
731 int offsetDelta = 42; 740 int offsetDelta = 42;
732 GatheringErrorListener listener = new GatheringErrorListener(); 741 GatheringErrorListener listener = new GatheringErrorListener();
733 Scanner scanner = 742 Scanner scanner =
734 new Scanner(null, new SubSequenceReader("a", offsetDelta), listener); 743 new Scanner(null, new SubSequenceReader("a", offsetDelta), listener);
735 scanner.setSourceStart(3, 9); 744 scanner.setSourceStart(3, 9);
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
833 void test_string_raw_multi_double() { 842 void test_string_raw_multi_double() {
834 _assertToken(TokenType.STRING, "r\"\"\"line1\nline2\"\"\""); 843 _assertToken(TokenType.STRING, "r\"\"\"line1\nline2\"\"\"");
835 } 844 }
836 845
837 void test_string_raw_multi_single() { 846 void test_string_raw_multi_single() {
838 _assertToken(TokenType.STRING, "r'''string'''"); 847 _assertToken(TokenType.STRING, "r'''string'''");
839 } 848 }
840 849
841 void test_string_raw_multi_unterminated() { 850 void test_string_raw_multi_unterminated() {
842 String source = "r'''string"; 851 String source = "r'''string";
843 _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 852 _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9,
844 9, source, [new StringToken(TokenType.STRING, source, 0)]); 853 source, [new StringToken(TokenType.STRING, source, 0)]);
845 } 854 }
846 855
847 void test_string_raw_simple_double() { 856 void test_string_raw_simple_double() {
848 _assertToken(TokenType.STRING, "r\"string\""); 857 _assertToken(TokenType.STRING, "r\"string\"");
849 } 858 }
850 859
851 void test_string_raw_simple_single() { 860 void test_string_raw_simple_single() {
852 _assertToken(TokenType.STRING, "r'string'"); 861 _assertToken(TokenType.STRING, "r'string'");
853 } 862 }
854 863
855 void test_string_raw_simple_unterminated_eof() { 864 void test_string_raw_simple_unterminated_eof() {
856 String source = "r'string"; 865 String source = "r'string";
857 _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 866 _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7,
858 7, source, [new StringToken(TokenType.STRING, source, 0)]); 867 source, [new StringToken(TokenType.STRING, source, 0)]);
859 } 868 }
860 869
861 void test_string_raw_simple_unterminated_eol() { 870 void test_string_raw_simple_unterminated_eol() {
862 String source = "r'string"; 871 String source = "r'string";
863 _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 872 _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8,
864 8, "$source\n", [new StringToken(TokenType.STRING, source, 0)]); 873 "$source\n", [new StringToken(TokenType.STRING, source, 0)]);
865 } 874 }
866 875
867 void test_string_simple_double() { 876 void test_string_simple_double() {
868 _assertToken(TokenType.STRING, "\"string\""); 877 _assertToken(TokenType.STRING, "\"string\"");
869 } 878 }
870 879
871 void test_string_simple_escapedDollar() { 880 void test_string_simple_escapedDollar() {
872 _assertToken(TokenType.STRING, "'a\\\$b'"); 881 _assertToken(TokenType.STRING, "'a\\\$b'");
873 } 882 }
874 883
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
950 new StringToken(TokenType.STRING, "1'", 2) 959 new StringToken(TokenType.STRING, "1'", 2)
951 ]); 960 ]);
952 } 961 }
953 962
954 void test_string_simple_single() { 963 void test_string_simple_single() {
955 _assertToken(TokenType.STRING, "'string'"); 964 _assertToken(TokenType.STRING, "'string'");
956 } 965 }
957 966
958 void test_string_simple_unterminated_eof() { 967 void test_string_simple_unterminated_eof() {
959 String source = "'string"; 968 String source = "'string";
960 _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 969 _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6,
961 6, source, [new StringToken(TokenType.STRING, source, 0)]); 970 source, [new StringToken(TokenType.STRING, source, 0)]);
962 } 971 }
963 972
964 void test_string_simple_unterminated_eol() { 973 void test_string_simple_unterminated_eol() {
965 String source = "'string"; 974 String source = "'string";
966 _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 975 _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7,
967 7, "$source\r", [new StringToken(TokenType.STRING, source, 0)]); 976 "$source\r", [new StringToken(TokenType.STRING, source, 0)]);
968 } 977 }
969 978
970 void test_string_simple_unterminated_interpolation_block() { 979 void test_string_simple_unterminated_interpolation_block() {
971 _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6, 980 _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6,
972 "'\${name", [ 981 "'\${name", [
973 new StringToken(TokenType.STRING, "'", 0), 982 new StringToken(TokenType.STRING, "'", 0),
974 new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 1), 983 new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 1),
975 new StringToken(TokenType.IDENTIFIER, "name", 3), 984 new StringToken(TokenType.IDENTIFIER, "name", 3),
976 new StringToken(TokenType.STRING, "", 7) 985 new StringToken(TokenType.STRING, "", 7)
977 ]); 986 ]);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1037 * 1046 *
1038 * [expectedError] the error that should be produced 1047 * [expectedError] the error that should be produced
1039 * [expectedOffset] the string offset that should be associated with the error 1048 * [expectedOffset] the string offset that should be associated with the error
1040 * [source] the source to be scanned to produce the error 1049 * [source] the source to be scanned to produce the error
1041 */ 1050 */
1042 void _assertError( 1051 void _assertError(
1043 ScannerErrorCode expectedError, int expectedOffset, String source) { 1052 ScannerErrorCode expectedError, int expectedOffset, String source) {
1044 GatheringErrorListener listener = new GatheringErrorListener(); 1053 GatheringErrorListener listener = new GatheringErrorListener();
1045 _scanWithListener(source, listener); 1054 _scanWithListener(source, listener);
1046 listener.assertErrors([ 1055 listener.assertErrors([
1047 new AnalysisError.con2(null, expectedOffset, 1, expectedError, [ 1056 new AnalysisError.con2(null, expectedOffset, 1, expectedError,
1048 source.codeUnitAt(expectedOffset) 1057 [source.codeUnitAt(expectedOffset)])
1049 ])
1050 ]); 1058 ]);
1051 } 1059 }
1052 1060
1053 /** 1061 /**
1054 * Assert that scanning the given [source] produces an error with the given 1062 * Assert that scanning the given [source] produces an error with the given
1055 * code, and also produces the given tokens. 1063 * code, and also produces the given tokens.
1056 * 1064 *
1057 * [expectedError] the error that should be produced 1065 * [expectedError] the error that should be produced
1058 * [expectedOffset] the string offset that should be associated with the error 1066 * [expectedOffset] the string offset that should be associated with the error
1059 * [source] the source to be scanned to produce the error 1067 * [source] the source to be scanned to produce the error
1060 * [expectedTokens] the tokens that are expected to be in the source 1068 * [expectedTokens] the tokens that are expected to be in the source
1061 */ 1069 */
1062 void _assertErrorAndTokens(ScannerErrorCode expectedError, int expectedOffset, 1070 void _assertErrorAndTokens(ScannerErrorCode expectedError, int expectedOffset,
1063 String source, List<Token> expectedTokens) { 1071 String source, List<Token> expectedTokens) {
1064 GatheringErrorListener listener = new GatheringErrorListener(); 1072 GatheringErrorListener listener = new GatheringErrorListener();
1065 Token token = _scanWithListener(source, listener); 1073 Token token = _scanWithListener(source, listener);
1066 listener.assertErrors([ 1074 listener.assertErrors([
1067 new AnalysisError.con2(null, expectedOffset, 1, expectedError, [ 1075 new AnalysisError.con2(null, expectedOffset, 1, expectedError,
1068 source.codeUnitAt(expectedOffset) 1076 [source.codeUnitAt(expectedOffset)])
1069 ])
1070 ]); 1077 ]);
1071 _checkTokens(token, expectedTokens); 1078 _checkTokens(token, expectedTokens);
1072 } 1079 }
1073 1080
1074 /** 1081 /**
1075 * Assert that when scanned the given [source] contains a single keyword token 1082 * Assert that when scanned the given [source] contains a single keyword token
1076 * with the same lexeme as the original source. 1083 * with the same lexeme as the original source.
1077 */ 1084 */
1078 void _assertKeywordToken(String source) { 1085 void _assertKeywordToken(String source) {
1079 Token token = _scan(source); 1086 Token token = _scan(source);
(...skipping 17 matching lines...) Expand all
1097 expect(token.next.type, TokenType.EOF); 1104 expect(token.next.type, TokenType.EOF);
1098 } 1105 }
1099 1106
1100 void _assertLineInfo( 1107 void _assertLineInfo(
1101 String source, List<ScannerTest_ExpectedLocation> expectedLocations) { 1108 String source, List<ScannerTest_ExpectedLocation> expectedLocations) {
1102 GatheringErrorListener listener = new GatheringErrorListener(); 1109 GatheringErrorListener listener = new GatheringErrorListener();
1103 _scanWithListener(source, listener); 1110 _scanWithListener(source, listener);
1104 listener.assertNoErrors(); 1111 listener.assertNoErrors();
1105 LineInfo info = listener.getLineInfo(new TestSource()); 1112 LineInfo info = listener.getLineInfo(new TestSource());
1106 expect(info, isNotNull); 1113 expect(info, isNotNull);
1107 for (ScannerTest_ExpectedLocation expectedLocation in expectedLocations) { 1114 int count = expectedLocations.length;
1115 for (int i = 0; i < count; i++) {
1116 ScannerTest_ExpectedLocation expectedLocation = expectedLocations[i];
1108 LineInfo_Location location = info.getLocation(expectedLocation._offset); 1117 LineInfo_Location location = info.getLocation(expectedLocation._offset);
1109 expect(location.lineNumber, expectedLocation._lineNumber); 1118 expect(location.lineNumber, expectedLocation._lineNumber,
1110 expect(location.columnNumber, expectedLocation._columnNumber); 1119 reason: 'Line number in location $i');
1120 expect(location.columnNumber, expectedLocation._columnNumber,
1121 reason: 'Column number in location $i');
1111 } 1122 }
1112 } 1123 }
1113 1124
1114 /** 1125 /**
1115 * Assert that the token scanned from the given [source] has the 1126 * Assert that the token scanned from the given [source] has the
1116 * [expectedType]. 1127 * [expectedType].
1117 */ 1128 */
1118 Token _assertToken(TokenType expectedType, String source) { 1129 Token _assertToken(TokenType expectedType, String source) {
1119 Token originalToken = _scan(source); 1130 Token originalToken = _scan(source);
1120 expect(originalToken, isNotNull); 1131 expect(originalToken, isNotNull);
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
1344 expect(TokenType.LT_LT.isUserDefinableOperator, isTrue); 1355 expect(TokenType.LT_LT.isUserDefinableOperator, isTrue);
1345 expect(TokenType.MINUS.isUserDefinableOperator, isTrue); 1356 expect(TokenType.MINUS.isUserDefinableOperator, isTrue);
1346 expect(TokenType.PERCENT.isUserDefinableOperator, isTrue); 1357 expect(TokenType.PERCENT.isUserDefinableOperator, isTrue);
1347 expect(TokenType.PLUS.isUserDefinableOperator, isTrue); 1358 expect(TokenType.PLUS.isUserDefinableOperator, isTrue);
1348 expect(TokenType.SLASH.isUserDefinableOperator, isTrue); 1359 expect(TokenType.SLASH.isUserDefinableOperator, isTrue);
1349 expect(TokenType.STAR.isUserDefinableOperator, isTrue); 1360 expect(TokenType.STAR.isUserDefinableOperator, isTrue);
1350 expect(TokenType.TILDE.isUserDefinableOperator, isTrue); 1361 expect(TokenType.TILDE.isUserDefinableOperator, isTrue);
1351 expect(TokenType.TILDE_SLASH.isUserDefinableOperator, isTrue); 1362 expect(TokenType.TILDE_SLASH.isUserDefinableOperator, isTrue);
1352 } 1363 }
1353 } 1364 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/generated/scanner.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698