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

Side by Side Diff: pkg/analyzer/test/src/dart/sdk/patch_test.dart

Issue 2560323002: Simplify how patch files are specified to analyzer. (Closed)
Patch Set: Created 4 years 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
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 import 'package:analyzer/dart/ast/ast.dart'; 5 import 'package:analyzer/dart/ast/ast.dart';
6 import 'package:analyzer/dart/ast/token.dart'; 6 import 'package:analyzer/dart/ast/token.dart';
7 import 'package:analyzer/file_system/file_system.dart'; 7 import 'package:analyzer/file_system/file_system.dart';
8 import 'package:analyzer/file_system/memory_file_system.dart'; 8 import 'package:analyzer/file_system/memory_file_system.dart';
9 import 'package:analyzer/src/dart/sdk/patch.dart'; 9 import 'package:analyzer/src/dart/sdk/patch.dart';
10 import 'package:analyzer/src/dart/sdk/sdk.dart'; 10 import 'package:analyzer/src/dart/sdk/sdk.dart';
11 import 'package:analyzer/src/generated/engine.dart'; 11 import 'package:analyzer/src/generated/engine.dart';
12 import 'package:analyzer/src/generated/sdk.dart';
13 import 'package:analyzer/src/generated/source.dart'; 12 import 'package:analyzer/src/generated/source.dart';
14 import 'package:analyzer/src/util/fast_uri.dart'; 13 import 'package:analyzer/src/util/fast_uri.dart';
15 import 'package:test/test.dart'; 14 import 'package:test/test.dart';
16 import 'package:test_reflective_loader/test_reflective_loader.dart'; 15 import 'package:test_reflective_loader/test_reflective_loader.dart';
17 16
18 main() { 17 main() {
19 defineReflectiveSuite(() { 18 defineReflectiveSuite(() {
20 defineReflectiveTests(SdkPatcherTest); 19 defineReflectiveTests(SdkPatcherTest);
21 }); 20 });
22 } 21 }
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 part 'b.dart'; 445 part 'b.dart';
447 int bar() => 0; 446 int bar() => 0;
448 ''', 447 ''',
449 r''' 448 r'''
450 import 'c.dart'; 449 import 'c.dart';
451 '''); 450 ''');
452 _assertUnitCode(unit, 451 _assertUnitCode(unit,
453 "import 'a.dart'; part 'b.dart'; import 'c.dart'; int bar() => 0;"); 452 "import 'a.dart'; part 'b.dart'; import 'c.dart'; int bar() => 0;");
454 } 453 }
455 454
456 test_fail_noSuchLibrary() {
457 expect(() {
458 _setSdkLibraries('const LIBRARIES = const {};');
459 _createSdk();
460 File file = provider.newFile(_p('/sdk/lib/test/test.dart'), '');
461 Source source = file.createSource(FastUri.parse('dart:test'));
462 CompilationUnit unit = SdkPatcher.parse(source, true, listener);
463 patcher.patch(sdk, SdkLibraryImpl.VM_PLATFORM, listener, source, unit);
464 }, throwsArgumentError);
465 }
466
467 test_fail_patchFileDoesNotExist() { 455 test_fail_patchFileDoesNotExist() {
468 expect(() { 456 expect(() {
469 _setSdkLibraries(r''' 457 _setSdkLibraries(r'''
470 final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> { 458 final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> {
471 'test' : const LibraryInfo( 459 'test' : const LibraryInfo(
472 'test/test.dart', 460 'test/test.dart'),
473 patches: {VM_PLATFORM: ['does_not_exists.dart']}),
474 };'''); 461 };''');
475 _createSdk(); 462 _createSdk();
463 var patchPaths = {
464 'dart:test': [_p('/sdk/lib/does_not_exist.dart')]
465 };
476 File file = provider.newFile(_p('/sdk/lib/test/test.dart'), ''); 466 File file = provider.newFile(_p('/sdk/lib/test/test.dart'), '');
477 Source source = file.createSource(FastUri.parse('dart:test')); 467 Source source = file.createSource(FastUri.parse('dart:test'));
478 CompilationUnit unit = SdkPatcher.parse(source, true, listener); 468 CompilationUnit unit = SdkPatcher.parse(source, true, listener);
479 patcher.patch(sdk, SdkLibraryImpl.VM_PLATFORM, listener, source, unit); 469 patcher.patch(provider, true, patchPaths, listener, source, unit);
480 }, throwsArgumentError); 470 }, throwsArgumentError);
481 } 471 }
482 472
483 test_internal_allowNewPublicNames() { 473 test_internal_allowNewPublicNames() {
484 _setSdkLibraries(r''' 474 _setSdkLibraries(r'''
485 final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> { 475 final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> {
486 '_internal' : const LibraryInfo( 476 '_internal' : const LibraryInfo(
487 'internal/internal.dart', 477 'internal/internal.dart'),
488 patches: {VM_PLATFORM: ['internal/internal_patch.dart']}),
489 };'''); 478 };''');
479 var patchPaths = {
480 'dart:_internal': [_p('/sdk/lib/internal/internal_patch.dart')]
481 };
490 File file = provider.newFile( 482 File file = provider.newFile(
491 _p('/sdk/lib/internal/internal.dart'), 483 _p('/sdk/lib/internal/internal.dart'),
492 r''' 484 r'''
493 library dart._internal; 485 library dart._internal;
494 class A {} 486 class A {}
495 class B { 487 class B {
496 B(); 488 B();
497 } 489 }
498 '''); 490 ''');
499 provider.newFile( 491 provider.newFile(
500 _p('/sdk/lib/internal/internal_patch.dart'), 492 _p('/sdk/lib/internal/internal_patch.dart'),
501 r''' 493 r'''
502 @patch 494 @patch
503 class B { 495 class B {
504 int newField; 496 int newField;
505 B.newConstructor(); 497 B.newConstructor();
506 int newMethod() => 1; 498 int newMethod() => 1;
507 } 499 }
508 class NewClass {} 500 class NewClass {}
509 int newFunction() => 2; 501 int newFunction() => 2;
510 '''); 502 ''');
511 503
512 _createSdk(); 504 _createSdk();
513 505
514 Source source = file.createSource(FastUri.parse('dart:_internal')); 506 Source source = file.createSource(FastUri.parse('dart:_internal'));
515 CompilationUnit unit = SdkPatcher.parse(source, true, listener); 507 CompilationUnit unit = SdkPatcher.parse(source, true, listener);
516 patcher.patch(sdk, SdkLibraryImpl.VM_PLATFORM, listener, source, unit); 508 patcher.patch(provider, true, patchPaths, listener, source, unit);
517 _assertUnitCode( 509 _assertUnitCode(
518 unit, 510 unit,
519 'library dart._internal; class A {} ' 511 'library dart._internal; class A {} '
520 'class B {B(); int newField; B.newConstructor(); int newMethod() => 1;} ' 512 'class B {B(); int newField; B.newConstructor(); int newMethod() => 1;} '
521 'class NewClass {} int newFunction() => 2;'); 513 'class NewClass {} int newFunction() => 2;');
522 } 514 }
523 515
524 test_part() { 516 test_part() {
525 String baseLibCode = r''' 517 String baseLibCode = r'''
526 library test; 518 library test;
527 part 'test_part.dart'; 519 part 'test_part.dart';
528 class A {} 520 class A {}
529 '''; 521 ''';
530 String basePartCode = r''' 522 String basePartCode = r'''
531 part of test; 523 part of test;
532 class B {} 524 class B {}
533 '''; 525 ''';
534 _setSdkLibraries(r''' 526 _setSdkLibraries(r'''
535 final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> { 527 final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> {
536 'test' : const LibraryInfo( 528 'test' : const LibraryInfo(
537 'test/test.dart', 529 'test/test.dart',
538 patches: {VM_PLATFORM: ['test/test_patch.dart']}), 530 patches: {VM_PLATFORM: ['test/test_patch.dart']}),
539 };'''); 531 };''');
532 var patchPaths = {
533 'dart:test': [_p('/sdk/lib/test/test_patch.dart')]
534 };
540 File fileLib = provider.newFile(_p('/sdk/lib/test/test.dart'), baseLibCode); 535 File fileLib = provider.newFile(_p('/sdk/lib/test/test.dart'), baseLibCode);
541 File filePart = 536 File filePart =
542 provider.newFile(_p('/sdk/lib/test/test_part.dart'), basePartCode); 537 provider.newFile(_p('/sdk/lib/test/test_part.dart'), basePartCode);
543 provider.newFile( 538 provider.newFile(
544 _p('/sdk/lib/test/test_patch.dart'), 539 _p('/sdk/lib/test/test_patch.dart'),
545 r''' 540 r'''
546 import 'foo.dart'; 541 import 'foo.dart';
547 542
548 @patch 543 @patch
549 class A { 544 class A {
550 int _a() => 1; 545 int _a() => 1;
551 } 546 }
552 547
553 @patch 548 @patch
554 class B { 549 class B {
555 int _b() => 1; 550 int _b() => 1;
556 } 551 }
557 552
558 class _C {} 553 class _C {}
559 '''); 554 ''');
560 555
561 _createSdk(); 556 _createSdk();
562 557
563 { 558 {
564 Uri uri = FastUri.parse('dart:test'); 559 Uri uri = FastUri.parse('dart:test');
565 Source source = fileLib.createSource(uri); 560 Source source = fileLib.createSource(uri);
566 CompilationUnit unit = SdkPatcher.parse(source, true, listener); 561 CompilationUnit unit = SdkPatcher.parse(source, true, listener);
567 patcher.patch(sdk, SdkLibraryImpl.VM_PLATFORM, listener, source, unit); 562 patcher.patch(provider, true, patchPaths, listener, source, unit);
568 _assertUnitCode( 563 _assertUnitCode(
569 unit, 564 unit,
570 "library test; part 'test_part.dart'; import 'foo.dart'; " 565 "library test; part 'test_part.dart'; import 'foo.dart'; "
571 "class A {int _a() => 1;} class _C {}"); 566 "class A {int _a() => 1;} class _C {}");
572 } 567 }
573 568
574 { 569 {
575 Uri uri = FastUri.parse('dart:test/test_part.dart'); 570 Uri uri = FastUri.parse('dart:test/test_part.dart');
576 Source source = filePart.createSource(uri); 571 Source source = filePart.createSource(uri);
577 CompilationUnit unit = SdkPatcher.parse(source, true, listener); 572 CompilationUnit unit = SdkPatcher.parse(source, true, listener);
578 patcher.patch(sdk, SdkLibraryImpl.VM_PLATFORM, listener, source, unit); 573 patcher.patch(provider, true, patchPaths, listener, source, unit);
579 _assertUnitCode(unit, "part of test; class B {int _b() => 1;}"); 574 _assertUnitCode(unit, "part of test; class B {int _b() => 1;}");
580 } 575 }
581 } 576 }
582 577
583 test_topLevel_class_append() { 578 test_topLevel_class_append() {
584 CompilationUnit unit = _doTopLevelPatching( 579 CompilationUnit unit = _doTopLevelPatching(
585 r''' 580 r'''
586 class A {} 581 class A {}
587 ''', 582 ''',
588 r''' 583 r'''
(...skipping 25 matching lines...) Expand all
614 _doTopLevelPatching( 609 _doTopLevelPatching(
615 r''' 610 r'''
616 class A {} 611 class A {}
617 ''', 612 ''',
618 r''' 613 r'''
619 class B {} 614 class B {}
620 '''); 615 ''');
621 }, throwsArgumentError); 616 }, throwsArgumentError);
622 } 617 }
623 618
624 test_topLevel_topLevelVariable_append() {
625 CompilationUnit unit = _doTopLevelPatching(
626 r'''
627 int foo() => 0;
628 ''',
629 r'''
630 int _bar;
631 ''');
632 _assertUnitCode(unit, 'int foo() => 0; int _bar;');
633 FunctionDeclaration a = unit.declarations[0];
634 TopLevelVariableDeclaration b = unit.declarations[1];
635 _assertPrevNextToken(a.endToken, b.beginToken);
636 }
637
638 test_topLevel_function_append() { 619 test_topLevel_function_append() {
639 CompilationUnit unit = _doTopLevelPatching( 620 CompilationUnit unit = _doTopLevelPatching(
640 r''' 621 r'''
641 int foo() => 0; 622 int foo() => 0;
642 ''', 623 ''',
643 r''' 624 r'''
644 int _bar1() => 1; 625 int _bar1() => 1;
645 int _bar2() => 2; 626 int _bar2() => 2;
646 '''); 627 ''');
647 _assertUnitCode( 628 _assertUnitCode(
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
791 external void set foo(int val); 772 external void set foo(int val);
792 int bar() => 2; 773 int bar() => 2;
793 ''', 774 ''',
794 r''' 775 r'''
795 @patch 776 @patch
796 void set foo(int val) {} 777 void set foo(int val) {}
797 '''); 778 ''');
798 _assertUnitCode(unit, 'void set foo(int val) {} int bar() => 2;'); 779 _assertUnitCode(unit, 'void set foo(int val) {} int bar() => 2;');
799 } 780 }
800 781
782 test_topLevel_topLevelVariable_append() {
783 CompilationUnit unit = _doTopLevelPatching(
784 r'''
785 int foo() => 0;
786 ''',
787 r'''
788 int _bar;
789 ''');
790 _assertUnitCode(unit, 'int foo() => 0; int _bar;');
791 FunctionDeclaration a = unit.declarations[0];
792 TopLevelVariableDeclaration b = unit.declarations[1];
793 _assertPrevNextToken(a.endToken, b.beginToken);
794 }
795
801 void _assertUnitCode(CompilationUnit unit, String expectedCode) { 796 void _assertUnitCode(CompilationUnit unit, String expectedCode) {
802 expect(unit.toSource(), expectedCode); 797 expect(unit.toSource(), expectedCode);
803 } 798 }
804 799
805 void _createSdk() { 800 void _createSdk() {
806 sdk = new FolderBasedDartSdk(provider, sdkFolder); 801 sdk = new FolderBasedDartSdk(provider, sdkFolder);
807 sdk.analysisOptions = new AnalysisOptionsImpl()..strongMode = true; 802 sdk.analysisOptions = new AnalysisOptionsImpl()..strongMode = true;
808 } 803 }
809 804
810 CompilationUnit _doTopLevelPatching(String baseCode, String patchCode) { 805 CompilationUnit _doTopLevelPatching(String baseCode, String patchCode) {
811 _setSdkLibraries(r''' 806 _setSdkLibraries(r'''
812 final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> { 807 final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> {
813 'test' : const LibraryInfo( 808 'test' : const LibraryInfo(
814 'test/test.dart', 809 'test/test.dart'),
815 patches: {VM_PLATFORM: ['test/test_patch.dart']}),
816 };'''); 810 };''');
811 var patchPaths = {
812 'dart:test': [_p('/sdk/lib/test/test_patch.dart')]
813 };
817 File file = provider.newFile(_p('/sdk/lib/test/test.dart'), baseCode); 814 File file = provider.newFile(_p('/sdk/lib/test/test.dart'), baseCode);
818 provider.newFile(_p('/sdk/lib/test/test_patch.dart'), patchCode); 815 provider.newFile(_p('/sdk/lib/test/test_patch.dart'), patchCode);
819 816
820 _createSdk(); 817 _createSdk();
821 818
822 Source source = file.createSource(FastUri.parse('dart:test')); 819 Source source = file.createSource(FastUri.parse('dart:test'));
823 CompilationUnit unit = SdkPatcher.parse(source, true, listener); 820 CompilationUnit unit = SdkPatcher.parse(source, true, listener);
824 patcher.patch(sdk, SdkLibraryImpl.VM_PLATFORM, listener, source, unit); 821 patcher.patch(provider, true, patchPaths, listener, source, unit);
825 return unit; 822 return unit;
826 } 823 }
827 824
828 String _p(String path) => provider.convertPath(path); 825 String _p(String path) => provider.convertPath(path);
829 826
830 void _setSdkLibraries(String code) { 827 void _setSdkLibraries(String code) {
831 provider.newFile( 828 provider.newFile(
832 _p('/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart'), code); 829 _p('/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart'), code);
833 } 830 }
834 831
835 static void _assertPrevNextToken(Token prev, Token next) { 832 static void _assertPrevNextToken(Token prev, Token next) {
836 expect(prev.next, same(next)); 833 expect(prev.next, same(next));
837 expect(next.previous, same(prev)); 834 expect(next.previous, same(prev));
838 } 835 }
839 } 836 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698