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 library test.services.completion.statement; | 5 library test.services.completion.statement; |
6 | 6 |
7 import 'package:analysis_server/src/protocol_server.dart'; | 7 import 'package:analysis_server/src/protocol_server.dart'; |
8 import 'package:analysis_server/src/services/completion/statement/statement_comp
letion.dart'; | 8 import 'package:analysis_server/src/services/completion/statement/statement_comp
letion.dart'; |
9 import 'package:analyzer/src/dart/analysis/driver.dart'; | 9 import 'package:analyzer/src/dart/analysis/driver.dart'; |
10 import 'package:test/test.dart'; | 10 import 'package:test/test.dart'; |
11 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 11 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
12 | 12 |
13 import '../../../abstract_single_unit.dart'; | 13 import '../../../abstract_single_unit.dart'; |
14 | 14 |
15 main() { | 15 main() { |
16 defineReflectiveSuite(() { | 16 defineReflectiveSuite(() { |
17 defineReflectiveTests(_DeclarationCompletionTest); | 17 defineReflectiveTests(_DeclarationCompletionTest); |
18 defineReflectiveTests(_ControlFlowCompletionTest); | 18 defineReflectiveTests(_ControlFlowCompletionTest); |
19 defineReflectiveTests(_DoCompletionTest); | 19 defineReflectiveTests(_DoCompletionTest); |
| 20 defineReflectiveTests(_ExpressionCompletionTest); |
20 defineReflectiveTests(_ForCompletionTest); | 21 defineReflectiveTests(_ForCompletionTest); |
21 defineReflectiveTests(_ForEachCompletionTest); | 22 defineReflectiveTests(_ForEachCompletionTest); |
22 defineReflectiveTests(_IfCompletionTest); | 23 defineReflectiveTests(_IfCompletionTest); |
23 defineReflectiveTests(_SimpleCompletionTest); | 24 defineReflectiveTests(_SimpleCompletionTest); |
24 defineReflectiveTests(_SwitchCompletionTest); | 25 defineReflectiveTests(_SwitchCompletionTest); |
25 defineReflectiveTests(_TryCompletionTest); | 26 defineReflectiveTests(_TryCompletionTest); |
26 defineReflectiveTests(_WhileCompletionTest); | 27 defineReflectiveTests(_WhileCompletionTest); |
27 }); | 28 }); |
28 } | 29 } |
29 | 30 |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 _assertHasChange( | 297 _assertHasChange( |
297 'Complete class declaration', | 298 'Complete class declaration', |
298 ''' | 299 ''' |
299 class Sample { | 300 class Sample { |
300 //// | 301 //// |
301 } | 302 } |
302 ''', | 303 ''', |
303 (s) => _afterLast(s, ' ')); | 304 (s) => _afterLast(s, ' ')); |
304 } | 305 } |
305 | 306 |
| 307 test_extendsNoBody() async { |
| 308 await _prepareCompletion( |
| 309 'Sample', |
| 310 ''' |
| 311 class Sample extends Object |
| 312 ''', |
| 313 atEnd: true); |
| 314 _assertHasChange( |
| 315 'Complete class declaration', |
| 316 ''' |
| 317 class Sample extends Object { |
| 318 //// |
| 319 } |
| 320 ''', |
| 321 (s) => _afterLast(s, ' ')); |
| 322 } |
| 323 |
306 test_functionDeclNoBody() async { | 324 test_functionDeclNoBody() async { |
307 await _prepareCompletion( | 325 await _prepareCompletion( |
308 'source()', | 326 'source()', |
309 ''' | 327 ''' |
310 String source() | 328 String source() |
311 ''', | 329 ''', |
312 atEnd: true); | 330 atEnd: true); |
313 _assertHasChange( | 331 _assertHasChange( |
314 'Complete function declaration', | 332 'Complete function declaration', |
315 ''' | 333 ''' |
316 String source() { | 334 String source() { |
317 //// | 335 //// |
318 } | 336 } |
319 ''', | 337 ''', |
320 (s) => _after(s, ' ')); | 338 (s) => _after(s, ' ')); |
321 } | 339 } |
322 | 340 |
| 341 test_functionDeclNoParen() async { |
| 342 await _prepareCompletion( |
| 343 'source(', |
| 344 ''' |
| 345 String source( |
| 346 ''', |
| 347 atEnd: true); |
| 348 _assertHasChange( |
| 349 'Complete function declaration', |
| 350 ''' |
| 351 String source() { |
| 352 //// |
| 353 } |
| 354 ''', |
| 355 (s) => _after(s, ' ')); |
| 356 } |
| 357 |
323 test_methodDeclNoBody() async { | 358 test_methodDeclNoBody() async { |
324 await _prepareCompletion( | 359 await _prepareCompletion( |
325 'source()', | 360 'source()', |
326 ''' | 361 ''' |
327 class Sample { | 362 class Sample { |
328 String source() | 363 String source() |
329 } | 364 } |
330 ''', | 365 ''', |
331 atEnd: true); | 366 atEnd: true); |
332 _assertHasChange( | 367 _assertHasChange( |
333 'Complete function declaration', | 368 'Complete function declaration', |
334 ''' | 369 ''' |
335 class Sample { | 370 class Sample { |
336 String source() { | 371 String source() { |
337 //// | 372 //// |
338 } | 373 } |
339 } | 374 } |
340 ''', | 375 ''', |
341 (s) => _after(s, ' ')); | 376 (s) => _after(s, ' ')); |
342 } | 377 } |
343 | 378 |
| 379 test_methodDeclNoParen() async { |
| 380 await _prepareCompletion( |
| 381 'source(', |
| 382 ''' |
| 383 class Sample { |
| 384 String source( |
| 385 } |
| 386 ''', |
| 387 atEnd: true); |
| 388 _assertHasChange( |
| 389 'Complete function declaration', |
| 390 ''' |
| 391 class Sample { |
| 392 String source() { |
| 393 //// |
| 394 } |
| 395 } |
| 396 ''', |
| 397 (s) => _after(s, ' ')); |
| 398 } |
| 399 |
344 test_variableDeclNoBody() async { | 400 test_variableDeclNoBody() async { |
345 await _prepareCompletion( | 401 await _prepareCompletion( |
346 'source', | 402 'source', |
347 ''' | 403 ''' |
348 String source | 404 String source |
349 ''', | 405 ''', |
350 atEnd: true); | 406 atEnd: true); |
351 _assertHasChange( | 407 _assertHasChange( |
352 'Complete variable declaration', | 408 'Complete variable declaration', |
353 ''' | 409 ''' |
354 String source; | 410 String source; |
355 //// | 411 //// |
356 ''', | 412 ''', |
357 (s) => _after(s, ';\n')); | 413 (s) => _after(s, ';\n')); |
358 } | 414 } |
| 415 |
| 416 test_withNoBody() async { |
| 417 await _prepareCompletion( |
| 418 'Sample', |
| 419 ''' |
| 420 class M {} |
| 421 class Sample extends Object with M |
| 422 ''', |
| 423 atEnd: true); |
| 424 _assertHasChange( |
| 425 'Complete class declaration', |
| 426 ''' |
| 427 class M {} |
| 428 class Sample extends Object with M { |
| 429 //// |
| 430 } |
| 431 ''', |
| 432 (s) => _afterLast(s, ' ')); |
| 433 } |
359 } | 434 } |
360 | 435 |
361 @reflectiveTest | 436 @reflectiveTest |
362 class _DoCompletionTest extends StatementCompletionTest { | 437 class _DoCompletionTest extends StatementCompletionTest { |
363 test_emptyCondition() async { | 438 test_emptyCondition() async { |
364 await _prepareCompletion( | 439 await _prepareCompletion( |
365 'while ()', | 440 'while ()', |
366 ''' | 441 ''' |
367 main() { | 442 main() { |
368 do { | 443 do { |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
484 main() { | 559 main() { |
485 do { | 560 do { |
486 } while (); | 561 } while (); |
487 } | 562 } |
488 ''', | 563 ''', |
489 (s) => _after(s, 'while (')); | 564 (s) => _after(s, 'while (')); |
490 } | 565 } |
491 } | 566 } |
492 | 567 |
493 @reflectiveTest | 568 @reflectiveTest |
| 569 class _ExpressionCompletionTest extends StatementCompletionTest { |
| 570 test_listAssign() async { |
| 571 await _prepareCompletion( |
| 572 '= ', |
| 573 ''' |
| 574 main() { |
| 575 var x = [1, 2, 3 |
| 576 } |
| 577 ''', |
| 578 atEnd: true); |
| 579 _assertHasChange( |
| 580 'Add a semicolon and newline', |
| 581 ''' |
| 582 main() { |
| 583 var x = [1, 2, 3]; |
| 584 //// |
| 585 } |
| 586 ''', |
| 587 (s) => _afterLast(s, ' ')); |
| 588 } |
| 589 |
| 590 test_listAssignMultiLine() async { |
| 591 // The indent of the final line is incorrect. |
| 592 await _prepareCompletion( |
| 593 '3', |
| 594 ''' |
| 595 main() { |
| 596 var x = [ |
| 597 1, |
| 598 2, |
| 599 3 |
| 600 } |
| 601 ''', |
| 602 atEnd: true); |
| 603 _assertHasChange( |
| 604 'Add a semicolon and newline', |
| 605 ''' |
| 606 main() { |
| 607 var x = [ |
| 608 1, |
| 609 2, |
| 610 3, |
| 611 ]; |
| 612 //// |
| 613 } |
| 614 ''', |
| 615 (s) => _afterLast(s, ' ')); |
| 616 } |
| 617 |
| 618 @failingTest |
| 619 test_mapAssign() async { |
| 620 await _prepareCompletion( |
| 621 '3: 3', |
| 622 ''' |
| 623 main() { |
| 624 var x = {1: 1, 2: 2, 3: 3 |
| 625 } |
| 626 ''', |
| 627 atEnd: true); |
| 628 _assertHasChange( |
| 629 'Add a semicolon and newline', |
| 630 ''' |
| 631 main() { |
| 632 var x = {1: 1, 2: 2, 3: 3}; |
| 633 //// |
| 634 } |
| 635 ''', |
| 636 (s) => _afterLast(s, ' ')); |
| 637 } |
| 638 |
| 639 @failingTest |
| 640 test_mapAssignMissingColon() async { |
| 641 await _prepareCompletion( |
| 642 '3', |
| 643 ''' |
| 644 main() { |
| 645 var x = {1: 1, 2: 2, 3 |
| 646 } |
| 647 ''', |
| 648 atEnd: true); |
| 649 _assertHasChange( |
| 650 'Add a semicolon and newline', |
| 651 ''' |
| 652 main() { |
| 653 var x = {1: 1, 2: 2, 3: }; |
| 654 //// |
| 655 } |
| 656 ''', |
| 657 (s) => _afterLast(s, ' ')); |
| 658 } |
| 659 |
| 660 test_returnString() async { |
| 661 await _prepareCompletion( |
| 662 'text', |
| 663 ''' |
| 664 main() { |
| 665 if (done()) { |
| 666 return 'text |
| 667 } |
| 668 } |
| 669 ''', |
| 670 atEnd: true); |
| 671 _assertHasChange( |
| 672 'Complete control flow block', |
| 673 ''' |
| 674 main() { |
| 675 if (done()) { |
| 676 return 'text'; |
| 677 } |
| 678 //// |
| 679 } |
| 680 ''', |
| 681 (s) => _afterLast(s, ' ')); |
| 682 } |
| 683 |
| 684 test_stringAssign() async { |
| 685 await _prepareCompletion( |
| 686 '= ', |
| 687 ''' |
| 688 main() { |
| 689 var x = ' |
| 690 } |
| 691 ''', |
| 692 atEnd: true); |
| 693 _assertHasChange( |
| 694 'Add a semicolon and newline', |
| 695 ''' |
| 696 main() { |
| 697 var x = ''; |
| 698 //// |
| 699 } |
| 700 ''', |
| 701 (s) => _afterLast(s, ' ')); |
| 702 } |
| 703 |
| 704 test_stringSingle() async { |
| 705 await _prepareCompletion( |
| 706 'text', |
| 707 ''' |
| 708 main() { |
| 709 print("text |
| 710 } |
| 711 ''', |
| 712 atEnd: true); |
| 713 _assertHasChange( |
| 714 'Insert a newline at the end of the current line', |
| 715 ''' |
| 716 main() { |
| 717 print("text"); |
| 718 //// |
| 719 } |
| 720 ''', |
| 721 (s) => _afterLast(s, ' ')); |
| 722 } |
| 723 |
| 724 test_stringTriple() async { |
| 725 await _prepareCompletion( |
| 726 'text', |
| 727 ''' |
| 728 main() { |
| 729 print(\'\'\'text |
| 730 } |
| 731 ''', |
| 732 atEnd: true); |
| 733 _assertHasChange( |
| 734 'Insert a newline at the end of the current line', |
| 735 ''' |
| 736 main() { |
| 737 print(\'\'\'text\'\'\'); |
| 738 //// |
| 739 } |
| 740 ''', |
| 741 (s) => _afterLast(s, ' ')); |
| 742 } |
| 743 } |
| 744 |
| 745 @reflectiveTest |
494 class _ForCompletionTest extends StatementCompletionTest { | 746 class _ForCompletionTest extends StatementCompletionTest { |
495 test_emptyCondition() async { | 747 test_emptyCondition() async { |
496 await _prepareCompletion( | 748 await _prepareCompletion( |
497 '}', | 749 '0;', |
| 750 ''' |
| 751 main() { |
| 752 for (int i = 0;) /**/ //// |
| 753 } |
| 754 ''', |
| 755 atEnd: true); |
| 756 _assertHasChange( |
| 757 'Complete for-statement', |
| 758 ''' |
| 759 main() { |
| 760 for (int i = 0; ; ) /**/ { |
| 761 //// |
| 762 } |
| 763 } |
| 764 ''', |
| 765 (s) => _after(s, ' ')); |
| 766 } |
| 767 |
| 768 test_emptyConditionWithBody() async { |
| 769 await _prepareCompletion( |
| 770 '0;', |
498 ''' | 771 ''' |
499 main() { | 772 main() { |
500 for (int i = 0;) { | 773 for (int i = 0;) { |
501 } | 774 } |
502 } | 775 } |
503 ''', | 776 ''', |
504 atEnd: true); | 777 atEnd: true); |
505 _assertHasChange( | 778 _assertHasChange( |
506 'Complete for-statement', | 779 'Complete for-statement', |
507 ''' | 780 ''' |
508 main() { | 781 main() { |
509 for (int i = 0; ; ) { | 782 for (int i = 0; ; ) { |
510 } | 783 } |
511 } | 784 } |
512 ''', | 785 ''', |
513 (s) => _after(s, '0; ')); | 786 (s) => _after(s, '0; ')); |
514 } | 787 } |
515 | 788 |
516 test_emptyInitializers() async { | 789 test_emptyInitializers() async { |
517 // TODO(messick) This should insert a newline and move the cursor there. | 790 // This does nothing, same as for Java. |
518 await _prepareCompletion( | 791 await _prepareCompletion( |
519 '}', | 792 'r (', |
520 ''' | 793 ''' |
521 main() { | 794 main() { |
522 for () { | 795 for () { |
523 } | 796 } |
524 } | 797 } |
525 ''', | 798 ''', |
526 atEnd: true); | 799 atEnd: true); |
527 _assertHasChange( | 800 _assertHasChange( |
528 'Complete for-statement', | 801 'Complete for-statement', |
529 ''' | 802 ''' |
530 main() { | 803 main() { |
531 for () { | 804 for () { |
532 } | 805 } |
533 } | 806 } |
534 ''', | 807 ''', |
535 (s) => _after(s, 'for (')); | 808 (s) => _after(s, 'r (')); |
| 809 } |
| 810 |
| 811 test_emptyInitializersAfterBody() async { |
| 812 await _prepareCompletion( |
| 813 '}', |
| 814 ''' |
| 815 main() { |
| 816 for () { |
| 817 } |
| 818 } |
| 819 ''', |
| 820 atEnd: true); |
| 821 _assertHasChange( |
| 822 'Insert a newline at the end of the current line', |
| 823 ''' |
| 824 main() { |
| 825 for () { |
| 826 } |
| 827 //// |
| 828 } |
| 829 ''', |
| 830 (s) => _afterLast(s, ' ')); |
536 } | 831 } |
537 | 832 |
538 test_emptyInitializersEmptyCondition() async { | 833 test_emptyInitializersEmptyCondition() async { |
539 await _prepareCompletion( | 834 await _prepareCompletion( |
540 '}', | 835 '/**/', |
541 ''' | 836 ''' |
542 main() { | 837 main() { |
543 for (;/**/) { | 838 for (;/**/) |
544 } | |
545 } | 839 } |
546 ''', | 840 ''', |
547 atEnd: true); | 841 atEnd: true); |
548 _assertHasChange( | 842 _assertHasChange( |
549 'Complete for-statement', | 843 'Complete for-statement', |
550 ''' | 844 ''' |
551 main() { | 845 main() { |
552 for (;/**/) { | 846 for (; /**/; ) { |
| 847 //// |
553 } | 848 } |
554 } | 849 } |
555 ''', | 850 ''', |
556 (s) => _after(s, '/**/')); | 851 (s) => _after(s, ' ')); |
557 } | 852 } |
558 | 853 |
559 test_emptyParts() async { | 854 test_emptyParts() async { |
560 await _prepareCompletion( | 855 await _prepareCompletion( |
561 ';)', | 856 ';)', |
562 ''' | 857 ''' |
563 main() { | 858 main() { |
564 for (;;) | 859 for (;;) |
565 } | 860 } |
566 ''', | 861 ''', |
567 atEnd: true); | 862 atEnd: true); |
568 _assertHasChange( | 863 _assertHasChange( |
569 'Complete for-statement', | 864 'Complete for-statement', |
570 ''' | 865 ''' |
571 main() { | 866 main() { |
572 for (;;) { | 867 for (;;) { |
573 //// | 868 //// |
574 } | 869 } |
575 } | 870 } |
576 ''', | 871 ''', |
577 (s) => _after(s, ' ')); | 872 (s) => _after(s, ' ')); |
578 } | 873 } |
579 | 874 |
580 test_emptyUpdaters() async { | 875 test_emptyUpdaters() async { |
581 await _prepareCompletion( | 876 await _prepareCompletion( |
582 '}', | 877 '/**/', |
| 878 ''' |
| 879 main() { |
| 880 for (int i = 0; i < 10 /**/) |
| 881 } |
| 882 ''', |
| 883 atEnd: true); |
| 884 _assertHasChange( |
| 885 'Complete for-statement', |
| 886 ''' |
| 887 main() { |
| 888 for (int i = 0; i < 10 /**/; ) { |
| 889 //// |
| 890 } |
| 891 } |
| 892 ''', |
| 893 (s) => _after(s, ' ')); |
| 894 } |
| 895 |
| 896 test_emptyUpdatersWithBody() async { |
| 897 await _prepareCompletion( |
| 898 '/**/', |
583 ''' | 899 ''' |
584 main() { | 900 main() { |
585 for (int i = 0; i < 10 /**/) { | 901 for (int i = 0; i < 10 /**/) { |
586 } | 902 } |
587 } | 903 } |
588 ''', | 904 ''', |
589 atEnd: true); | 905 atEnd: true); |
590 _assertHasChange( | 906 _assertHasChange( |
591 'Complete for-statement', | 907 'Complete for-statement', |
592 ''' | 908 ''' |
593 main() { | 909 main() { |
594 for (int i = 0; i < 10 /**/; ) { | 910 for (int i = 0; i < 10 /**/; ) { |
595 } | 911 } |
596 } | 912 } |
597 ''', | 913 ''', |
598 (s) => _after(s, '10 /**/; ')); | 914 (s) => _after(s, '*/; ')); |
599 } | 915 } |
600 | 916 |
601 test_keywordOnly() async { | 917 test_keywordOnly() async { |
602 await _prepareCompletion( | 918 await _prepareCompletion( |
603 'for', | 919 'for', |
604 ''' | 920 ''' |
605 main() { | 921 main() { |
606 for | 922 for |
607 } | 923 } |
608 ''', | 924 ''', |
609 atEnd: true); | 925 atEnd: true); |
610 _assertHasChange( | 926 _assertHasChange( |
611 'Complete for-statement', | 927 'Complete for-statement', |
612 ''' | 928 ''' |
613 main() { | 929 main() { |
614 for () { | 930 for () { |
615 //// | 931 //// |
616 } | 932 } |
617 } | 933 } |
618 ''', | 934 ''', |
619 (s) => _after(s, 'for (')); | 935 (s) => _after(s, 'for (')); |
620 } | 936 } |
621 | 937 |
622 test_missingLeftSeparator() async { | 938 test_missingLeftSeparator() async { |
623 await _prepareCompletion( | 939 await _prepareCompletion( |
624 '}', | 940 '= 0', |
625 ''' | 941 ''' |
626 main() { | 942 main() { |
627 for (int i = 0) { | 943 for (int i = 0) { |
628 } | 944 } |
629 } | 945 } |
630 ''', | 946 ''', |
631 atEnd: true); | 947 atEnd: true); |
632 _assertHasChange( | 948 _assertHasChange( |
633 'Complete for-statement', | 949 'Complete for-statement', |
634 ''' | 950 ''' |
635 main() { | 951 main() { |
636 for (int i = 0; ) { | 952 for (int i = 0; ; ) { |
637 } | 953 } |
638 } | 954 } |
639 ''', | 955 ''', |
640 (s) => _after(s, '0; ')); | 956 (s) => _after(s, '0; ')); |
641 } | 957 } |
642 | 958 |
643 test_noError() async { | 959 test_noError() async { |
644 await _prepareCompletion( | 960 await _prepareCompletion( |
645 ';)', | 961 ';)', |
646 ''' | 962 ''' |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
748 } | 1064 } |
749 return; | 1065 return; |
750 } | 1066 } |
751 ''', | 1067 ''', |
752 (s) => _after(s, ' ')); | 1068 (s) => _after(s, ' ')); |
753 } | 1069 } |
754 } | 1070 } |
755 | 1071 |
756 @reflectiveTest | 1072 @reflectiveTest |
757 class _IfCompletionTest extends StatementCompletionTest { | 1073 class _IfCompletionTest extends StatementCompletionTest { |
758 test_afterCondition_BAD() async { | 1074 test_afterCondition() async { |
759 // TODO(messick) Stop inserting the space after the closing brace. | |
760 await _prepareCompletion( | 1075 await _prepareCompletion( |
761 'if (true) ', // Trigger completion after space. | 1076 'if (true) ', // Trigger completion after space. |
762 ''' | 1077 ''' |
763 main() { | 1078 main() { |
764 if (true) //// | 1079 if (true) //// |
765 } | 1080 } |
766 ''', | 1081 ''', |
767 atEnd: true); | 1082 atEnd: true); |
768 _assertHasChange( | 1083 _assertHasChange( |
769 'Complete if-statement', | 1084 'Complete if-statement', |
770 ''' | 1085 ''' |
771 main() { | 1086 main() { |
772 if (true) { | 1087 if (true) { |
773 //// | 1088 //// |
774 } //// | 1089 } |
775 } | 1090 } |
776 ''', | 1091 ''', |
777 (s) => _after(s, ' ')); | 1092 (s) => _after(s, ' ')); |
778 } | 1093 } |
779 | 1094 |
780 test_emptyCondition() async { | 1095 test_emptyCondition() async { |
781 await _prepareCompletion( | 1096 await _prepareCompletion( |
782 'if ()', | 1097 'if ()', |
783 ''' | 1098 ''' |
784 main() { | 1099 main() { |
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1326 test_onCatch() async { | 1641 test_onCatch() async { |
1327 await _prepareCompletion( | 1642 await _prepareCompletion( |
1328 'on', | 1643 'on', |
1329 ''' | 1644 ''' |
1330 main() { | 1645 main() { |
1331 try { | 1646 try { |
1332 } on catch | 1647 } on catch |
1333 } | 1648 } |
1334 ''', | 1649 ''', |
1335 atEnd: true); | 1650 atEnd: true); |
1336 // It would be better to expect the cursor to follow the on-keyword but | |
1337 // the parser thinks the exception type is 'catch' so it's kinda broken. | |
1338 // See https://github.com/dart-lang/sdk/issues/29410 | |
1339 _assertHasChange( | 1651 _assertHasChange( |
1340 'Complete try-statement', | 1652 'Complete try-statement', |
1341 ''' | 1653 ''' |
1342 main() { | 1654 main() { |
1343 try { | 1655 try { |
1344 } on catch () { | 1656 } on catch () { |
1345 //// | 1657 //// |
1346 } | 1658 } |
1347 } | 1659 } |
1348 ''', | 1660 ''', |
1349 (s) => _after(s, 'catch (')); | 1661 (s) => _after(s, 'catch (')); |
1350 } | 1662 } |
1351 | 1663 |
| 1664 test_onCatchComment() async { |
| 1665 await _prepareCompletion( |
| 1666 'on', |
| 1667 ''' |
| 1668 main() { |
| 1669 try { |
| 1670 } on catch |
| 1671 // |
| 1672 } |
| 1673 ''', |
| 1674 atEnd: true); |
| 1675 _assertHasChange( |
| 1676 'Complete try-statement', |
| 1677 ''' |
| 1678 main() { |
| 1679 try { |
| 1680 } on catch () { |
| 1681 //// |
| 1682 } |
| 1683 // |
| 1684 } |
| 1685 ''', |
| 1686 (s) => _after(s, 'catch (')); |
| 1687 } |
| 1688 |
1352 test_onOnly() async { | 1689 test_onOnly() async { |
1353 await _prepareCompletion( | 1690 await _prepareCompletion( |
1354 'on', | 1691 'on', |
1355 ''' | 1692 ''' |
1356 main() { | 1693 main() { |
1357 try { | 1694 try { |
1358 } on | 1695 } on |
1359 } | 1696 } |
1360 ''', | 1697 ''', |
1361 atEnd: true); | 1698 atEnd: true); |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1465 ''' | 1802 ''' |
1466 main() { | 1803 main() { |
1467 while () { | 1804 while () { |
1468 //// | 1805 //// |
1469 } | 1806 } |
1470 } | 1807 } |
1471 ''', | 1808 ''', |
1472 (s) => _after(s, 'while (')); | 1809 (s) => _after(s, 'while (')); |
1473 } | 1810 } |
1474 } | 1811 } |
OLD | NEW |