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

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

Issue 2417933002: Add support for patching constructors. (Closed)
Patch Set: Created 4 years, 2 months 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
« no previous file with comments | « pkg/analyzer/lib/src/dart/sdk/patch.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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';
(...skipping 16 matching lines...) Expand all
27 Folder sdkFolder; 27 Folder sdkFolder;
28 FolderBasedDartSdk sdk; 28 FolderBasedDartSdk sdk;
29 29
30 SdkPatcher patcher = new SdkPatcher(); 30 SdkPatcher patcher = new SdkPatcher();
31 RecordingErrorListener listener = new RecordingErrorListener(); 31 RecordingErrorListener listener = new RecordingErrorListener();
32 32
33 void setUp() { 33 void setUp() {
34 sdkFolder = provider.getFolder(_p('/sdk')); 34 sdkFolder = provider.getFolder(_p('/sdk'));
35 } 35 }
36 36
37 test_class_constructor_append_fail_notPrivate_named() {
38 expect(() {
39 _doTopLevelPatching(
40 r'''
41 class C {}
42 ''',
43 r'''
44 @patch
45 class C {
46 C.named() {}
47 }
48 ''');
49 }, throwsArgumentError);
50 }
51
52 test_class_constructor_append_fail_notPrivate_unnamed() {
53 expect(() {
54 _doTopLevelPatching(
55 r'''
56 class C {}
57 ''',
58 r'''
59 @patch
60 class C {
61 C() {}
62 }
63 ''');
64 }, throwsArgumentError);
65 }
66
67 test_class_constructor_append_named() {
68 CompilationUnit unit = _doTopLevelPatching(
69 r'''
70 class C {
71 }
72 ''',
73 r'''
74 @patch
75 class C {
76 C._named() {}
77 }
78 ''');
79 _assertUnitCode(unit, 'class C {C._named() {}}');
80 ClassDeclaration clazz = unit.declarations[0];
81 ConstructorDeclaration constructor = clazz.members[0];
82 _assertPrevNextToken(clazz.leftBracket, constructor.beginToken);
83 _assertPrevNextToken(constructor.endToken, clazz.rightBracket);
84 }
85
86 test_class_constructor_append_unnamed() {
87 CompilationUnit unit = _doTopLevelPatching(
88 r'''
89 class _C {
90 }
91 ''',
92 r'''
93 @patch
94 class _C {
95 _C() {}
96 }
97 ''');
98 _assertUnitCode(unit, 'class _C {_C() {}}');
99 ClassDeclaration clazz = unit.declarations[0];
100 ConstructorDeclaration constructor = clazz.members[0];
101 _assertPrevNextToken(clazz.leftBracket, constructor.beginToken);
102 _assertPrevNextToken(constructor.endToken, clazz.rightBracket);
103 }
104
105 test_class_constructor_patch() {
106 CompilationUnit unit = _doTopLevelPatching(
107 r'''
108 class C {
109 external C.named();
110 }
111 ''',
112 r'''
113 @patch
114 class C {
115 @patch
116 C.named() {
117 print(42);
118 }
119 }
120 ''');
121 _assertUnitCode(unit, 'class C {C.named() {print(42);}}');
122 ClassDeclaration clazz = unit.declarations[0];
123 ConstructorDeclaration constructor = clazz.members[0];
124 expect(constructor.externalKeyword, isNull);
125 _assertPrevNextToken(
126 constructor.parameters.endToken, constructor.body.beginToken);
127 _assertPrevNextToken(constructor.endToken, clazz.rightBracket);
128 }
129
130 test_class_constructor_patch_fail_baseFactory_patchGenerative() {
131 expect(() {
132 _doTopLevelPatching(
133 r'''
134 class C {
135 external factory C.named();
136 }
137 ''',
138 r'''
139 @patch
140 class C {
141 @patch
142 C.named() {}
143 }
144 ''');
145 }, throwsArgumentError);
146 }
147
148 test_class_constructor_patch_fail_baseGenerative_patchFactory() {
149 expect(() {
150 _doTopLevelPatching(
151 r'''
152 class C {
153 external C.named();
154 }
155 ''',
156 r'''
157 @patch
158 class C {
159 @patch
160 factory C.named() {}
161 }
162 ''');
163 }, throwsArgumentError);
164 }
165
166 test_class_constructor_patch_fail_hasInitializers() {
167 expect(() {
168 _doTopLevelPatching(
169 r'''
170 class C {
171 int f;
172 external C.named() : f = 1;
173 }
174 ''',
175 r'''
176 @patch
177 class C {
178 @patch
179 C.named() : f = 2 {}
180 }
181 ''');
182 }, throwsArgumentError);
183 }
184
185 test_class_constructor_patch_fail_noExternalKeyword() {
186 expect(() {
187 _doTopLevelPatching(
188 r'''
189 class C {
190 C.named();
191 }
192 ''',
193 r'''
194 @patch
195 class C {
196 @patch
197 C.named() {}
198 }
199 ''');
200 }, throwsArgumentError);
201 }
202
203 test_class_constructor_patch_initializers() {
204 CompilationUnit unit = _doTopLevelPatching(
205 r'''
206 class C {
207 int f;
208 external C.named();
209 }
210 ''',
211 r'''
212 @patch
213 class C {
214 @patch
215 C.named() : f = 2 {
216 print(42);
217 }
218 }
219 ''');
220 _assertUnitCode(unit, 'class C {int f; C.named() : f = 2 {print(42);}}');
221 ClassDeclaration clazz = unit.declarations[0];
222 ConstructorDeclaration constructor = clazz.members[1];
223 expect(constructor.externalKeyword, isNull);
224 _assertPrevNextToken(constructor.parameters.endToken,
225 constructor.initializers.beginToken.previous);
226 _assertPrevNextToken(constructor.endToken, clazz.rightBracket);
227 }
228
37 test_class_getter_append() { 229 test_class_getter_append() {
38 CompilationUnit unit = _doTopLevelPatching( 230 CompilationUnit unit = _doTopLevelPatching(
39 r''' 231 r'''
40 class C { 232 class C {
41 void a() {} 233 void a() {}
42 } 234 }
43 ''', 235 ''',
44 r''' 236 r'''
45 @patch 237 @patch
46 class C { 238 class C {
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 void _setSdkLibraries(String code) { 638 void _setSdkLibraries(String code) {
447 provider.newFile( 639 provider.newFile(
448 _p('/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart'), code); 640 _p('/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart'), code);
449 } 641 }
450 642
451 static void _assertPrevNextToken(Token prev, Token next) { 643 static void _assertPrevNextToken(Token prev, Token next) {
452 expect(prev.next, same(next)); 644 expect(prev.next, same(next));
453 expect(next.previous, same(prev)); 645 expect(next.previous, same(prev));
454 } 646 }
455 } 647 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/dart/sdk/patch.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698