| 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:analyzer/src/fasta/token_utils.dart'; | 5 import 'package:analyzer/src/fasta/token_utils.dart'; |
| 6 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; |
| 7 import 'package:front_end/src/fasta/scanner/string_scanner.dart' as fasta; | 7 import 'package:front_end/src/fasta/scanner/string_scanner.dart' as fasta; |
| 8 import 'package:front_end/src/fasta/scanner/token.dart' as fasta; | 8 import 'package:front_end/src/fasta/scanner/token.dart' as fasta; |
| 9 import 'package:front_end/src/fasta/scanner/token_constants.dart' as fasta; | 9 import 'package:front_end/src/fasta/scanner/token_constants.dart' as fasta; |
| 10 import 'package:front_end/src/scanner/errors.dart'; | 10 import 'package:front_end/src/scanner/errors.dart'; |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 return token; | 337 return token; |
| 338 } | 338 } |
| 339 } | 339 } |
| 340 | 340 |
| 341 /// Base class for scanner tests that examine the token stream in Fasta format. | 341 /// Base class for scanner tests that examine the token stream in Fasta format. |
| 342 abstract class ScannerTest_Fasta_Base { | 342 abstract class ScannerTest_Fasta_Base { |
| 343 Token scan(String source); | 343 Token scan(String source); |
| 344 | 344 |
| 345 void test_match_angle_brackets() { | 345 void test_match_angle_brackets() { |
| 346 var x = scan('x<y>'); | 346 var x = scan('x<y>'); |
| 347 var lessThan = x.next as fasta.BeginGroupToken; | 347 var lessThan = x.next as BeginToken; |
| 348 var y = lessThan.next; | 348 var y = lessThan.next; |
| 349 var greaterThan = y.next; | 349 var greaterThan = y.next; |
| 350 expect(greaterThan.next.isEof, isTrue); | 350 expect(greaterThan.next.isEof, isTrue); |
| 351 expect(lessThan.endGroup, same(greaterThan)); | 351 expect(lessThan.endGroup, same(greaterThan)); |
| 352 } | 352 } |
| 353 | 353 |
| 354 void test_match_angle_brackets_gt_gt() { | 354 void test_match_angle_brackets_gt_gt() { |
| 355 // When a ">>" appears in the token stream, Fasta's scanner matches it to | 355 // When a ">>" appears in the token stream, Fasta's scanner matches it to |
| 356 // the outer "<". The inner "<" is left unmatched. | 356 // the outer "<". The inner "<" is left unmatched. |
| 357 var x = scan('x<y<z>>'); | 357 var x = scan('x<y<z>>'); |
| 358 var lessThan1 = x.next as fasta.BeginGroupToken; | 358 var lessThan1 = x.next as BeginToken; |
| 359 var y = lessThan1.next; | 359 var y = lessThan1.next; |
| 360 var lessThan2 = y.next as fasta.BeginGroupToken; | 360 var lessThan2 = y.next as BeginToken; |
| 361 var z = lessThan2.next; | 361 var z = lessThan2.next; |
| 362 var greaterThans = z.next; | 362 var greaterThans = z.next; |
| 363 expect(greaterThans.next.isEof, isTrue); | 363 expect(greaterThans.next.isEof, isTrue); |
| 364 expect(lessThan1.endGroup, same(greaterThans)); | 364 expect(lessThan1.endGroup, same(greaterThans)); |
| 365 expect(lessThan2.endGroup, isNull); | 365 expect(lessThan2.endGroup, isNull); |
| 366 } | 366 } |
| 367 | 367 |
| 368 void test_match_angle_brackets_interrupted_by_close_brace() { | 368 void test_match_angle_brackets_interrupted_by_close_brace() { |
| 369 // A "}" appearing in the token stream interrupts matching of "<" and ">". | 369 // A "}" appearing in the token stream interrupts matching of "<" and ">". |
| 370 var openBrace = scan('{x<y}>z') as fasta.BeginGroupToken; | 370 var openBrace = scan('{x<y}>z') as BeginToken; |
| 371 var x = openBrace.next; | 371 var x = openBrace.next; |
| 372 var lessThan = x.next as fasta.BeginGroupToken; | 372 var lessThan = x.next as BeginToken; |
| 373 var y = lessThan.next; | 373 var y = lessThan.next; |
| 374 var closeBrace = y.next; | 374 var closeBrace = y.next; |
| 375 var greaterThan = closeBrace.next; | 375 var greaterThan = closeBrace.next; |
| 376 var z = greaterThan.next; | 376 var z = greaterThan.next; |
| 377 expect(z.next.isEof, isTrue); | 377 expect(z.next.isEof, isTrue); |
| 378 expect(openBrace.endGroup, same(closeBrace)); | 378 expect(openBrace.endGroup, same(closeBrace)); |
| 379 expect(lessThan.endGroup, isNull); | 379 expect(lessThan.endGroup, isNull); |
| 380 } | 380 } |
| 381 | 381 |
| 382 void test_match_angle_brackets_interrupted_by_close_bracket() { | 382 void test_match_angle_brackets_interrupted_by_close_bracket() { |
| 383 // A "]" appearing in the token stream interrupts matching of "<" and ">". | 383 // A "]" appearing in the token stream interrupts matching of "<" and ">". |
| 384 var openBracket = scan('[x<y]>z') as fasta.BeginGroupToken; | 384 var openBracket = scan('[x<y]>z') as BeginToken; |
| 385 var x = openBracket.next; | 385 var x = openBracket.next; |
| 386 var lessThan = x.next as fasta.BeginGroupToken; | 386 var lessThan = x.next as BeginToken; |
| 387 var y = lessThan.next; | 387 var y = lessThan.next; |
| 388 var closeBracket = y.next; | 388 var closeBracket = y.next; |
| 389 var greaterThan = closeBracket.next; | 389 var greaterThan = closeBracket.next; |
| 390 var z = greaterThan.next; | 390 var z = greaterThan.next; |
| 391 expect(z.next.isEof, isTrue); | 391 expect(z.next.isEof, isTrue); |
| 392 expect(openBracket.endGroup, same(closeBracket)); | 392 expect(openBracket.endGroup, same(closeBracket)); |
| 393 expect(lessThan.endGroup, isNull); | 393 expect(lessThan.endGroup, isNull); |
| 394 } | 394 } |
| 395 | 395 |
| 396 void test_match_angle_brackets_interrupted_by_close_paren() { | 396 void test_match_angle_brackets_interrupted_by_close_paren() { |
| 397 // A ")" appearing in the token stream interrupts matching of "<" and ">". | 397 // A ")" appearing in the token stream interrupts matching of "<" and ">". |
| 398 var openParen = scan('(x<y)>z') as fasta.BeginGroupToken; | 398 var openParen = scan('(x<y)>z') as BeginToken; |
| 399 var x = openParen.next; | 399 var x = openParen.next; |
| 400 var lessThan = x.next as fasta.BeginGroupToken; | 400 var lessThan = x.next as BeginToken; |
| 401 var y = lessThan.next; | 401 var y = lessThan.next; |
| 402 var closeParen = y.next; | 402 var closeParen = y.next; |
| 403 var greaterThan = closeParen.next; | 403 var greaterThan = closeParen.next; |
| 404 var z = greaterThan.next; | 404 var z = greaterThan.next; |
| 405 expect(z.next.isEof, isTrue); | 405 expect(z.next.isEof, isTrue); |
| 406 expect(openParen.endGroup, same(closeParen)); | 406 expect(openParen.endGroup, same(closeParen)); |
| 407 expect(lessThan.endGroup, isNull); | 407 expect(lessThan.endGroup, isNull); |
| 408 } | 408 } |
| 409 | 409 |
| 410 void test_match_angle_brackets_interrupted_by_interpolation_expr() { | 410 void test_match_angle_brackets_interrupted_by_interpolation_expr() { |
| 411 // A "${" appearing in the token stream interrupts matching of "<" and ">". | 411 // A "${" appearing in the token stream interrupts matching of "<" and ">". |
| 412 var x = scan(r'x<"${y>z}"'); | 412 var x = scan(r'x<"${y>z}"'); |
| 413 var lessThan = x.next as fasta.BeginGroupToken; | 413 var lessThan = x.next as BeginToken; |
| 414 var beginString = lessThan.next; | 414 var beginString = lessThan.next; |
| 415 var beginInterpolation = beginString.next as fasta.BeginGroupToken; | 415 var beginInterpolation = beginString.next as BeginToken; |
| 416 var y = beginInterpolation.next; | 416 var y = beginInterpolation.next; |
| 417 var greaterThan = y.next; | 417 var greaterThan = y.next; |
| 418 var z = greaterThan.next; | 418 var z = greaterThan.next; |
| 419 var endInterpolation = z.next; | 419 var endInterpolation = z.next; |
| 420 var endString = endInterpolation.next; | 420 var endString = endInterpolation.next; |
| 421 expect(endString.next.isEof, isTrue); | 421 expect(endString.next.isEof, isTrue); |
| 422 expect(lessThan.endGroup, isNull); | 422 expect(lessThan.endGroup, isNull); |
| 423 expect(beginInterpolation.endGroup, same(endInterpolation)); | 423 expect(beginInterpolation.endGroup, same(endInterpolation)); |
| 424 } | 424 } |
| 425 | 425 |
| 426 void test_match_angle_brackets_interrupted_by_open_brace() { | 426 void test_match_angle_brackets_interrupted_by_open_brace() { |
| 427 // A "{" appearing in the token stream interrupts matching of "<" and ">". | 427 // A "{" appearing in the token stream interrupts matching of "<" and ">". |
| 428 var x = scan('x<{y>z}'); | 428 var x = scan('x<{y>z}'); |
| 429 var lessThan = x.next as fasta.BeginGroupToken; | 429 var lessThan = x.next as BeginToken; |
| 430 var openBrace = lessThan.next as fasta.BeginGroupToken; | 430 var openBrace = lessThan.next as BeginToken; |
| 431 var y = openBrace.next; | 431 var y = openBrace.next; |
| 432 var greaterThan = y.next; | 432 var greaterThan = y.next; |
| 433 var z = greaterThan.next; | 433 var z = greaterThan.next; |
| 434 var closeBrace = z.next; | 434 var closeBrace = z.next; |
| 435 expect(closeBrace.next.isEof, isTrue); | 435 expect(closeBrace.next.isEof, isTrue); |
| 436 expect(lessThan.endGroup, isNull); | 436 expect(lessThan.endGroup, isNull); |
| 437 expect(openBrace.endGroup, same(closeBrace)); | 437 expect(openBrace.endGroup, same(closeBrace)); |
| 438 } | 438 } |
| 439 | 439 |
| 440 void test_match_angle_brackets_interrupted_by_open_bracket() { | 440 void test_match_angle_brackets_interrupted_by_open_bracket() { |
| 441 // A "[" appearing in the token stream interrupts matching of "<" and ">". | 441 // A "[" appearing in the token stream interrupts matching of "<" and ">". |
| 442 var x = scan('x<y[z>a]'); | 442 var x = scan('x<y[z>a]'); |
| 443 var lessThan = x.next as fasta.BeginGroupToken; | 443 var lessThan = x.next as BeginToken; |
| 444 var y = lessThan.next; | 444 var y = lessThan.next; |
| 445 var openBracket = y.next as fasta.BeginGroupToken; | 445 var openBracket = y.next as BeginToken; |
| 446 var z = openBracket.next; | 446 var z = openBracket.next; |
| 447 var greaterThan = z.next; | 447 var greaterThan = z.next; |
| 448 var a = greaterThan.next; | 448 var a = greaterThan.next; |
| 449 var closeBracket = a.next; | 449 var closeBracket = a.next; |
| 450 expect(closeBracket.next.isEof, isTrue); | 450 expect(closeBracket.next.isEof, isTrue); |
| 451 expect(lessThan.endGroup, isNull); | 451 expect(lessThan.endGroup, isNull); |
| 452 expect(openBracket.endGroup, same(closeBracket)); | 452 expect(openBracket.endGroup, same(closeBracket)); |
| 453 } | 453 } |
| 454 | 454 |
| 455 void test_match_angle_brackets_interrupted_by_open_paren() { | 455 void test_match_angle_brackets_interrupted_by_open_paren() { |
| 456 // A "(" appearing in the token stream interrupts matching of "<" and ">". | 456 // A "(" appearing in the token stream interrupts matching of "<" and ">". |
| 457 var x = scan('x<y(z>a)'); | 457 var x = scan('x<y(z>a)'); |
| 458 var lessThan = x.next as fasta.BeginGroupToken; | 458 var lessThan = x.next as BeginToken; |
| 459 var y = lessThan.next; | 459 var y = lessThan.next; |
| 460 var openParen = y.next as fasta.BeginGroupToken; | 460 var openParen = y.next as BeginToken; |
| 461 var z = openParen.next; | 461 var z = openParen.next; |
| 462 var greaterThan = z.next; | 462 var greaterThan = z.next; |
| 463 var a = greaterThan.next; | 463 var a = greaterThan.next; |
| 464 var closeParen = a.next; | 464 var closeParen = a.next; |
| 465 expect(closeParen.next.isEof, isTrue); | 465 expect(closeParen.next.isEof, isTrue); |
| 466 expect(lessThan.endGroup, isNull); | 466 expect(lessThan.endGroup, isNull); |
| 467 expect(openParen.endGroup, same(closeParen)); | 467 expect(openParen.endGroup, same(closeParen)); |
| 468 } | 468 } |
| 469 | 469 |
| 470 void test_match_angle_brackets_nested() { | 470 void test_match_angle_brackets_nested() { |
| 471 var x = scan('x<y<z>,a>'); | 471 var x = scan('x<y<z>,a>'); |
| 472 var lessThan1 = x.next as fasta.BeginGroupToken; | 472 var lessThan1 = x.next as BeginToken; |
| 473 var y = lessThan1.next; | 473 var y = lessThan1.next; |
| 474 var lessThan2 = y.next as fasta.BeginGroupToken; | 474 var lessThan2 = y.next as BeginToken; |
| 475 var z = lessThan2.next; | 475 var z = lessThan2.next; |
| 476 var greaterThan1 = z.next; | 476 var greaterThan1 = z.next; |
| 477 var comma = greaterThan1.next; | 477 var comma = greaterThan1.next; |
| 478 var a = comma.next; | 478 var a = comma.next; |
| 479 var greaterThan2 = a.next; | 479 var greaterThan2 = a.next; |
| 480 expect(greaterThan2.next.isEof, isTrue); | 480 expect(greaterThan2.next.isEof, isTrue); |
| 481 expect(lessThan1.endGroup, same(greaterThan2)); | 481 expect(lessThan1.endGroup, same(greaterThan2)); |
| 482 expect(lessThan2.endGroup, same(greaterThan1)); | 482 expect(lessThan2.endGroup, same(greaterThan1)); |
| 483 } | 483 } |
| 484 | 484 |
| 485 void test_match_angle_brackets_unmatched_gt_gt() { | 485 void test_match_angle_brackets_unmatched_gt_gt() { |
| 486 // When a ">>" appears in the token stream and there is no outer "<", | 486 // When a ">>" appears in the token stream and there is no outer "<", |
| 487 // Fasta's scanner leaves the inner "<" unmatched. | 487 // Fasta's scanner leaves the inner "<" unmatched. |
| 488 var x = scan('x<y>>z'); | 488 var x = scan('x<y>>z'); |
| 489 var lessThan = x.next as fasta.BeginGroupToken; | 489 var lessThan = x.next as BeginToken; |
| 490 var y = lessThan.next; | 490 var y = lessThan.next; |
| 491 var greaterThans = y.next; | 491 var greaterThans = y.next; |
| 492 var z = greaterThans.next; | 492 var z = greaterThans.next; |
| 493 expect(z.next.isEof, isTrue); | 493 expect(z.next.isEof, isTrue); |
| 494 expect(lessThan.endGroup, isNull); | 494 expect(lessThan.endGroup, isNull); |
| 495 } | 495 } |
| 496 } | 496 } |
| 497 | 497 |
| 498 /// Scanner tests that exercise the Fasta scanner directly. | 498 /// Scanner tests that exercise the Fasta scanner directly. |
| 499 @reflectiveTest | 499 @reflectiveTest |
| (...skipping 23 matching lines...) Expand all Loading... |
| 523 final ErrorListener _listener; | 523 final ErrorListener _listener; |
| 524 | 524 |
| 525 ToAnalyzerTokenStreamConverter_WithListener(this._listener); | 525 ToAnalyzerTokenStreamConverter_WithListener(this._listener); |
| 526 | 526 |
| 527 @override | 527 @override |
| 528 void reportError( | 528 void reportError( |
| 529 ScannerErrorCode errorCode, int offset, List<Object> arguments) { | 529 ScannerErrorCode errorCode, int offset, List<Object> arguments) { |
| 530 _listener.errors.add(new TestError(offset, errorCode, arguments)); | 530 _listener.errors.add(new TestError(offset, errorCode, arguments)); |
| 531 } | 531 } |
| 532 } | 532 } |
| OLD | NEW |