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

Side by Side Diff: tests/compiler/dart2js/patch_test.dart

Issue 17759007: First pass at asynchronous input loading in dart2js. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 6 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 'dart:async';
5 import "package:expect/expect.dart"; 6 import "package:expect/expect.dart";
6 import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart"; 7 import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
7 import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dar t"; 8 import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dar t";
8 import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart"; 9 import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
9 import "../../../sdk/lib/_internal/compiler/implementation/util/util.dart"; 10 import "../../../sdk/lib/_internal/compiler/implementation/util/util.dart";
10 import "mock_compiler.dart"; 11 import "mock_compiler.dart";
11 import "parser_helper.dart"; 12 import "parser_helper.dart";
12 13
13 Compiler applyPatch(String script, String patch, 14 Future<Compiler> applyPatch(String script, String patch,
14 {bool analyzeAll: false, bool analyzeOnly: false}) { 15 {bool analyzeAll: false, bool analyzeOnly: false}) {
15 String core = "$DEFAULT_CORELIB\n$script"; 16 String core = "$DEFAULT_CORELIB\n$script";
16 MockCompiler compiler = new MockCompiler(coreSource: core, 17 MockCompiler compiler = new MockCompiler(coreSource: core,
17 analyzeAll: analyzeAll, 18 analyzeAll: analyzeAll,
18 analyzeOnly: analyzeOnly); 19 analyzeOnly: analyzeOnly);
19 var uri = Uri.parse("core.dartp"); 20 var uri = Uri.parse("core.dartp");
20 compiler.sourceFiles[uri.toString()] = new MockFile(patch); 21 compiler.sourceFiles[uri.toString()] = new MockFile(patch);
21 var handler = new LibraryDependencyHandler(compiler); 22 var handler = new LibraryDependencyHandler(compiler);
22 compiler.patchParser.patchLibrary(handler, uri, compiler.coreLibrary); 23 return compiler.patchParser.patchLibrary(handler, uri, compiler.coreLibrary)
23 handler.computeExports(); 24 .then((_) {
24 return compiler; 25 handler.computeExports();
26 return compiler;
27 });
25 } 28 }
26 29
27 void expectHasBody(compiler, Element element) { 30 void expectHasBody(compiler, Element element) {
28 var node = element.parseNode(compiler); 31 var node = element.parseNode(compiler);
29 Expect.isNotNull(node, "Element isn't parseable, when a body was expected"); 32 Expect.isNotNull(node, "Element isn't parseable, when a body was expected");
30 Expect.isNotNull(node.body); 33 Expect.isNotNull(node.body);
31 // If the element has a body it is either a Block or a Return statement, 34 // If the element has a body it is either a Block or a Return statement,
32 // both with different begin and end tokens. 35 // both with different begin and end tokens.
33 Expect.isTrue(node.body is Block || node.body is Return); 36 Expect.isTrue(node.body is Block || node.body is Return);
34 Expect.notEquals(node.body.getBeginToken(), node.body.getEndToken()); 37 Expect.notEquals(node.body.getBeginToken(), node.body.getEndToken());
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 102
100 if (checkHasBody) { 103 if (checkHasBody) {
101 expectHasBody(compiler, element); 104 expectHasBody(compiler, element);
102 } 105 }
103 } 106 }
104 Expect.isFalse(element.isPatched && element.isPatch); 107 Expect.isFalse(element.isPatched && element.isPatch);
105 return element; 108 return element;
106 } 109 }
107 110
108 testPatchFunction() { 111 testPatchFunction() {
109 var compiler = applyPatch( 112 applyPatch(
110 "external test();", 113 "external test();",
111 "patch test() { return 'string'; } "); 114 "patch test() { return 'string'; } ").then((compiler) {
112 ensure(compiler, "test", compiler.coreLibrary.find, 115 ensure(compiler, "test", compiler.coreLibrary.find,
113 expectIsPatched: true, checkHasBody: true); 116 expectIsPatched: true, checkHasBody: true);
114 ensure(compiler, "test", compiler.coreLibrary.patch.find, 117 ensure(compiler, "test", compiler.coreLibrary.patch.find,
115 expectIsPatch: true, checkHasBody: true); 118 expectIsPatch: true, checkHasBody: true);
116 119
117 Expect.isTrue(compiler.warnings.isEmpty, 120 Expect.isTrue(compiler.warnings.isEmpty,
118 "Unexpected warnings: ${compiler.warnings}"); 121 "Unexpected warnings: ${compiler.warnings}");
119 Expect.isTrue(compiler.errors.isEmpty, 122 Expect.isTrue(compiler.errors.isEmpty,
120 "Unexpected errors: ${compiler.errors}"); 123 "Unexpected errors: ${compiler.errors}");
124 });
121 } 125 }
122 126
123 testPatchConstructor() { 127 testPatchConstructor() {
124 var compiler = applyPatch( 128 applyPatch(
125 """ 129 """
126 class Class { 130 class Class {
127 external Class(); 131 external Class();
128 } 132 }
129 """, 133 """,
130 """ 134 """
131 patch class Class { 135 patch class Class {
132 patch Class(); 136 patch Class();
133 } 137 }
134 """); 138 """).then((compiler) {
135 var classOrigin = ensure(compiler, "Class", compiler.coreLibrary.find, 139 var classOrigin = ensure(compiler, "Class", compiler.coreLibrary.find,
136 expectIsPatched: true); 140 expectIsPatched: true);
137 classOrigin.ensureResolved(compiler); 141 classOrigin.ensureResolved(compiler);
138 var classPatch = ensure(compiler, "Class", compiler.coreLibrary.patch.find, 142 var classPatch = ensure(compiler, "Class", compiler.coreLibrary.patch.find,
139 expectIsPatch: true); 143 expectIsPatch: true);
140 144
141 Expect.equals(classPatch, classOrigin.patch); 145 Expect.equals(classPatch, classOrigin.patch);
142 Expect.equals(classOrigin, classPatch.origin); 146 Expect.equals(classOrigin, classPatch.origin);
143 147
144 var constructorOrigin = ensure(compiler, "Class", 148 var constructorOrigin = ensure(compiler, "Class",
145 (name) => classOrigin.localLookup(name), 149 (name) => classOrigin.localLookup(name),
146 expectIsPatched: true); 150 expectIsPatched: true);
147 var constructorPatch = ensure(compiler, "Class", 151 var constructorPatch = ensure(compiler, "Class",
148 (name) => classPatch.localLookup(name), 152 (name) => classPatch.localLookup(name),
149 expectIsPatch: true); 153 expectIsPatch: true);
150 154
151 Expect.equals(constructorPatch, constructorOrigin.patch); 155 Expect.equals(constructorPatch, constructorOrigin.patch);
152 Expect.equals(constructorOrigin, constructorPatch.origin); 156 Expect.equals(constructorOrigin, constructorPatch.origin);
153 157
154 Expect.isTrue(compiler.warnings.isEmpty, 158 Expect.isTrue(compiler.warnings.isEmpty,
155 "Unexpected warnings: ${compiler.warnings}"); 159 "Unexpected warnings: ${compiler.warnings}");
156 Expect.isTrue(compiler.errors.isEmpty, 160 Expect.isTrue(compiler.errors.isEmpty,
157 "Unexpected errors: ${compiler.errors}"); 161 "Unexpected errors: ${compiler.errors}");
162 });
158 } 163 }
159 164
160 testPatchMember() { 165 testPatchMember() {
161 var compiler = applyPatch( 166 applyPatch(
162 """ 167 """
163 class Class { 168 class Class {
164 external String toString(); 169 external String toString();
165 } 170 }
166 """, 171 """,
167 """ 172 """
168 patch class Class { 173 patch class Class {
169 patch String toString() => 'string'; 174 patch String toString() => 'string';
170 } 175 }
171 """); 176 """).then((compiler) {
172 var container = ensure(compiler, "Class", compiler.coreLibrary.find, 177 var container = ensure(compiler, "Class", compiler.coreLibrary.find,
173 expectIsPatched: true); 178 expectIsPatched: true);
174 container.parseNode(compiler); 179 container.parseNode(compiler);
175 ensure(compiler, "Class", compiler.coreLibrary.patch.find, 180 ensure(compiler, "Class", compiler.coreLibrary.patch.find,
176 expectIsPatch: true); 181 expectIsPatch: true);
177 182
178 ensure(compiler, "toString", container.lookupLocalMember, 183 ensure(compiler, "toString", container.lookupLocalMember,
179 expectIsPatched: true, checkHasBody: true); 184 expectIsPatched: true, checkHasBody: true);
180 ensure(compiler, "toString", container.patch.lookupLocalMember, 185 ensure(compiler, "toString", container.patch.lookupLocalMember,
181 expectIsPatch: true, checkHasBody: true); 186 expectIsPatch: true, checkHasBody: true);
182 187
183 Expect.isTrue(compiler.warnings.isEmpty, 188 Expect.isTrue(compiler.warnings.isEmpty,
184 "Unexpected warnings: ${compiler.warnings}"); 189 "Unexpected warnings: ${compiler.warnings}");
185 Expect.isTrue(compiler.errors.isEmpty, 190 Expect.isTrue(compiler.errors.isEmpty,
186 "Unexpected errors: ${compiler.errors}"); 191 "Unexpected errors: ${compiler.errors}");
192 });
187 } 193 }
188 194
189 testPatchGetter() { 195 testPatchGetter() {
190 var compiler = applyPatch( 196 applyPatch(
191 """ 197 """
192 class Class { 198 class Class {
193 external int get field; 199 external int get field;
194 } 200 }
195 """, 201 """,
196 """ 202 """
197 patch class Class { 203 patch class Class {
198 patch int get field => 5; 204 patch int get field => 5;
199 } 205 }
200 """); 206 """).then((compiler) {
201 var container = ensure(compiler, "Class", compiler.coreLibrary.find, 207 var container = ensure(compiler, "Class", compiler.coreLibrary.find,
202 expectIsPatched: true); 208 expectIsPatched: true);
203 container.parseNode(compiler); 209 container.parseNode(compiler);
204 ensure(compiler, 210 ensure(compiler,
205 "field", 211 "field",
206 container.lookupLocalMember, 212 container.lookupLocalMember,
207 expectIsGetter: true, 213 expectIsGetter: true,
208 expectIsPatched: true, 214 expectIsPatched: true,
209 checkHasBody: true); 215 checkHasBody: true);
210 ensure(compiler, 216 ensure(compiler,
211 "field", 217 "field",
212 container.patch.lookupLocalMember, 218 container.patch.lookupLocalMember,
213 expectIsGetter: true, 219 expectIsGetter: true,
214 expectIsPatch: true, 220 expectIsPatch: true,
215 checkHasBody: true); 221 checkHasBody: true);
216 222
217 Expect.isTrue(compiler.warnings.isEmpty, 223 Expect.isTrue(compiler.warnings.isEmpty,
218 "Unexpected warnings: ${compiler.warnings}"); 224 "Unexpected warnings: ${compiler.warnings}");
219 Expect.isTrue(compiler.errors.isEmpty, 225 Expect.isTrue(compiler.errors.isEmpty,
220 "Unexpected errors: ${compiler.errors}"); 226 "Unexpected errors: ${compiler.errors}");
227 });
221 } 228 }
222 229
223 testRegularMember() { 230 testRegularMember() {
224 var compiler = applyPatch( 231 applyPatch(
225 """ 232 """
226 class Class { 233 class Class {
227 void regular() {} 234 void regular() {}
228 } 235 }
229 """, 236 """,
230 """ 237 """
231 patch class Class { 238 patch class Class {
232 } 239 }
233 """); 240 """).then((compiler) {
234 var container = ensure(compiler, "Class", compiler.coreLibrary.find, 241 var container = ensure(compiler, "Class", compiler.coreLibrary.find,
235 expectIsPatched: true); 242 expectIsPatched: true);
236 container.parseNode(compiler); 243 container.parseNode(compiler);
237 ensure(compiler, "Class", compiler.coreLibrary.patch.find, 244 ensure(compiler, "Class", compiler.coreLibrary.patch.find,
238 expectIsPatch: true); 245 expectIsPatch: true);
239 246
240 ensure(compiler, "regular", container.lookupLocalMember, 247 ensure(compiler, "regular", container.lookupLocalMember,
241 checkHasBody: true, expectIsRegular: true); 248 checkHasBody: true, expectIsRegular: true);
242 ensure(compiler, "regular", container.patch.lookupLocalMember, 249 ensure(compiler, "regular", container.patch.lookupLocalMember,
243 checkHasBody: true, expectIsRegular: true); 250 checkHasBody: true, expectIsRegular: true);
244 251
245 Expect.isTrue(compiler.warnings.isEmpty, 252 Expect.isTrue(compiler.warnings.isEmpty,
246 "Unexpected warnings: ${compiler.warnings}"); 253 "Unexpected warnings: ${compiler.warnings}");
247 Expect.isTrue(compiler.errors.isEmpty, 254 Expect.isTrue(compiler.errors.isEmpty,
248 "Unexpected errors: ${compiler.errors}"); 255 "Unexpected errors: ${compiler.errors}");
256 });
249 } 257 }
250 258
251 testGhostMember() { 259 testGhostMember() {
252 var compiler = applyPatch( 260 applyPatch(
253 """ 261 """
254 class Class { 262 class Class {
255 } 263 }
256 """, 264 """,
257 """ 265 """
258 patch class Class { 266 patch class Class {
259 void ghost() {} 267 void ghost() {}
260 } 268 }
261 """); 269 """).then((compiler) {
262 var container = ensure(compiler, "Class", compiler.coreLibrary.find, 270 var container = ensure(compiler, "Class", compiler.coreLibrary.find,
263 expectIsPatched: true); 271 expectIsPatched: true);
264 container.parseNode(compiler); 272 container.parseNode(compiler);
265 ensure(compiler, "Class", compiler.coreLibrary.patch.find, 273 ensure(compiler, "Class", compiler.coreLibrary.patch.find,
266 expectIsPatch: true); 274 expectIsPatch: true);
267 275
268 ensure(compiler, "ghost", container.lookupLocalMember, 276 ensure(compiler, "ghost", container.lookupLocalMember,
269 expectIsFound: false); 277 expectIsFound: false);
270 ensure(compiler, "ghost", container.patch.lookupLocalMember, 278 ensure(compiler, "ghost", container.patch.lookupLocalMember,
271 checkHasBody: true, expectIsRegular: true); 279 checkHasBody: true, expectIsRegular: true);
272 280
273 Expect.isTrue(compiler.warnings.isEmpty, 281 Expect.isTrue(compiler.warnings.isEmpty,
274 "Unexpected warnings: ${compiler.warnings}"); 282 "Unexpected warnings: ${compiler.warnings}");
275 Expect.isTrue(compiler.errors.isEmpty, 283 Expect.isTrue(compiler.errors.isEmpty,
276 "Unexpected errors: ${compiler.errors}"); 284 "Unexpected errors: ${compiler.errors}");
285 });
277 } 286 }
278 287
279 testInjectFunction() { 288 testInjectFunction() {
280 var compiler = applyPatch( 289 applyPatch(
281 "", 290 "",
282 "int _function() => 5;"); 291 "int _function() => 5;").then((compiler) {
283 ensure(compiler, 292 ensure(compiler,
284 "_function", 293 "_function",
285 compiler.coreLibrary.find, 294 compiler.coreLibrary.find,
286 expectIsFound: false); 295 expectIsFound: false);
287 ensure(compiler, 296 ensure(compiler,
288 "_function", 297 "_function",
289 compiler.coreLibrary.patch.find, 298 compiler.coreLibrary.patch.find,
290 checkHasBody: true, expectIsRegular: true); 299 checkHasBody: true, expectIsRegular: true);
291 300
292 Expect.isTrue(compiler.warnings.isEmpty, 301 Expect.isTrue(compiler.warnings.isEmpty,
293 "Unexpected warnings: ${compiler.warnings}"); 302 "Unexpected warnings: ${compiler.warnings}");
294 Expect.isTrue(compiler.errors.isEmpty, 303 Expect.isTrue(compiler.errors.isEmpty,
295 "Unexpected errors: ${compiler.errors}"); 304 "Unexpected errors: ${compiler.errors}");
305 });
296 } 306 }
297 307
298 testPatchSignatureCheck() { 308 testPatchSignatureCheck() {
299 var compiler = applyPatch( 309 applyPatch(
300 """ 310 """
301 class Class { 311 class Class {
302 external String method1(); 312 external String method1();
303 external void method2(String str); 313 external void method2(String str);
304 external void method3(String s1); 314 external void method3(String s1);
305 external void method4([String str]); 315 external void method4([String str]);
306 external void method5({String str}); 316 external void method5({String str});
307 external void method6({String str}); 317 external void method6({String str});
308 external void method7([String s1]); 318 external void method7([String s1]);
309 external void method8({String s1}); 319 external void method8({String s1});
310 external void method9(String str); 320 external void method9(String str);
311 external void method10([String str]); 321 external void method10([String str]);
312 external void method11({String str}); 322 external void method11({String str});
313 } 323 }
314 """, 324 """,
315 """ 325 """
316 patch class Class { 326 patch class Class {
317 patch int method1() => 0; 327 patch int method1() => 0;
318 patch void method2() {} 328 patch void method2() {}
319 patch void method3(String s2) {} 329 patch void method3(String s2) {}
320 patch void method4([String str, int i]) {} 330 patch void method4([String str, int i]) {}
321 patch void method5() {} 331 patch void method5() {}
322 patch void method6([String str]) {} 332 patch void method6([String str]) {}
323 patch void method7([String s2]) {} 333 patch void method7([String s2]) {}
324 patch void method8({String s2}) {} 334 patch void method8({String s2}) {}
325 patch void method9(int str) {} 335 patch void method9(int str) {}
326 patch void method10([int str]) {} 336 patch void method10([int str]) {}
327 patch void method11({int str}) {} 337 patch void method11({int str}) {}
328 } 338 }
329 """); 339 """).then((compiler) {
330 var container = ensure(compiler, "Class", compiler.coreLibrary.find, 340 var container = ensure(compiler, "Class", compiler.coreLibrary.find,
331 expectIsPatched: true); 341 expectIsPatched: true);
332 container.ensureResolved(compiler); 342 container.ensureResolved(compiler);
333 container.parseNode(compiler); 343 container.parseNode(compiler);
334 344
335 void expect(String methodName, List warnings, List errors) { 345 void expect(String methodName, List warnings, List errors) {
336 compiler.warnings.clear(); 346 compiler.warnings.clear();
337 compiler.errors.clear(); 347 compiler.errors.clear();
338 compiler.resolver.resolveMethodElement( 348 compiler.resolver.resolveMethodElement(
339 ensure(compiler, methodName, container.lookupLocalMember, 349 ensure(compiler, methodName, container.lookupLocalMember,
340 expectIsPatched: true, checkHasBody: true)); 350 expectIsPatched: true, checkHasBody: true));
341 Expect.equals(warnings.length, compiler.warnings.length, 351 Expect.equals(warnings.length, compiler.warnings.length,
342 "Unexpected warnings: ${compiler.warnings} on $methodName"); 352 "Unexpected warnings: ${compiler.warnings} on $methodName");
343 for (int i = 0 ; i < warnings.length ; i++) { 353 for (int i = 0 ; i < warnings.length ; i++) {
344 Expect.equals(warnings[i], compiler.warnings[i].message.kind); 354 Expect.equals(warnings[i], compiler.warnings[i].message.kind);
355 }
356 Expect.equals(errors.length, compiler.errors.length,
357 "Unexpected errors: ${compiler.errors} on $methodName");
358 for (int i = 0 ; i < errors.length ; i++) {
359 Expect.equals(errors[i], compiler.errors[i].message.kind);
360 }
345 } 361 }
346 Expect.equals(errors.length, compiler.errors.length,
347 "Unexpected errors: ${compiler.errors} on $methodName");
348 for (int i = 0 ; i < errors.length ; i++) {
349 Expect.equals(errors[i], compiler.errors[i].message.kind);
350 }
351 }
352 362
353 expect("method1", [], [MessageKind.PATCH_RETURN_TYPE_MISMATCH]); 363 expect("method1", [], [MessageKind.PATCH_RETURN_TYPE_MISMATCH]);
354 expect("method2", [], [MessageKind.PATCH_REQUIRED_PARAMETER_COUNT_MISMATCH]); 364 expect("method2", [],
355 expect("method3", [MessageKind.PATCH_POINT_TO_PARAMETER], 365 [MessageKind.PATCH_REQUIRED_PARAMETER_COUNT_MISMATCH]);
356 [MessageKind.PATCH_PARAMETER_MISMATCH]); 366 expect("method3", [MessageKind.PATCH_POINT_TO_PARAMETER],
357 expect("method4", [], [MessageKind.PATCH_OPTIONAL_PARAMETER_COUNT_MISMATCH]); 367 [MessageKind.PATCH_PARAMETER_MISMATCH]);
358 expect("method5", [], [MessageKind.PATCH_OPTIONAL_PARAMETER_COUNT_MISMATCH]); 368 expect("method4", [],
359 expect("method6", [], [MessageKind.PATCH_OPTIONAL_PARAMETER_NAMED_MISMATCH]); 369 [MessageKind.PATCH_OPTIONAL_PARAMETER_COUNT_MISMATCH]);
360 expect("method7", [MessageKind.PATCH_POINT_TO_PARAMETER], 370 expect("method5", [],
361 [MessageKind.PATCH_PARAMETER_MISMATCH]); 371 [MessageKind.PATCH_OPTIONAL_PARAMETER_COUNT_MISMATCH]);
362 expect("method8", [MessageKind.PATCH_POINT_TO_PARAMETER], 372 expect("method6", [],
363 [MessageKind.PATCH_PARAMETER_MISMATCH]); 373 [MessageKind.PATCH_OPTIONAL_PARAMETER_NAMED_MISMATCH]);
364 expect("method9", [MessageKind.PATCH_POINT_TO_PARAMETER], 374 expect("method7", [MessageKind.PATCH_POINT_TO_PARAMETER],
365 [MessageKind.PATCH_PARAMETER_TYPE_MISMATCH]); 375 [MessageKind.PATCH_PARAMETER_MISMATCH]);
366 expect("method10", [MessageKind.PATCH_POINT_TO_PARAMETER], 376 expect("method8", [MessageKind.PATCH_POINT_TO_PARAMETER],
367 [MessageKind.PATCH_PARAMETER_TYPE_MISMATCH]); 377 [MessageKind.PATCH_PARAMETER_MISMATCH]);
368 expect("method11", [MessageKind.PATCH_POINT_TO_PARAMETER], 378 expect("method9", [MessageKind.PATCH_POINT_TO_PARAMETER],
369 [MessageKind.PATCH_PARAMETER_TYPE_MISMATCH]); 379 [MessageKind.PATCH_PARAMETER_TYPE_MISMATCH]);
380 expect("method10", [MessageKind.PATCH_POINT_TO_PARAMETER],
381 [MessageKind.PATCH_PARAMETER_TYPE_MISMATCH]);
382 expect("method11", [MessageKind.PATCH_POINT_TO_PARAMETER],
383 [MessageKind.PATCH_PARAMETER_TYPE_MISMATCH]);
384 });
370 } 385 }
371 386
372 testExternalWithoutImplementationTopLevel() { 387 testExternalWithoutImplementationTopLevel() {
373 var compiler = applyPatch( 388 applyPatch(
374 """ 389 """
375 external void foo(); 390 external void foo();
376 """, 391 """,
377 """ 392 """
378 // patch void foo() {} 393 // patch void foo() {}
379 """); 394 """).then((compiler) {
380 var function = ensure(compiler, "foo", compiler.coreLibrary.find); 395 var function = ensure(compiler, "foo", compiler.coreLibrary.find);
381 compiler.resolver.resolve(function); 396 compiler.resolver.resolve(function);
382 Expect.isTrue(compiler.warnings.isEmpty, 397 Expect.isTrue(compiler.warnings.isEmpty,
383 "Unexpected warnings: ${compiler.warnings}"); 398 "Unexpected warnings: ${compiler.warnings}");
384 print('testExternalWithoutImplementationTopLevel:${compiler.errors}'); 399 print('testExternalWithoutImplementationTopLevel:${compiler.errors}');
385 Expect.equals(1, compiler.errors.length); 400 Expect.equals(1, compiler.errors.length);
386 Expect.isTrue( 401 Expect.isTrue(
387 compiler.errors[0].message.kind == 402 compiler.errors[0].message.kind ==
388 MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION); 403 MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION);
389 Expect.equals('External method without an implementation.', 404 Expect.equals('External method without an implementation.',
390 compiler.errors[0].message.toString()); 405 compiler.errors[0].message.toString());
406 });
391 } 407 }
392 408
393 testExternalWithoutImplementationMember() { 409 testExternalWithoutImplementationMember() {
394 var compiler = applyPatch( 410 applyPatch(
395 """ 411 """
396 class Class { 412 class Class {
397 external void foo(); 413 external void foo();
398 } 414 }
399 """, 415 """,
400 """ 416 """
401 patch class Class { 417 patch class Class {
402 // patch void foo() {} 418 // patch void foo() {}
403 } 419 }
404 """); 420 """).then((compiler) {
405 var container = ensure(compiler, "Class", compiler.coreLibrary.find, 421 var container = ensure(compiler, "Class", compiler.coreLibrary.find,
406 expectIsPatched: true); 422 expectIsPatched: true);
407 container.parseNode(compiler); 423 container.parseNode(compiler);
408 424
409 compiler.warnings.clear(); 425 compiler.warnings.clear();
410 compiler.errors.clear(); 426 compiler.errors.clear();
411 compiler.resolver.resolveMethodElement( 427 compiler.resolver.resolveMethodElement(
412 ensure(compiler, "foo", container.lookupLocalMember)); 428 ensure(compiler, "foo", container.lookupLocalMember));
413 Expect.isTrue(compiler.warnings.isEmpty, 429 Expect.isTrue(compiler.warnings.isEmpty,
414 "Unexpected warnings: ${compiler.warnings}"); 430 "Unexpected warnings: ${compiler.warnings}");
415 print('testExternalWithoutImplementationMember:${compiler.errors}'); 431 print('testExternalWithoutImplementationMember:${compiler.errors}');
416 Expect.equals(1, compiler.errors.length); 432 Expect.equals(1, compiler.errors.length);
417 Expect.isTrue( 433 Expect.isTrue(
418 compiler.errors[0].message.kind == 434 compiler.errors[0].message.kind ==
419 MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION); 435 MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION);
420 Expect.equals('External method without an implementation.', 436 Expect.equals('External method without an implementation.',
421 compiler.errors[0].message.toString()); 437 compiler.errors[0].message.toString());
438 });
422 } 439 }
423 440
424 testIsSubclass() { 441 testIsSubclass() {
425 var compiler = applyPatch( 442 applyPatch(
426 """ 443 """
427 class A {} 444 class A {}
428 """, 445 """,
429 """ 446 """
430 patch class A {} 447 patch class A {}
431 """); 448 """).then((compiler) {
432 ClassElement cls = ensure(compiler, "A", compiler.coreLibrary.find, 449 ClassElement cls = ensure(compiler, "A", compiler.coreLibrary.find,
433 expectIsPatched: true); 450 expectIsPatched: true);
434 ClassElement patch = cls.patch; 451 ClassElement patch = cls.patch;
435 Expect.isTrue(cls != patch); 452 Expect.isTrue(cls != patch);
436 Expect.isTrue(cls.isSubclassOf(patch)); 453 Expect.isTrue(cls.isSubclassOf(patch));
437 Expect.isTrue(patch.isSubclassOf(cls)); 454 Expect.isTrue(patch.isSubclassOf(cls));
455 });
438 } 456 }
439 457
440 testPatchNonExistingTopLevel() { 458 testPatchNonExistingTopLevel() {
441 var compiler = applyPatch( 459 applyPatch(
442 """ 460 """
443 // class Class {} 461 // class Class {}
444 """, 462 """,
445 """ 463 """
446 patch class Class {} 464 patch class Class {}
447 """); 465 """).then((compiler) {
448 Expect.isTrue(compiler.warnings.isEmpty, 466 Expect.isTrue(compiler.warnings.isEmpty,
449 "Unexpected warnings: ${compiler.warnings}"); 467 "Unexpected warnings: ${compiler.warnings}");
450 print('testPatchNonExistingTopLevel:${compiler.errors}'); 468 print('testPatchNonExistingTopLevel:${compiler.errors}');
451 Expect.equals(1, compiler.errors.length); 469 Expect.equals(1, compiler.errors.length);
452 Expect.isTrue( 470 Expect.isTrue(
453 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXISTING); 471 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXISTING);
472 });
454 } 473 }
455 474
456 testPatchNonExistingMember() { 475 testPatchNonExistingMember() {
457 var compiler = applyPatch( 476 applyPatch(
458 """ 477 """
459 class Class {} 478 class Class {}
460 """, 479 """,
461 """ 480 """
462 patch class Class { 481 patch class Class {
463 patch void foo() {} 482 patch void foo() {}
464 } 483 }
465 """); 484 """).then((compiler) {
466 var container = ensure(compiler, "Class", compiler.coreLibrary.find, 485 var container = ensure(compiler, "Class", compiler.coreLibrary.find,
467 expectIsPatched: true); 486 expectIsPatched: true);
468 container.parseNode(compiler); 487 container.parseNode(compiler);
469 488
470 Expect.isTrue(compiler.warnings.isEmpty, 489 Expect.isTrue(compiler.warnings.isEmpty,
471 "Unexpected warnings: ${compiler.warnings}"); 490 "Unexpected warnings: ${compiler.warnings}");
472 print('testPatchNonExistingMember:${compiler.errors}'); 491 print('testPatchNonExistingMember:${compiler.errors}');
473 Expect.equals(1, compiler.errors.length); 492 Expect.equals(1, compiler.errors.length);
474 Expect.isTrue( 493 Expect.isTrue(
475 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXISTING); 494 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXISTING);
495 });
476 } 496 }
477 497
478 testPatchNonPatchablePatch() { 498 testPatchNonPatchablePatch() {
479 var compiler = applyPatch( 499 applyPatch(
480 """ 500 """
481 external get foo; 501 external get foo;
482 """, 502 """,
483 """ 503 """
484 patch var foo; 504 patch var foo;
485 """); 505 """).then((compiler) {
486 ensure(compiler, "foo", compiler.coreLibrary.find); 506 ensure(compiler, "foo", compiler.coreLibrary.find);
487 507
488 Expect.isTrue(compiler.warnings.isEmpty, 508 Expect.isTrue(compiler.warnings.isEmpty,
489 "Unexpected warnings: ${compiler.warnings}"); 509 "Unexpected warnings: ${compiler.warnings}");
490 print('testPatchNonPatchablePatch:${compiler.errors}'); 510 print('testPatchNonPatchablePatch:${compiler.errors}');
491 Expect.equals(1, compiler.errors.length); 511 Expect.equals(1, compiler.errors.length);
492 Expect.isTrue( 512 Expect.isTrue(
493 compiler.errors[0].message.kind == MessageKind.PATCH_NONPATCHABLE); 513 compiler.errors[0].message.kind == MessageKind.PATCH_NONPATCHABLE);
514 });
494 } 515 }
495 516
496 testPatchNonPatchableOrigin() { 517 testPatchNonPatchableOrigin() {
497 var compiler = applyPatch( 518 applyPatch(
498 """ 519 """
499 external var foo; 520 external var foo;
500 """, 521 """,
501 """ 522 """
502 patch get foo => 0; 523 patch get foo => 0;
503 """); 524 """).then((compiler) {
504 ensure(compiler, "foo", compiler.coreLibrary.find); 525 ensure(compiler, "foo", compiler.coreLibrary.find);
505 526
506 Expect.isTrue(compiler.warnings.isEmpty, 527 Expect.isTrue(compiler.warnings.isEmpty,
507 "Unexpected warnings: ${compiler.warnings}"); 528 "Unexpected warnings: ${compiler.warnings}");
508 print('testPatchNonPatchableOrigin:${compiler.errors}'); 529 print('testPatchNonPatchableOrigin:${compiler.errors}');
509 Expect.equals(1, compiler.errors.length); 530 Expect.equals(1, compiler.errors.length);
510 Expect.isTrue( 531 Expect.isTrue(
511 compiler.errors[0].message.kind == MessageKind.PATCH_NONPATCHABLE); 532 compiler.errors[0].message.kind == MessageKind.PATCH_NONPATCHABLE);
533 });
512 } 534 }
513 535
514 testPatchNonExternalTopLevel() { 536 testPatchNonExternalTopLevel() {
515 var compiler = applyPatch( 537 applyPatch(
516 """ 538 """
517 void foo() {} 539 void foo() {}
518 """, 540 """,
519 """ 541 """
520 patch void foo() {} 542 patch void foo() {}
521 """); 543 """).then((compiler) {
522 print('testPatchNonExternalTopLevel.errors:${compiler.errors}'); 544 print('testPatchNonExternalTopLevel.errors:${compiler.errors}');
523 print('testPatchNonExternalTopLevel.warnings:${compiler.warnings}'); 545 print('testPatchNonExternalTopLevel.warnings:${compiler.warnings}');
524 Expect.equals(1, compiler.errors.length); 546 Expect.equals(1, compiler.errors.length);
525 Expect.isTrue( 547 Expect.isTrue(
526 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXTERNAL); 548 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXTERNAL);
527 Expect.equals(1, compiler.warnings.length); 549 Expect.equals(1, compiler.warnings.length);
528 Expect.isTrue( 550 Expect.isTrue(compiler.warnings[0].message.kind ==
529 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_FUNCTION); 551 MessageKind.PATCH_POINT_TO_FUNCTION);
552 });
530 } 553 }
531 554
532 testPatchNonExternalMember() { 555 testPatchNonExternalMember() {
533 var compiler = applyPatch( 556 applyPatch(
534 """ 557 """
535 class Class { 558 class Class {
536 void foo() {} 559 void foo() {}
537 } 560 }
538 """, 561 """,
539 """ 562 """
540 patch class Class { 563 patch class Class {
541 patch void foo() {} 564 patch void foo() {}
542 } 565 }
543 """); 566 """).then((compiler) {
544 var container = ensure(compiler, "Class", compiler.coreLibrary.find, 567 var container = ensure(compiler, "Class", compiler.coreLibrary.find,
545 expectIsPatched: true); 568 expectIsPatched: true);
546 container.parseNode(compiler); 569 container.parseNode(compiler);
547 570
548 print('testPatchNonExternalMember.errors:${compiler.errors}'); 571 print('testPatchNonExternalMember.errors:${compiler.errors}');
549 print('testPatchNonExternalMember.warnings:${compiler.warnings}'); 572 print('testPatchNonExternalMember.warnings:${compiler.warnings}');
550 Expect.equals(1, compiler.errors.length); 573 Expect.equals(1, compiler.errors.length);
551 Expect.isTrue( 574 Expect.isTrue(
552 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXTERNAL); 575 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXTERNAL);
553 Expect.equals(1, compiler.warnings.length); 576 Expect.equals(1, compiler.warnings.length);
554 Expect.isTrue( 577 Expect.isTrue(compiler.warnings[0].message.kind ==
555 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_FUNCTION); 578 MessageKind.PATCH_POINT_TO_FUNCTION);
579 });
556 } 580 }
557 581
558 testPatchNonClass() { 582 testPatchNonClass() {
559 var compiler = applyPatch( 583 applyPatch(
560 """ 584 """
561 external void Class() {} 585 external void Class() {}
562 """, 586 """,
563 """ 587 """
564 patch class Class {} 588 patch class Class {}
565 """); 589 """).then((compiler) {
566 print('testPatchNonClass.errors:${compiler.errors}'); 590 print('testPatchNonClass.errors:${compiler.errors}');
567 print('testPatchNonClass.warnings:${compiler.warnings}'); 591 print('testPatchNonClass.warnings:${compiler.warnings}');
568 Expect.equals(1, compiler.errors.length); 592 Expect.equals(1, compiler.errors.length);
569 Expect.isTrue( 593 Expect.isTrue(
570 compiler.errors[0].message.kind == MessageKind.PATCH_NON_CLASS); 594 compiler.errors[0].message.kind == MessageKind.PATCH_NON_CLASS);
571 Expect.equals(1, compiler.warnings.length); 595 Expect.equals(1, compiler.warnings.length);
572 Expect.isTrue( 596 Expect.isTrue(
573 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_CLASS); 597 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_CLASS);
598 });
574 } 599 }
575 600
576 testPatchNonGetter() { 601 testPatchNonGetter() {
577 var compiler = applyPatch( 602 applyPatch(
578 """ 603 """
579 external void foo() {} 604 external void foo() {}
580 """, 605 """,
581 """ 606 """
582 patch get foo => 0; 607 patch get foo => 0;
583 """); 608 """).then((compiler) {
584 print('testPatchNonClass.errors:${compiler.errors}'); 609 print('testPatchNonClass.errors:${compiler.errors}');
585 print('testPatchNonClass.warnings:${compiler.warnings}'); 610 print('testPatchNonClass.warnings:${compiler.warnings}');
586 Expect.equals(1, compiler.errors.length); 611 Expect.equals(1, compiler.errors.length);
587 Expect.isTrue( 612 Expect.isTrue(
588 compiler.errors[0].message.kind == MessageKind.PATCH_NON_GETTER); 613 compiler.errors[0].message.kind == MessageKind.PATCH_NON_GETTER);
589 Expect.equals(1, compiler.warnings.length); 614 Expect.equals(1, compiler.warnings.length);
590 Expect.isTrue( 615 Expect.isTrue(
591 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_GETTER); 616 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_GETTER);
617 });
592 } 618 }
593 619
594 testPatchNoGetter() { 620 testPatchNoGetter() {
595 var compiler = applyPatch( 621 applyPatch(
596 """ 622 """
597 external set foo(var value) {} 623 external set foo(var value) {}
598 """, 624 """,
599 """ 625 """
600 patch get foo => 0; 626 patch get foo => 0;
601 """); 627 """).then((compiler) {
602 print('testPatchNonClass.errors:${compiler.errors}'); 628 print('testPatchNonClass.errors:${compiler.errors}');
603 print('testPatchNonClass.warnings:${compiler.warnings}'); 629 print('testPatchNonClass.warnings:${compiler.warnings}');
604 Expect.equals(1, compiler.errors.length); 630 Expect.equals(1, compiler.errors.length);
605 Expect.isTrue( 631 Expect.isTrue(
606 compiler.errors[0].message.kind == MessageKind.PATCH_NO_GETTER); 632 compiler.errors[0].message.kind == MessageKind.PATCH_NO_GETTER);
607 Expect.equals(1, compiler.warnings.length); 633 Expect.equals(1, compiler.warnings.length);
608 Expect.isTrue( 634 Expect.isTrue(
609 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_GETTER); 635 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_GETTER);
636 });
610 } 637 }
611 638
612 testPatchNonSetter() { 639 testPatchNonSetter() {
613 var compiler = applyPatch( 640 applyPatch(
614 """ 641 """
615 external void foo() {} 642 external void foo() {}
616 """, 643 """,
617 """ 644 """
618 patch set foo(var value) {} 645 patch set foo(var value) {}
619 """); 646 """).then((compiler) {
620 print('testPatchNonClass.errors:${compiler.errors}'); 647 print('testPatchNonClass.errors:${compiler.errors}');
621 print('testPatchNonClass.warnings:${compiler.warnings}'); 648 print('testPatchNonClass.warnings:${compiler.warnings}');
622 Expect.equals(1, compiler.errors.length); 649 Expect.equals(1, compiler.errors.length);
623 Expect.isTrue( 650 Expect.isTrue(
624 compiler.errors[0].message.kind == MessageKind.PATCH_NON_SETTER); 651 compiler.errors[0].message.kind == MessageKind.PATCH_NON_SETTER);
625 Expect.equals(1, compiler.warnings.length); 652 Expect.equals(1, compiler.warnings.length);
626 Expect.isTrue( 653 Expect.isTrue(
627 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_SETTER); 654 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_SETTER);
655 });
628 } 656 }
629 657
630 testPatchNoSetter() { 658 testPatchNoSetter() {
631 var compiler = applyPatch( 659 applyPatch(
632 """ 660 """
633 external get foo; 661 external get foo;
634 """, 662 """,
635 """ 663 """
636 patch set foo(var value) {} 664 patch set foo(var value) {}
637 """); 665 """).then((compiler) {
638 print('testPatchNonClass.errors:${compiler.errors}'); 666 print('testPatchNonClass.errors:${compiler.errors}');
639 print('testPatchNonClass.warnings:${compiler.warnings}'); 667 print('testPatchNonClass.warnings:${compiler.warnings}');
640 Expect.equals(1, compiler.errors.length); 668 Expect.equals(1, compiler.errors.length);
641 Expect.isTrue( 669 Expect.isTrue(
642 compiler.errors[0].message.kind == MessageKind.PATCH_NO_SETTER); 670 compiler.errors[0].message.kind == MessageKind.PATCH_NO_SETTER);
643 Expect.equals(1, compiler.warnings.length); 671 Expect.equals(1, compiler.warnings.length);
644 Expect.isTrue( 672 Expect.isTrue(
645 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_SETTER); 673 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_SETTER);
674 });
646 } 675 }
647 676
648 testPatchNonFunction() { 677 testPatchNonFunction() {
649 var compiler = applyPatch( 678 applyPatch(
650 """ 679 """
651 external get foo; 680 external get foo;
652 """, 681 """,
653 """ 682 """
654 patch void foo() {} 683 patch void foo() {}
655 """); 684 """).then((compiler) {
656 print('testPatchNonClass.errors:${compiler.errors}'); 685 print('testPatchNonClass.errors:${compiler.errors}');
657 print('testPatchNonClass.warnings:${compiler.warnings}'); 686 print('testPatchNonClass.warnings:${compiler.warnings}');
658 Expect.equals(1, compiler.errors.length); 687 Expect.equals(1, compiler.errors.length);
659 Expect.isTrue( 688 Expect.isTrue(
660 compiler.errors[0].message.kind == MessageKind.PATCH_NON_FUNCTION); 689 compiler.errors[0].message.kind == MessageKind.PATCH_NON_FUNCTION);
661 Expect.equals(1, compiler.warnings.length); 690 Expect.equals(1, compiler.warnings.length);
662 Expect.isTrue( 691 Expect.isTrue(
663 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_FUNCTION); 692 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_FUNCTION );
693 });
664 } 694 }
665 695
666 testPatchAndSelector() { 696 testPatchAndSelector() {
667 var compiler = applyPatch( 697 applyPatch(
668 """ 698 """
669 class A { 699 class A {
670 external void clear(); 700 external void clear();
671 } 701 }
672 class B extends A { 702 class B extends A {
673 } 703 }
674 """, 704 """,
675 """ 705 """
676 patch class A { 706 patch class A {
677 int method() => 0; 707 int method() => 0;
678 patch void clear() {} 708 patch void clear() {}
679 } 709 }
680 """); 710 """).then((compiler) {
681 ClassElement cls = ensure(compiler, "A", compiler.coreLibrary.find, 711 ClassElement cls = ensure(compiler, "A", compiler.coreLibrary.find,
682 expectIsPatched: true); 712 expectIsPatched: true);
683 cls.ensureResolved(compiler); 713 cls.ensureResolved(compiler);
684 714
685 ensure(compiler, "method", cls.patch.lookupLocalMember, 715 ensure(compiler, "method", cls.patch.lookupLocalMember,
686 checkHasBody: true, expectIsRegular: true); 716 checkHasBody: true, expectIsRegular: true);
687 717
688 ensure(compiler, "clear", cls.lookupLocalMember, 718 ensure(compiler, "clear", cls.lookupLocalMember,
689 checkHasBody: true, expectIsPatched: true); 719 checkHasBody: true, expectIsPatched: true);
690 720
691 compiler.phase = Compiler.PHASE_DONE_RESOLVING; 721 compiler.phase = Compiler.PHASE_DONE_RESOLVING;
692 722
693 // Check that a method just in the patch class is a target for a 723 // Check that a method just in the patch class is a target for a
694 // typed selector. 724 // typed selector.
695 var selector = new Selector.call( 725 var selector = new Selector.call(
696 buildSourceString('method'), compiler.coreLibrary, 0); 726 buildSourceString('method'), compiler.coreLibrary, 0);
697 var typedSelector = new TypedSelector.exact(cls.rawType, selector); 727 var typedSelector = new TypedSelector.exact(cls.rawType, selector);
698 Element method = 728 Element method =
699 cls.implementation.lookupLocalMember(buildSourceString('method')); 729 cls.implementation.lookupLocalMember(buildSourceString('method'));
700 Expect.isTrue(selector.applies(method, compiler)); 730 Expect.isTrue(selector.applies(method, compiler));
701 Expect.isTrue(typedSelector.applies(method, compiler)); 731 Expect.isTrue(typedSelector.applies(method, compiler));
702 732
703 // Check that the declaration method in the declaration class is a target 733 // Check that the declaration method in the declaration class is a target
704 // for a typed selector. 734 // for a typed selector.
705 selector = new Selector.call( 735 selector = new Selector.call(
706 buildSourceString('clear'), compiler.coreLibrary, 0); 736 buildSourceString('clear'), compiler.coreLibrary, 0);
707 typedSelector = new TypedSelector.exact(cls.rawType, selector); 737 typedSelector = new TypedSelector.exact(cls.rawType, selector);
708 method = cls.lookupLocalMember(buildSourceString('clear')); 738 method = cls.lookupLocalMember(buildSourceString('clear'));
709 Expect.isTrue(selector.applies(method, compiler)); 739 Expect.isTrue(selector.applies(method, compiler));
710 Expect.isTrue(typedSelector.applies(method, compiler)); 740 Expect.isTrue(typedSelector.applies(method, compiler));
711 741
712 // Check that the declaration method in the declaration class is a target 742 // Check that the declaration method in the declaration class is a target
713 // for a typed selector on a subclass. 743 // for a typed selector on a subclass.
714 cls = ensure(compiler, "B", compiler.coreLibrary.find); 744 cls = ensure(compiler, "B", compiler.coreLibrary.find);
715 cls.ensureResolved(compiler); 745 cls.ensureResolved(compiler);
716 typedSelector = new TypedSelector.exact(cls.rawType, selector); 746 typedSelector = new TypedSelector.exact(cls.rawType, selector);
717 Expect.isTrue(selector.applies(method, compiler)); 747 Expect.isTrue(selector.applies(method, compiler));
718 Expect.isTrue(typedSelector.applies(method, compiler)); 748 Expect.isTrue(typedSelector.applies(method, compiler));
749 });
719 } 750 }
720 751
721 void testAnalyzeAllInjectedMembers() { 752 void testAnalyzeAllInjectedMembers() {
722 void expect(String patchText, [expectedWarnings]) { 753 void expect(String patchText, [expectedWarnings]) {
723 if (expectedWarnings == null) expectedWarnings = []; 754 if (expectedWarnings == null) expectedWarnings = [];
724 if (expectedWarnings is! List) expectedWarnings = [expectedWarnings]; 755 if (expectedWarnings is! List) expectedWarnings = [expectedWarnings];
725 756
726 var compiler = applyPatch('', patchText, 757 applyPatch('', patchText, analyzeAll: true,
727 analyzeAll: true, analyzeOnly: true); 758 analyzeOnly: true).then((compiler) {
728 compiler.librariesToAnalyzeWhenRun = [Uri.parse('dart:core')]; 759 compiler.librariesToAnalyzeWhenRun = [Uri.parse('dart:core')];
729 compiler.runCompiler(null); 760 return compiler.runCompiler(null).then((_) {
730 compareWarningKinds(patchText, expectedWarnings, compiler.warnings); 761 compareWarningKinds(patchText, expectedWarnings, compiler.warnings);
762 });
763 });
731 } 764 }
732 765
733 expect('String s = 0;', MessageKind.NOT_ASSIGNABLE); 766 expect('String s = 0;', MessageKind.NOT_ASSIGNABLE);
734 expect('void method() { String s = 0; }', MessageKind.NOT_ASSIGNABLE); 767 expect('void method() { String s = 0; }', MessageKind.NOT_ASSIGNABLE);
735 expect(''' 768 expect('''
736 class Class { 769 class Class {
737 String s = 0; 770 String s = 0;
738 } 771 }
739 ''', 772 ''',
740 MessageKind.NOT_ASSIGNABLE); 773 MessageKind.NOT_ASSIGNABLE);
741 expect(''' 774 expect('''
742 class Class { 775 class Class {
743 void method() { 776 void method() {
744 String s = 0; 777 String s = 0;
745 } 778 }
746 } 779 }
747 ''', 780 ''',
748 MessageKind.NOT_ASSIGNABLE); 781 MessageKind.NOT_ASSIGNABLE);
749 } 782 }
750 783
751 void testTypecheckPatchedMembers() { 784 void testTypecheckPatchedMembers() {
752 String originText = "external void method();"; 785 String originText = "external void method();";
753 String patchText = """ 786 String patchText = """
754 patch void method() { 787 patch void method() {
755 String s = 0; 788 String s = 0;
756 } 789 }
757 """; 790 """;
758 var compiler = applyPatch(originText, patchText, 791 applyPatch(originText, patchText,
759 analyzeAll: true, analyzeOnly: true); 792 analyzeAll: true, analyzeOnly: true).then((compiler) {
760 compiler.librariesToAnalyzeWhenRun = [Uri.parse('dart:core')]; 793 compiler.librariesToAnalyzeWhenRun = [Uri.parse('dart:core')];
761 compiler.runCompiler(null); 794 return compiler.runCompiler(null).then((_) {
762 compareWarningKinds(patchText, 795 compareWarningKinds(patchText,
763 [MessageKind.NOT_ASSIGNABLE], compiler.warnings); 796 [MessageKind.NOT_ASSIGNABLE], compiler.warnings);
797 });
798 });
764 } 799 }
765 800
766 main() { 801 main() {
767 testPatchConstructor(); 802 testPatchConstructor();
768 testPatchFunction(); 803 testPatchFunction();
769 testPatchMember(); 804 testPatchMember();
770 testPatchGetter(); 805 testPatchGetter();
771 testRegularMember(); 806 testRegularMember();
772 testGhostMember(); 807 testGhostMember();
773 testInjectFunction(); 808 testInjectFunction();
(...skipping 15 matching lines...) Expand all
789 testPatchNoGetter(); 824 testPatchNoGetter();
790 testPatchNonSetter(); 825 testPatchNonSetter();
791 testPatchNoSetter(); 826 testPatchNoSetter();
792 testPatchNonFunction(); 827 testPatchNonFunction();
793 828
794 testPatchAndSelector(); 829 testPatchAndSelector();
795 830
796 testAnalyzeAllInjectedMembers(); 831 testAnalyzeAllInjectedMembers();
797 testTypecheckPatchedMembers(); 832 testTypecheckPatchedMembers();
798 } 833 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698