| OLD | NEW |
| 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 // This code was auto-generated, is not intended to be edited, and is subject to | 5 // This code was auto-generated, is not intended to be edited, and is subject to |
| 6 // significant change. Please see the README file for more information. | 6 // significant change. Please see the README file for more information. |
| 7 | 7 |
| 8 library engine.scanner_test; | 8 library engine.scanner_test; |
| 9 | 9 |
| 10 import 'package:analyzer/src/generated/error.dart'; | 10 import 'package:analyzer/src/generated/error.dart'; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 expect(reader.peek(), -1); | 66 expect(reader.peek(), -1); |
| 67 } | 67 } |
| 68 | 68 |
| 69 void test_setOffset() { | 69 void test_setOffset() { |
| 70 CharSequenceReader reader = new CharSequenceReader("xyz"); | 70 CharSequenceReader reader = new CharSequenceReader("xyz"); |
| 71 reader.offset = 2; | 71 reader.offset = 2; |
| 72 expect(reader.offset, 2); | 72 expect(reader.offset, 2); |
| 73 } | 73 } |
| 74 } | 74 } |
| 75 | 75 |
| 76 class CharacterRangeReaderTest extends EngineTestCase { |
| 77 void test_advance() { |
| 78 CharSequenceReader baseReader = new CharSequenceReader("xyzzy"); |
| 79 CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 4); |
| 80 expect(reader.advance(), 0x79); |
| 81 expect(reader.advance(), 0x80); |
| 82 expect(reader.advance(), 0x80); |
| 83 expect(reader.advance(), -1); |
| 84 expect(reader.advance(), -1); |
| 85 } |
| 86 |
| 87 void test_creation() { |
| 88 CharSequenceReader baseReader = new CharSequenceReader("xyzzy"); |
| 89 CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 4); |
| 90 expect(reader, isNotNull); |
| 91 } |
| 92 |
| 93 void test_getOffset() { |
| 94 CharSequenceReader baseReader = new CharSequenceReader("xyzzy"); |
| 95 CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 2); |
| 96 expect(reader.offset, 1); |
| 97 reader.advance(); |
| 98 expect(reader.offset, 2); |
| 99 reader.advance(); |
| 100 expect(reader.offset, 2); |
| 101 } |
| 102 |
| 103 void test_getString() { |
| 104 CharSequenceReader baseReader = new CharSequenceReader("__xyzzy__"); |
| 105 CharacterRangeReader reader = new CharacterRangeReader(baseReader, 2, 7); |
| 106 reader.offset = 5; |
| 107 expect(reader.getString(3, 0), "yzz"); |
| 108 expect(reader.getString(4, 1), "zzy"); |
| 109 } |
| 110 |
| 111 void test_peek() { |
| 112 CharSequenceReader baseReader = new CharSequenceReader("xyzzy"); |
| 113 CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 3); |
| 114 expect(reader.peek(), 0x79); |
| 115 expect(reader.peek(), 0x79); |
| 116 reader.advance(); |
| 117 expect(reader.peek(), 0x80); |
| 118 expect(reader.peek(), 0x80); |
| 119 reader.advance(); |
| 120 expect(reader.peek(), -1); |
| 121 expect(reader.peek(), -1); |
| 122 } |
| 123 |
| 124 void test_setOffset() { |
| 125 CharSequenceReader baseReader = new CharSequenceReader("xyzzy"); |
| 126 CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 4); |
| 127 reader.offset = 2; |
| 128 expect(reader.offset, 2); |
| 129 } |
| 130 } |
| 131 |
| 76 class IncrementalScannerTest extends EngineTestCase { | 132 class IncrementalScannerTest extends EngineTestCase { |
| 77 /** | 133 /** |
| 78 * The first token from the token stream resulting from parsing the original | 134 * The first token from the token stream resulting from parsing the original |
| 79 * source, or `null` if [scan] has not been invoked. | 135 * source, or `null` if [scan] has not been invoked. |
| 80 */ | 136 */ |
| 81 Token _originalTokens; | 137 Token _originalTokens; |
| 82 | 138 |
| 83 /** | 139 /** |
| 84 * The scanner used to perform incremental scanning, or `null` if [scan] has | 140 * The scanner used to perform incremental scanning, or `null` if [scan] has |
| 85 * not been invoked. | 141 * not been invoked. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 97 // that would force us to re-parse both classes, which is clearly | 153 // that would force us to re-parse both classes, which is clearly |
| 98 // sub-optimal. | 154 // sub-optimal. |
| 99 // | 155 // |
| 100 // "class B {}" | 156 // "class B {}" |
| 101 // "class A {} class B {}" | 157 // "class A {} class B {}" |
| 102 _scan("", "", "class A {} ", "class B {}"); | 158 _scan("", "", "class A {} ", "class B {}"); |
| 103 _assertTokens(-1, 4, ["class", "A", "{", "}", "class", "B", "{", "}"]); | 159 _assertTokens(-1, 4, ["class", "A", "{", "}", "class", "B", "{", "}"]); |
| 104 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 160 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 105 } | 161 } |
| 106 | 162 |
| 163 void fail_insert_comment_afterIdentifier() { |
| 164 // "a + b" |
| 165 // "a /* TODO */ + b" |
| 166 _scan("a", "", " /* TODO */", " + b"); |
| 167 _assertTokens(0, 1, ["a", "+", "b"]); |
| 168 _assertComments(1, ["/* TODO */"]); |
| 169 expect(_incrementalScanner.hasNonWhitespaceChange, isFalse); |
| 170 } |
| 171 |
| 172 void fail_insert_comment_beforeIdentifier() { |
| 173 // "a + b" |
| 174 // "a + /* TODO */ b" |
| 175 _scan("a + ", "", "/* TODO */ ", "b"); |
| 176 _assertTokens(1, 2, ["a", "+", "b"]); |
| 177 _assertComments(2, ["/* TODO */"]); |
| 178 expect(_incrementalScanner.hasNonWhitespaceChange, isFalse); |
| 179 } |
| 180 |
| 181 void fail_insert_inComment() { |
| 182 // "a /* TO */ b" |
| 183 // "a /* TODO */ b" |
| 184 _scan("a /* TO", "", "DO", " */ b"); |
| 185 _assertTokens(0, 1, ["a", "b"]); |
| 186 _assertComments(1, ["/* TODO */"]); |
| 187 expect(_incrementalScanner.hasNonWhitespaceChange, isFalse); |
| 188 } |
| 189 |
| 107 void test_delete_identifier_beginning() { | 190 void test_delete_identifier_beginning() { |
| 108 // "abs + b;" | 191 // "abs + b;" |
| 109 // "s + b;") | 192 // "s + b;" |
| 110 _scan("", "ab", "", "s + b;"); | 193 _scan("", "ab", "", "s + b;"); |
| 111 _assertTokens(-1, 1, ["s", "+", "b", ";"]); | 194 _assertTokens(-1, 1, ["s", "+", "b", ";"]); |
| 112 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 195 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 113 } | 196 } |
| 114 | 197 |
| 115 void test_delete_identifier_end() { | 198 void test_delete_identifier_end() { |
| 116 // "abs + b;" | 199 // "abs + b;" |
| 117 // "a + b;") | 200 // "a + b;" |
| 118 _scan("a", "bs", "", " + b;"); | 201 _scan("a", "bs", "", " + b;"); |
| 119 _assertTokens(-1, 1, ["a", "+", "b", ";"]); | 202 _assertTokens(-1, 1, ["a", "+", "b", ";"]); |
| 120 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 203 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 121 } | 204 } |
| 122 | 205 |
| 123 void test_delete_identifier_middle() { | 206 void test_delete_identifier_middle() { |
| 124 // "abs + b;" | 207 // "abs + b;" |
| 125 // "as + b;") | 208 // "as + b;" |
| 126 _scan("a", "b", "", "s + b;"); | 209 _scan("a", "b", "", "s + b;"); |
| 127 _assertTokens(-1, 1, ["as", "+", "b", ";"]); | 210 _assertTokens(-1, 1, ["as", "+", "b", ";"]); |
| 128 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 211 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 129 } | 212 } |
| 130 | 213 |
| 131 void test_delete_mergeTokens() { | 214 void test_delete_mergeTokens() { |
| 132 // "a + b + c;" | 215 // "a + b + c;" |
| 133 // "ac;") | 216 // "ac;" |
| 134 _scan("a", " + b + ", "", "c;"); | 217 _scan("a", " + b + ", "", "c;"); |
| 135 _assertTokens(-1, 1, ["ac", ";"]); | 218 _assertTokens(-1, 1, ["ac", ";"]); |
| 136 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 219 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 137 } | 220 } |
| 138 | 221 |
| 139 void test_delete_whitespace() { | 222 void test_delete_whitespace() { |
| 140 // "a + b + c;" | 223 // "a + b + c;" |
| 141 // "a+ b + c;") | 224 // "a+ b + c;" |
| 142 _scan("a", " ", "", "+ b + c;"); | 225 _scan("a", " ", "", "+ b + c;"); |
| 143 _assertTokens(1, 2, ["a", "+", "b", "+", "c", ";"]); | 226 _assertTokens(1, 2, ["a", "+", "b", "+", "c", ";"]); |
| 144 expect(_incrementalScanner.hasNonWhitespaceChange, isFalse); | 227 expect(_incrementalScanner.hasNonWhitespaceChange, isFalse); |
| 145 } | 228 } |
| 146 | 229 |
| 147 void test_insert_afterIdentifier_firstToken() { | 230 void test_insert_convertOneFunctionToTwo_noOverlap() { |
| 148 // "a + b;" | 231 // "f() {}" |
| 149 // "abs + b;" | 232 // "f() => 0; g() {}" |
| 150 _scan("a", "", "bs", " + b;"); | 233 _scan("f()", "", " => 0; g()", " {}"); |
| 151 _assertTokens(-1, 1, ["abs", "+", "b", ";"]); | 234 _assertTokens( |
| 152 _assertReplaced(1, "+"); | 235 2, |
| 236 9, |
| 237 ["f", "(", ")", "=>", "0", ";", "g", "(", ")", "{", "}"]); |
| 153 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 238 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 154 } | 239 } |
| 155 | 240 |
| 156 void test_insert_afterIdentifier_lastToken() { | 241 void test_insert_convertOneFunctionToTwo_overlap() { |
| 157 // "a + b" | 242 // "f() {}" |
| 158 // "a + bc") | 243 // "f() {} g() {}" |
| 159 _scan("a + b", "", "c", ""); | 244 _scan("f() {", "", "} g() {", "}"); |
| 160 _assertTokens(1, 3, ["a", "+", "bc"]); | 245 _assertTokens(4, 10, ["f", "(", ")", "{", "}", "g", "(", ")", "{", "}"]); |
| 161 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 246 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 162 } | 247 } |
| 163 | 248 |
| 164 void test_insert_afterIdentifier_middleToken() { | 249 void test_insert_end() { |
| 165 // "a + b;" | 250 // "class A {}" |
| 166 // "a + by;" | 251 // "class A {} class B {}" |
| 167 _scan("a + b", "", "y", ";"); | 252 _scan("class A {}", "", " class B {}", ""); |
| 168 _assertTokens(1, 3, ["a", "+", "by", ";"]); | 253 _assertTokens(3, 8, ["class", "A", "{", "}", "class", "B", "{", "}"]); |
| 169 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 254 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 170 } | 255 } |
| 171 | 256 |
| 172 void test_insert_beforeIdentifier() { | 257 void test_insert_identifierAndPeriod() { |
| 173 // "a + b;" | 258 // "a + b;" |
| 174 // "a + xb;") | 259 // "a + x.b;" |
| 175 _scan("a + ", "", "x", "b;"); | 260 _scan("a + ", "", "x.", "b;"); |
| 176 _assertTokens(1, 3, ["a", "+", "xb", ";"]); | 261 _assertTokens(1, 4, ["a", "+", "x", ".", "b", ";"]); |
| 177 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | |
| 178 } | 262 } |
| 179 | 263 |
| 180 void test_insert_beforeIdentifier_firstToken() { | 264 void test_insert_inIdentifier_left_firstToken() { |
| 181 // "a + b;" | 265 // "a + b;" |
| 182 // "xa + b;" | 266 // "xa + b;" |
| 183 _scan("", "", "x", "a + b;"); | 267 _scan("", "", "x", "a + b;"); |
| 184 _assertTokens(-1, 1, ["xa", "+", "b", ";"]); | 268 _assertTokens(-1, 1, ["xa", "+", "b", ";"]); |
| 185 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 269 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 186 } | 270 } |
| 187 | 271 |
| 188 void test_insert_convertOneFunctionToTwo() { | 272 void test_insert_inIdentifier_left_lastToken() { |
| 189 // "f() {}" | 273 // "a + b" |
| 190 // "f() => 0; g() {}" | 274 // "a + xb" |
| 191 _scan("f()", "", " => 0; g()", " {}"); | 275 _scan("a + ", "", "x", "b"); |
| 192 _assertTokens( | 276 _assertTokens(1, 3, ["a", "+", "xb"]); |
| 193 2, | |
| 194 9, | |
| 195 ["f", "(", ")", "=>", "0", ";", "g", "(", ")", "{", "}"]); | |
| 196 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 277 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 197 } | 278 } |
| 198 | 279 |
| 199 void test_insert_convertOneFunctionToTwo_overlap() { | 280 void test_insert_inIdentifier_left_middleToken() { |
| 200 // "f() {}" | 281 // "a + b;" |
| 201 // "f() {} g() {}" | 282 // "a + xb;" |
| 202 _scan("f() {", "", "} g() {", "}"); | 283 _scan("a + ", "", "x", "b;"); |
| 203 _assertTokens(4, 10, ["f", "(", ")", "{", "}", "g", "(", ")", "{", "}"]); | 284 _assertTokens(1, 3, ["a", "+", "xb", ";"]); |
| 204 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 285 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 205 } | 286 } |
| 206 | 287 |
| 207 void test_insert_end() { | 288 void test_insert_inIdentifier_middle() { |
| 208 // "class A {}" | 289 // "cat;" |
| 209 // "class A {} class B {}" | 290 // "cart;" |
| 210 _scan("class A {}", "", " class B {}", ""); | 291 _scan("ca", "", "r", "t;"); |
| 211 _assertTokens(3, 8, ["class", "A", "{", "}", "class", "B", "{", "}"]); | 292 _assertTokens(-1, 1, ["cart", ";"]); |
| 212 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 293 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 213 } | 294 } |
| 214 | 295 |
| 215 void test_insert_insideIdentifier() { | 296 void test_insert_inIdentifier_right_firstToken() { |
| 216 // "cob;" | 297 // "a + b;" |
| 217 // "cow.b;" | 298 // "abs + b;" |
| 218 _scan("co", "", "w.", "b;"); | 299 _scan("a", "", "bs", " + b;"); |
| 219 _assertTokens(-1, 3, ["cow", ".", "b", ";"]); | 300 _assertTokens(-1, 1, ["abs", "+", "b", ";"]); |
| 301 _assertReplaced(1, "+"); |
| 220 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 302 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 221 } | 303 } |
| 222 | 304 |
| 305 void test_insert_inIdentifier_right_lastToken() { |
| 306 // "a + b" |
| 307 // "a + bc" |
| 308 _scan("a + b", "", "c", ""); |
| 309 _assertTokens(1, 3, ["a", "+", "bc"]); |
| 310 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 311 } |
| 312 |
| 313 void test_insert_inIdentifier_right_middleToken() { |
| 314 // "a + b;" |
| 315 // "a + by;" |
| 316 _scan("a + b", "", "y", ";"); |
| 317 _assertTokens(1, 3, ["a", "+", "by", ";"]); |
| 318 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 319 } |
| 320 |
| 223 void test_insert_newIdentifier_noSpaceBefore() { | 321 void test_insert_newIdentifier_noSpaceBefore() { |
| 224 // "a; c;" | 322 // "a; c;" |
| 225 // "a;b c;" | 323 // "a;b c;" |
| 226 _scan("a;", "", "b", " c;"); | 324 _scan("a;", "", "b", " c;"); |
| 227 _assertTokens(1, 3, ["a", ";", "b", "c", ";"]); | 325 _assertTokens(1, 3, ["a", ";", "b", "c", ";"]); |
| 228 _assertReplaced(1, ";"); | 326 _assertReplaced(1, ";"); |
| 229 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 327 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 230 } | 328 } |
| 231 | 329 |
| 232 void test_insert_newIdentifier_spaceBefore() { | 330 void test_insert_newIdentifier_spaceBefore() { |
| 233 // "a; c;" | 331 // "a; c;" |
| 234 // "a; b c;" | 332 // "a; b c;" |
| 235 _scan("a; ", "", "b ", "c;"); | 333 _scan("a; ", "", "b ", "c;"); |
| 236 _assertTokens(1, 3, ["a", ";", "b", "c", ";"]); | 334 _assertTokens(1, 3, ["a", ";", "b", "c", ";"]); |
| 237 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 335 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 238 } | 336 } |
| 239 | 337 |
| 240 void test_insert_period() { | 338 void test_insert_periodAndIdentifier() { |
| 339 // "a + b;" |
| 340 // "a + b.x;" |
| 341 _scan("a + b", "", ".x", ";"); |
| 342 _assertTokens(2, 5, ["a", "+", "b", ".", "x", ";"]); |
| 343 } |
| 344 |
| 345 void test_insert_period_afterIdentifier() { |
| 241 // "a + b;" | 346 // "a + b;" |
| 242 // "a + b.;" | 347 // "a + b.;" |
| 243 _scan("a + b", "", ".", ";"); | 348 _scan("a + b", "", ".", ";"); |
| 244 _assertTokens(2, 4, ["a", "+", "b", ".", ";"]); | 349 _assertTokens(2, 4, ["a", "+", "b", ".", ";"]); |
| 245 } | 350 } |
| 246 | 351 |
| 247 void test_insert_period_betweenIdentifiers_left() { | 352 void test_insert_period_betweenIdentifiers_left() { |
| 248 // "a b;" | 353 // "a b;" |
| 249 // "a. b;" | 354 // "a. b;" |
| 250 _scan("a", "", ".", " b;"); | 355 _scan("a", "", ".", " b;"); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 268 } | 373 } |
| 269 | 374 |
| 270 void test_insert_period_insideExistingIdentifier() { | 375 void test_insert_period_insideExistingIdentifier() { |
| 271 // "ab;" | 376 // "ab;" |
| 272 // "a.b;" | 377 // "a.b;" |
| 273 _scan("a", "", ".", "b;"); | 378 _scan("a", "", ".", "b;"); |
| 274 _assertTokens(-1, 3, ["a", ".", "b", ";"]); | 379 _assertTokens(-1, 3, ["a", ".", "b", ";"]); |
| 275 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 380 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 276 } | 381 } |
| 277 | 382 |
| 278 void test_insert_periodAndIdentifier() { | 383 void test_insert_splitIdentifier() { |
| 279 // "a + b;" | 384 // "cob;" |
| 280 // "a + b.x;" | 385 // "cow.b;" |
| 281 _scan("a + b", "", ".x", ";"); | 386 _scan("co", "", "w.", "b;"); |
| 282 _assertTokens(2, 5, ["a", "+", "b", ".", "x", ";"]); | 387 _assertTokens(-1, 3, ["cow", ".", "b", ";"]); |
| 388 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 283 } | 389 } |
| 284 | 390 |
| 285 void test_insert_whitespace_beginning_beforeToken() { | 391 void test_insert_whitespace_beginning_beforeToken() { |
| 286 // "a + b;" | 392 // "a + b;" |
| 287 // " a + b;" | 393 // " a + b;" |
| 288 _scan("", "", " ", "a + b;"); | 394 _scan("", "", " ", "a + b;"); |
| 289 _assertTokens(0, 1, ["a", "+", "b", ";"]); | 395 _assertTokens(0, 1, ["a", "+", "b", ";"]); |
| 290 expect(_incrementalScanner.hasNonWhitespaceChange, isFalse); | 396 expect(_incrementalScanner.hasNonWhitespaceChange, isFalse); |
| 291 } | 397 } |
| 292 | 398 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 320 _scan(r''' | 426 _scan(r''' |
| 321 //comment | 427 //comment |
| 322 //comment2 | 428 //comment2 |
| 323 a''', "", " ", " + b;"); | 429 a''', "", " ", " + b;"); |
| 324 _assertTokens(1, 2, ["a", "+", "b", ";"]); | 430 _assertTokens(1, 2, ["a", "+", "b", ";"]); |
| 325 expect(_incrementalScanner.hasNonWhitespaceChange, isFalse); | 431 expect(_incrementalScanner.hasNonWhitespaceChange, isFalse); |
| 326 } | 432 } |
| 327 | 433 |
| 328 void test_replace_identifier_beginning() { | 434 void test_replace_identifier_beginning() { |
| 329 // "bell + b;" | 435 // "bell + b;" |
| 330 // "fell + b;") | 436 // "fell + b;" |
| 331 _scan("", "b", "f", "ell + b;"); | 437 _scan("", "b", "f", "ell + b;"); |
| 332 _assertTokens(-1, 1, ["fell", "+", "b", ";"]); | 438 _assertTokens(-1, 1, ["fell", "+", "b", ";"]); |
| 333 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 439 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 334 } | 440 } |
| 335 | 441 |
| 336 void test_replace_identifier_end() { | 442 void test_replace_identifier_end() { |
| 337 // "bell + b;" | 443 // "bell + b;" |
| 338 // "belt + b;") | 444 // "belt + b;" |
| 339 _scan("bel", "l", "t", " + b;"); | 445 _scan("bel", "l", "t", " + b;"); |
| 340 _assertTokens(-1, 1, ["belt", "+", "b", ";"]); | 446 _assertTokens(-1, 1, ["belt", "+", "b", ";"]); |
| 341 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 447 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 342 } | 448 } |
| 343 | 449 |
| 344 void test_replace_identifier_middle() { | 450 void test_replace_identifier_middle() { |
| 345 // "first + b;" | 451 // "first + b;" |
| 346 // "frost + b;") | 452 // "frost + b;" |
| 347 _scan("f", "ir", "ro", "st + b;"); | 453 _scan("f", "ir", "ro", "st + b;"); |
| 348 _assertTokens(-1, 1, ["frost", "+", "b", ";"]); | 454 _assertTokens(-1, 1, ["frost", "+", "b", ";"]); |
| 349 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 455 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 350 } | 456 } |
| 351 | 457 |
| 352 void test_replace_multiple_partialFirstAndLast() { | 458 void test_replace_multiple_partialFirstAndLast() { |
| 353 // "aa + bb;" | 459 // "aa + bb;" |
| 354 // "ab * ab;") | 460 // "ab * ab;" |
| 355 _scan("a", "a + b", "b * a", "b;"); | 461 _scan("a", "a + b", "b * a", "b;"); |
| 356 _assertTokens(-1, 3, ["ab", "*", "ab", ";"]); | 462 _assertTokens(-1, 3, ["ab", "*", "ab", ";"]); |
| 357 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 463 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 358 } | 464 } |
| 359 | 465 |
| 360 void test_replace_operator_oneForMany() { | 466 void test_replace_operator_oneForMany() { |
| 361 // "a + b;" | 467 // "a + b;" |
| 362 // "a * c - b;") | 468 // "a * c - b;" |
| 363 _scan("a ", "+", "* c -", " b;"); | 469 _scan("a ", "+", "* c -", " b;"); |
| 364 _assertTokens(0, 4, ["a", "*", "c", "-", "b", ";"]); | 470 _assertTokens(0, 4, ["a", "*", "c", "-", "b", ";"]); |
| 365 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 471 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 366 } | 472 } |
| 367 | 473 |
| 368 void test_replace_operator_oneForOne() { | 474 void test_replace_operator_oneForOne() { |
| 369 // "a + b;" | 475 // "a + b;" |
| 370 // "a * b;") | 476 // "a * b;" |
| 371 _scan("a ", "+", "*", " b;"); | 477 _scan("a ", "+", "*", " b;"); |
| 372 _assertTokens(0, 2, ["a", "*", "b", ";"]); | 478 _assertTokens(0, 2, ["a", "*", "b", ";"]); |
| 373 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); | 479 expect(_incrementalScanner.hasNonWhitespaceChange, isTrue); |
| 374 } | 480 } |
| 375 | 481 |
| 376 void test_tokenMap() { | 482 /** |
| 377 // "main() {a + b;}" | 483 * Assert that the comments associated with the token at the given [index] |
| 378 // "main() { a + b;}" | 484 * have lexemes that match the given list of lexemes, both in number and in |
| 379 _scan("main() {", "", " ", "a + b;}"); | 485 * content. |
| 380 TokenMap tokenMap = _incrementalScanner.tokenMap; | 486 */ |
| 381 Token oldToken = _originalTokens; | 487 void _assertComments(int index, List<String> lexemes) { |
| 382 while (oldToken.type != TokenType.EOF) { | 488 Token token = _incrementalTokens; |
| 383 Token newToken = tokenMap.get(oldToken); | 489 for (int i = 0; i < index; i++) { |
| 384 expect(newToken, isNot(same(oldToken))); | 490 token = token.next; |
| 385 expect(newToken.type, same(oldToken.type)); | |
| 386 expect(newToken.lexeme, oldToken.lexeme); | |
| 387 oldToken = oldToken.next; | |
| 388 } | 491 } |
| 389 expect(_incrementalScanner.hasNonWhitespaceChange, isFalse); | 492 Token comment = token.precedingComments; |
| 493 if (lexemes.isEmpty) { |
| 494 expect( |
| 495 comment, |
| 496 isNull, |
| 497 reason: "No comments expected but comments found"); |
| 498 } |
| 499 int count = 0; |
| 500 for (String lexeme in lexemes) { |
| 501 if (comment == null) { |
| 502 fail("Expected ${lexemes.length} comments but found $count"); |
| 503 } |
| 504 expect(comment.lexeme, lexeme); |
| 505 count++; |
| 506 comment = comment.next; |
| 507 } |
| 508 if (comment != null) { |
| 509 while (comment != null) { |
| 510 count++; |
| 511 comment = comment.next; |
| 512 } |
| 513 fail("Expected ${lexemes.length} comments but found $count"); |
| 514 } |
| 390 } | 515 } |
| 391 | 516 |
| 392 /** | 517 /** |
| 393 * Assert that the token at the given [offset] was replaced with a new token | 518 * Assert that the token at the given [offset] was replaced with a new token |
| 394 * having the given [lexeme]. | 519 * having the given [lexeme]. |
| 395 */ | 520 */ |
| 396 void _assertReplaced(int offset, String lexeme) { | 521 void _assertReplaced(int offset, String lexeme) { |
| 397 Token oldToken = _originalTokens; | 522 Token oldToken = _originalTokens; |
| 398 for (int i = 0; i < offset; i++) { | 523 for (int i = 0; i < offset; i++) { |
| 399 oldToken = oldToken.next; | 524 oldToken = oldToken.next; |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 515 expect(incrementalToken, isNotNull); | 640 expect(incrementalToken, isNotNull); |
| 516 while (incrementalToken.type != TokenType.EOF && | 641 while (incrementalToken.type != TokenType.EOF && |
| 517 modifiedTokens.type != TokenType.EOF) { | 642 modifiedTokens.type != TokenType.EOF) { |
| 518 expect( | 643 expect( |
| 519 incrementalToken.type, | 644 incrementalToken.type, |
| 520 same(modifiedTokens.type), | 645 same(modifiedTokens.type), |
| 521 reason: "Wrong type for token"); | 646 reason: "Wrong type for token"); |
| 522 expect( | 647 expect( |
| 523 incrementalToken.offset, | 648 incrementalToken.offset, |
| 524 modifiedTokens.offset, | 649 modifiedTokens.offset, |
| 525 reason: "Wrong offset for token"); | 650 reason: |
| 651 "Wrong offset for token (${incrementalToken.lexeme} != ${modifiedT
okens.lexeme})"); |
| 526 expect( | 652 expect( |
| 527 incrementalToken.length, | 653 incrementalToken.length, |
| 528 modifiedTokens.length, | 654 modifiedTokens.length, |
| 529 reason: "Wrong length for token"); | 655 reason: |
| 656 "Wrong length for token (${incrementalToken.lexeme} != ${modifiedT
okens.lexeme})"); |
| 530 expect( | 657 expect( |
| 531 incrementalToken.lexeme, | 658 incrementalToken.lexeme, |
| 532 modifiedTokens.lexeme, | 659 modifiedTokens.lexeme, |
| 533 reason: "Wrong lexeme for token"); | 660 reason: "Wrong lexeme for token"); |
| 534 incrementalToken = incrementalToken.next; | 661 incrementalToken = incrementalToken.next; |
| 535 modifiedTokens = modifiedTokens.next; | 662 modifiedTokens = modifiedTokens.next; |
| 536 } | 663 } |
| 537 expect( | 664 expect( |
| 538 incrementalToken.type, | 665 incrementalToken.type, |
| 539 same(TokenType.EOF), | 666 same(TokenType.EOF), |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 696 void test_comment_nested() { | 823 void test_comment_nested() { |
| 697 _assertComment( | 824 _assertComment( |
| 698 TokenType.MULTI_LINE_COMMENT, | 825 TokenType.MULTI_LINE_COMMENT, |
| 699 "/* comment /* within a */ comment */"); | 826 "/* comment /* within a */ comment */"); |
| 700 } | 827 } |
| 701 | 828 |
| 702 void test_comment_single() { | 829 void test_comment_single() { |
| 703 _assertComment(TokenType.SINGLE_LINE_COMMENT, "// comment"); | 830 _assertComment(TokenType.SINGLE_LINE_COMMENT, "// comment"); |
| 704 } | 831 } |
| 705 | 832 |
| 833 void test_double_both_E() { |
| 834 _assertToken(TokenType.DOUBLE, "0.123E4"); |
| 835 } |
| 836 |
| 706 void test_double_both_e() { | 837 void test_double_both_e() { |
| 707 _assertToken(TokenType.DOUBLE, "0.123e4"); | 838 _assertToken(TokenType.DOUBLE, "0.123e4"); |
| 708 } | 839 } |
| 709 | 840 |
| 710 void test_double_both_E() { | 841 void test_double_fraction() { |
| 711 _assertToken(TokenType.DOUBLE, "0.123E4"); | 842 _assertToken(TokenType.DOUBLE, ".123"); |
| 712 } | 843 } |
| 713 | 844 |
| 714 void test_double_fraction() { | 845 void test_double_fraction_E() { |
| 715 _assertToken(TokenType.DOUBLE, ".123"); | 846 _assertToken(TokenType.DOUBLE, ".123E4"); |
| 716 } | 847 } |
| 717 | 848 |
| 718 void test_double_fraction_e() { | 849 void test_double_fraction_e() { |
| 719 _assertToken(TokenType.DOUBLE, ".123e4"); | 850 _assertToken(TokenType.DOUBLE, ".123e4"); |
| 720 } | 851 } |
| 721 | 852 |
| 722 void test_double_fraction_E() { | 853 void test_double_missingDigitInExponent() { |
| 723 _assertToken(TokenType.DOUBLE, ".123E4"); | 854 _assertError(ScannerErrorCode.MISSING_DIGIT, 1, "1e"); |
| 724 } | 855 } |
| 725 | 856 |
| 726 void test_double_missingDigitInExponent() { | 857 void test_double_whole_E() { |
| 727 _assertError(ScannerErrorCode.MISSING_DIGIT, 1, "1e"); | 858 _assertToken(TokenType.DOUBLE, "12E4"); |
| 728 } | 859 } |
| 729 | 860 |
| 730 void test_double_whole_e() { | 861 void test_double_whole_e() { |
| 731 _assertToken(TokenType.DOUBLE, "12e4"); | 862 _assertToken(TokenType.DOUBLE, "12e4"); |
| 732 } | 863 } |
| 733 | 864 |
| 734 void test_double_whole_E() { | |
| 735 _assertToken(TokenType.DOUBLE, "12E4"); | |
| 736 } | |
| 737 | |
| 738 void test_eq() { | 865 void test_eq() { |
| 739 _assertToken(TokenType.EQ, "="); | 866 _assertToken(TokenType.EQ, "="); |
| 740 } | 867 } |
| 741 | 868 |
| 742 void test_eq_eq() { | 869 void test_eq_eq() { |
| 743 _assertToken(TokenType.EQ_EQ, "=="); | 870 _assertToken(TokenType.EQ_EQ, "=="); |
| 744 } | 871 } |
| 745 | 872 |
| 746 void test_gt() { | 873 void test_gt() { |
| 747 _assertToken(TokenType.GT, ">"); | 874 _assertToken(TokenType.GT, ">"); |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1060 } | 1187 } |
| 1061 | 1188 |
| 1062 void test_minus_eq() { | 1189 void test_minus_eq() { |
| 1063 _assertToken(TokenType.MINUS_EQ, "-="); | 1190 _assertToken(TokenType.MINUS_EQ, "-="); |
| 1064 } | 1191 } |
| 1065 | 1192 |
| 1066 void test_minus_minus() { | 1193 void test_minus_minus() { |
| 1067 _assertToken(TokenType.MINUS_MINUS, "--"); | 1194 _assertToken(TokenType.MINUS_MINUS, "--"); |
| 1068 } | 1195 } |
| 1069 | 1196 |
| 1197 void test_openSquareBracket() { |
| 1198 _assertToken(TokenType.OPEN_SQUARE_BRACKET, "["); |
| 1199 } |
| 1200 |
| 1070 void test_open_curly_bracket() { | 1201 void test_open_curly_bracket() { |
| 1071 _assertToken(TokenType.OPEN_CURLY_BRACKET, "{"); | 1202 _assertToken(TokenType.OPEN_CURLY_BRACKET, "{"); |
| 1072 } | 1203 } |
| 1073 | 1204 |
| 1074 void test_open_paren() { | 1205 void test_open_paren() { |
| 1075 _assertToken(TokenType.OPEN_PAREN, "("); | 1206 _assertToken(TokenType.OPEN_PAREN, "("); |
| 1076 } | 1207 } |
| 1077 | 1208 |
| 1078 void test_open_square_bracket() { | 1209 void test_open_square_bracket() { |
| 1079 _assertToken(TokenType.OPEN_SQUARE_BRACKET, "["); | 1210 _assertToken(TokenType.OPEN_SQUARE_BRACKET, "["); |
| 1080 } | 1211 } |
| 1081 | 1212 |
| 1082 void test_openSquareBracket() { | |
| 1083 _assertToken(TokenType.OPEN_SQUARE_BRACKET, "["); | |
| 1084 } | |
| 1085 | |
| 1086 void test_percent() { | 1213 void test_percent() { |
| 1087 _assertToken(TokenType.PERCENT, "%"); | 1214 _assertToken(TokenType.PERCENT, "%"); |
| 1088 } | 1215 } |
| 1089 | 1216 |
| 1090 void test_percent_eq() { | 1217 void test_percent_eq() { |
| 1091 _assertToken(TokenType.PERCENT_EQ, "%="); | 1218 _assertToken(TokenType.PERCENT_EQ, "%="); |
| 1092 } | 1219 } |
| 1093 | 1220 |
| 1094 void test_period() { | 1221 void test_period() { |
| 1095 _assertToken(TokenType.PERIOD, "."); | 1222 _assertToken(TokenType.PERIOD, "."); |
| 1096 } | 1223 } |
| 1097 | 1224 |
| 1098 void test_period_period() { | |
| 1099 _assertToken(TokenType.PERIOD_PERIOD, ".."); | |
| 1100 } | |
| 1101 | |
| 1102 void test_period_period_period() { | |
| 1103 _assertToken(TokenType.PERIOD_PERIOD_PERIOD, "..."); | |
| 1104 } | |
| 1105 | |
| 1106 void test_periodAfterNumberNotIncluded_identifier() { | 1225 void test_periodAfterNumberNotIncluded_identifier() { |
| 1107 _assertTokens( | 1226 _assertTokens( |
| 1108 "42.isEven()", | 1227 "42.isEven()", |
| 1109 [ | 1228 [ |
| 1110 new StringToken(TokenType.INT, "42", 0), | 1229 new StringToken(TokenType.INT, "42", 0), |
| 1111 new Token(TokenType.PERIOD, 2), | 1230 new Token(TokenType.PERIOD, 2), |
| 1112 new StringToken(TokenType.IDENTIFIER, "isEven", 3), | 1231 new StringToken(TokenType.IDENTIFIER, "isEven", 3), |
| 1113 new Token(TokenType.OPEN_PAREN, 9), | 1232 new Token(TokenType.OPEN_PAREN, 9), |
| 1114 new Token(TokenType.CLOSE_PAREN, 10)]); | 1233 new Token(TokenType.CLOSE_PAREN, 10)]); |
| 1115 } | 1234 } |
| 1116 | 1235 |
| 1117 void test_periodAfterNumberNotIncluded_period() { | 1236 void test_periodAfterNumberNotIncluded_period() { |
| 1118 _assertTokens( | 1237 _assertTokens( |
| 1119 "42..isEven()", | 1238 "42..isEven()", |
| 1120 [ | 1239 [ |
| 1121 new StringToken(TokenType.INT, "42", 0), | 1240 new StringToken(TokenType.INT, "42", 0), |
| 1122 new Token(TokenType.PERIOD_PERIOD, 2), | 1241 new Token(TokenType.PERIOD_PERIOD, 2), |
| 1123 new StringToken(TokenType.IDENTIFIER, "isEven", 4), | 1242 new StringToken(TokenType.IDENTIFIER, "isEven", 4), |
| 1124 new Token(TokenType.OPEN_PAREN, 10), | 1243 new Token(TokenType.OPEN_PAREN, 10), |
| 1125 new Token(TokenType.CLOSE_PAREN, 11)]); | 1244 new Token(TokenType.CLOSE_PAREN, 11)]); |
| 1126 } | 1245 } |
| 1127 | 1246 |
| 1247 void test_period_period() { |
| 1248 _assertToken(TokenType.PERIOD_PERIOD, ".."); |
| 1249 } |
| 1250 |
| 1251 void test_period_period_period() { |
| 1252 _assertToken(TokenType.PERIOD_PERIOD_PERIOD, "..."); |
| 1253 } |
| 1254 |
| 1128 void test_plus() { | 1255 void test_plus() { |
| 1129 _assertToken(TokenType.PLUS, "+"); | 1256 _assertToken(TokenType.PLUS, "+"); |
| 1130 } | 1257 } |
| 1131 | 1258 |
| 1132 void test_plus_eq() { | 1259 void test_plus_eq() { |
| 1133 _assertToken(TokenType.PLUS_EQ, "+="); | 1260 _assertToken(TokenType.PLUS_EQ, "+="); |
| 1134 } | 1261 } |
| 1135 | 1262 |
| 1136 void test_plus_plus() { | 1263 void test_plus_plus() { |
| 1137 _assertToken(TokenType.PLUS_PLUS, "++"); | 1264 _assertToken(TokenType.PLUS_PLUS, "++"); |
| 1138 } | 1265 } |
| 1139 | 1266 |
| 1140 void test_question() { | 1267 void test_question() { |
| 1141 _assertToken(TokenType.QUESTION, "?"); | 1268 _assertToken(TokenType.QUESTION, "?"); |
| 1142 } | 1269 } |
| 1143 | 1270 |
| 1144 void test_scriptTag_withArgs() { | 1271 void test_scriptTag_withArgs() { |
| 1145 _assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart -debug"); | 1272 _assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart -debug"); |
| 1146 } | 1273 } |
| 1147 | 1274 |
| 1275 void test_scriptTag_withSpace() { |
| 1276 _assertToken(TokenType.SCRIPT_TAG, "#! /bin/dart"); |
| 1277 } |
| 1278 |
| 1148 void test_scriptTag_withoutSpace() { | 1279 void test_scriptTag_withoutSpace() { |
| 1149 _assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart"); | 1280 _assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart"); |
| 1150 } | 1281 } |
| 1151 | 1282 |
| 1152 void test_scriptTag_withSpace() { | |
| 1153 _assertToken(TokenType.SCRIPT_TAG, "#! /bin/dart"); | |
| 1154 } | |
| 1155 | |
| 1156 void test_semicolon() { | 1283 void test_semicolon() { |
| 1157 _assertToken(TokenType.SEMICOLON, ";"); | 1284 _assertToken(TokenType.SEMICOLON, ";"); |
| 1158 } | 1285 } |
| 1159 | 1286 |
| 1160 void test_setSourceStart() { | 1287 void test_setSourceStart() { |
| 1161 int offsetDelta = 42; | 1288 int offsetDelta = 42; |
| 1162 GatheringErrorListener listener = new GatheringErrorListener(); | 1289 GatheringErrorListener listener = new GatheringErrorListener(); |
| 1163 Scanner scanner = | 1290 Scanner scanner = |
| 1164 new Scanner(null, new SubSequenceReader("a", offsetDelta), listener); | 1291 new Scanner(null, new SubSequenceReader("a", offsetDelta), listener); |
| 1165 scanner.setSourceStart(3, 9); | 1292 scanner.setSourceStart(3, 9); |
| (...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1827 expect(TokenType.LT_LT.isUserDefinableOperator, isTrue); | 1954 expect(TokenType.LT_LT.isUserDefinableOperator, isTrue); |
| 1828 expect(TokenType.MINUS.isUserDefinableOperator, isTrue); | 1955 expect(TokenType.MINUS.isUserDefinableOperator, isTrue); |
| 1829 expect(TokenType.PERCENT.isUserDefinableOperator, isTrue); | 1956 expect(TokenType.PERCENT.isUserDefinableOperator, isTrue); |
| 1830 expect(TokenType.PLUS.isUserDefinableOperator, isTrue); | 1957 expect(TokenType.PLUS.isUserDefinableOperator, isTrue); |
| 1831 expect(TokenType.SLASH.isUserDefinableOperator, isTrue); | 1958 expect(TokenType.SLASH.isUserDefinableOperator, isTrue); |
| 1832 expect(TokenType.STAR.isUserDefinableOperator, isTrue); | 1959 expect(TokenType.STAR.isUserDefinableOperator, isTrue); |
| 1833 expect(TokenType.TILDE.isUserDefinableOperator, isTrue); | 1960 expect(TokenType.TILDE.isUserDefinableOperator, isTrue); |
| 1834 expect(TokenType.TILDE_SLASH.isUserDefinableOperator, isTrue); | 1961 expect(TokenType.TILDE_SLASH.isUserDefinableOperator, isTrue); |
| 1835 } | 1962 } |
| 1836 } | 1963 } |
| OLD | NEW |