Index: pkg/analyzer/test/src/dart/sdk/patch_test.dart |
diff --git a/pkg/analyzer/test/src/dart/sdk/patch_test.dart b/pkg/analyzer/test/src/dart/sdk/patch_test.dart |
index b5ecd52f546989a90d60e018b6ec0705f5f58e76..ad7127c76ebc6e63f538a13aee219fd6e602e62b 100644 |
--- a/pkg/analyzer/test/src/dart/sdk/patch_test.dart |
+++ b/pkg/analyzer/test/src/dart/sdk/patch_test.dart |
@@ -34,6 +34,117 @@ class SdkPatcherTest { |
sdkFolder = provider.getFolder(_p('/sdk')); |
} |
+ test_class_getter_append() { |
+ CompilationUnit unit = _doTopLevelPatching( |
+ r''' |
+class C { |
+ void a() {} |
+} |
+''', |
+ r''' |
+@patch |
+class C { |
+ int get _b => 2; |
+} |
+'''); |
+ _assertUnitCode(unit, 'class C {void a() {} int get _b => 2;}'); |
+ } |
+ |
+ test_class_method_append() { |
+ CompilationUnit unit = _doTopLevelPatching( |
+ r''' |
+class C { |
+ void a() {} |
+} |
+''', |
+ r''' |
+@patch |
+class C { |
+ void _b() {} |
+ void _c() {} |
+} |
+'''); |
+ _assertUnitCode(unit, 'class C {void a() {} void _b() {} void _c() {}}'); |
+ ClassDeclaration clazz = unit.declarations[0]; |
+ MethodDeclaration a = clazz.members[0]; |
+ MethodDeclaration b = clazz.members[1]; |
+ MethodDeclaration c = clazz.members[2]; |
+ _assertPrevNextToken(a.endToken, b.beginToken); |
+ _assertPrevNextToken(b.endToken, c.beginToken); |
+ _assertPrevNextToken(c.endToken, clazz.rightBracket); |
+ } |
+ |
+ test_class_method_fail_notPrivate() { |
+ expect(() { |
+ _doTopLevelPatching( |
+ r''' |
+class A {} |
+''', |
+ r''' |
+@patch |
+class A { |
+ void m() {} |
+} |
+'''); |
+ }, throwsArgumentError); |
+ } |
+ |
+ test_class_method_patch() { |
+ CompilationUnit unit = _doTopLevelPatching( |
+ r''' |
+class C { |
+ external int m(); |
+} |
+''', |
+ r''' |
+@patch |
+class C { |
+ @patch |
+ int m() => 42; |
+} |
+'''); |
+ _assertUnitCode(unit, 'class C {int m() => 42;}'); |
+ ClassDeclaration clazz = unit.declarations[0]; |
+ MethodDeclaration m = clazz.members[0]; |
+ expect(m.externalKeyword, isNull); |
+ _assertPrevNextToken(m.parameters.rightParenthesis, m.body.beginToken); |
+ _assertPrevNextToken(m.body.endToken, clazz.rightBracket); |
+ } |
+ |
+ test_class_method_patch_fail_noExternalKeyword() { |
+ expect(() { |
+ _doTopLevelPatching( |
+ r''' |
+class C { |
+ int m(); |
+} |
+''', |
+ r''' |
+@patch |
+class C { |
+ @patch |
+ int m() => 42; |
+} |
+'''); |
+ }, throwsArgumentError); |
+ } |
+ |
+ test_class_setter_append() { |
+ CompilationUnit unit = _doTopLevelPatching( |
+ r''' |
+class C { |
+ void a() {} |
+} |
+''', |
+ r''' |
+@patch |
+class C { |
+ void set _b(_) {} |
+} |
+'''); |
+ _assertUnitCode(unit, 'class C {void a() {} void set _b(_) {}}'); |
+ } |
+ |
test_directive_fail_export() { |
expect(() { |
_doTopLevelPatching( |
@@ -87,6 +198,47 @@ final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> { |
}, throwsArgumentError); |
} |
+ test_topLevel_class_append() { |
+ CompilationUnit unit = _doTopLevelPatching( |
+ r''' |
+class A {} |
+''', |
+ r''' |
+class _B { |
+ void mmm() {} |
+} |
+'''); |
+ _assertUnitCode(unit, 'class A {} class _B {void mmm() {}}'); |
+ ClassDeclaration a = unit.declarations[0]; |
+ ClassDeclaration b = unit.declarations[1]; |
+ _assertPrevNextToken(a.endToken, b.beginToken); |
+ } |
+ |
+ test_topLevel_class_fail_mixinApplication() { |
+ expect(() { |
+ _doTopLevelPatching( |
+ r''' |
+class A {} |
+''', |
+ r''' |
+class _B {} |
+class _C = Object with _B; |
+'''); |
+ }, throwsArgumentError); |
+ } |
+ |
+ test_topLevel_class_fail_notPrivate() { |
+ expect(() { |
+ _doTopLevelPatching( |
+ r''' |
+class A {} |
+''', |
+ r''' |
+class B {} |
+'''); |
+ }, throwsArgumentError); |
+ } |
+ |
test_topLevel_fail_topLevelVariable() { |
expect(() { |
_doTopLevelPatching( |