OLD | NEW |
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 'dart:async'; |
6 import "package:expect/expect.dart"; | 6 import "package:expect/expect.dart"; |
7 import "package:async_helper/async_helper.dart"; | 7 import "package:async_helper/async_helper.dart"; |
8 import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart"; | 8 import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart"; |
9 import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dar
t"; | 9 import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dar
t"; |
10 import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart"; | 10 import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart"; |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 expectHasBody(compiler, element); | 100 expectHasBody(compiler, element); |
101 } | 101 } |
102 } | 102 } |
103 Expect.isFalse(element.isPatched && element.isPatch); | 103 Expect.isFalse(element.isPatched && element.isPatch); |
104 return element; | 104 return element; |
105 } | 105 } |
106 | 106 |
107 testPatchFunction() { | 107 testPatchFunction() { |
108 asyncTest(() => applyPatch( | 108 asyncTest(() => applyPatch( |
109 "external test();", | 109 "external test();", |
110 "patch test() { return 'string'; } ").then((compiler) { | 110 "@patch test() { return 'string'; } ").then((compiler) { |
111 ensure(compiler, "test", compiler.coreLibrary.find, | 111 ensure(compiler, "test", compiler.coreLibrary.find, |
112 expectIsPatched: true, checkHasBody: true); | 112 expectIsPatched: true, checkHasBody: true); |
113 ensure(compiler, "test", compiler.coreLibrary.patch.find, | 113 ensure(compiler, "test", compiler.coreLibrary.patch.find, |
114 expectIsPatch: true, checkHasBody: true); | 114 expectIsPatch: true, checkHasBody: true); |
115 | 115 |
116 Expect.isTrue(compiler.warnings.isEmpty, | 116 Expect.isTrue(compiler.warnings.isEmpty, |
117 "Unexpected warnings: ${compiler.warnings}"); | 117 "Unexpected warnings: ${compiler.warnings}"); |
118 Expect.isTrue(compiler.errors.isEmpty, | 118 Expect.isTrue(compiler.errors.isEmpty, |
119 "Unexpected errors: ${compiler.errors}"); | 119 "Unexpected errors: ${compiler.errors}"); |
120 })); | 120 })); |
121 } | 121 } |
122 | 122 |
123 testPatchConstructor() { | 123 testPatchConstructor() { |
124 asyncTest(() => applyPatch( | 124 asyncTest(() => applyPatch( |
125 """ | 125 """ |
126 class Class { | 126 class Class { |
127 external Class(); | 127 external Class(); |
128 } | 128 } |
129 """, | 129 """, |
130 """ | 130 """ |
131 patch class Class { | 131 @patch class Class { |
132 patch Class(); | 132 @patch Class(); |
133 } | 133 } |
134 """).then((compiler) { | 134 """).then((compiler) { |
135 var classOrigin = ensure(compiler, "Class", compiler.coreLibrary.find, | 135 var classOrigin = ensure(compiler, "Class", compiler.coreLibrary.find, |
136 expectIsPatched: true); | 136 expectIsPatched: true); |
137 classOrigin.ensureResolved(compiler); | 137 classOrigin.ensureResolved(compiler); |
138 var classPatch = ensure(compiler, "Class", compiler.coreLibrary.patch.find, | 138 var classPatch = ensure(compiler, "Class", compiler.coreLibrary.patch.find, |
139 expectIsPatch: true); | 139 expectIsPatch: true); |
140 | 140 |
141 Expect.equals(classPatch, classOrigin.patch); | 141 Expect.equals(classPatch, classOrigin.patch); |
142 Expect.equals(classOrigin, classPatch.origin); | 142 Expect.equals(classOrigin, classPatch.origin); |
(...skipping 18 matching lines...) Expand all Loading... |
161 testPatchRedirectingConstructor() { | 161 testPatchRedirectingConstructor() { |
162 asyncTest(() => applyPatch( | 162 asyncTest(() => applyPatch( |
163 """ | 163 """ |
164 class Class { | 164 class Class { |
165 Class(x) : this._(x, false); | 165 Class(x) : this._(x, false); |
166 | 166 |
167 external Class._(x, y); | 167 external Class._(x, y); |
168 } | 168 } |
169 """, | 169 """, |
170 r""" | 170 r""" |
171 patch class Class { | 171 @patch class Class { |
172 patch Class._(x, y) { print('$x,$y'); } | 172 @patch Class._(x, y) { print('$x,$y'); } |
173 } | 173 } |
174 """).then((compiler) { | 174 """).then((compiler) { |
175 var classOrigin = ensure(compiler, "Class", compiler.coreLibrary.find, | 175 var classOrigin = ensure(compiler, "Class", compiler.coreLibrary.find, |
176 expectIsPatched: true); | 176 expectIsPatched: true); |
177 classOrigin.ensureResolved(compiler); | 177 classOrigin.ensureResolved(compiler); |
178 | 178 |
179 var classPatch = ensure(compiler, "Class", compiler.coreLibrary.patch.find, | 179 var classPatch = ensure(compiler, "Class", compiler.coreLibrary.patch.find, |
180 expectIsPatch: true); | 180 expectIsPatch: true); |
181 | 181 |
182 Expect.equals(classOrigin, classPatch.origin); | 182 Expect.equals(classOrigin, classPatch.origin); |
(...skipping 23 matching lines...) Expand all Loading... |
206 } | 206 } |
207 | 207 |
208 testPatchMember() { | 208 testPatchMember() { |
209 asyncTest(() => applyPatch( | 209 asyncTest(() => applyPatch( |
210 """ | 210 """ |
211 class Class { | 211 class Class { |
212 external String toString(); | 212 external String toString(); |
213 } | 213 } |
214 """, | 214 """, |
215 """ | 215 """ |
216 patch class Class { | 216 @patch class Class { |
217 patch String toString() => 'string'; | 217 @patch String toString() => 'string'; |
218 } | 218 } |
219 """).then((compiler) { | 219 """).then((compiler) { |
220 var container = ensure(compiler, "Class", compiler.coreLibrary.find, | 220 var container = ensure(compiler, "Class", compiler.coreLibrary.find, |
221 expectIsPatched: true); | 221 expectIsPatched: true); |
222 container.parseNode(compiler); | 222 container.parseNode(compiler); |
223 ensure(compiler, "Class", compiler.coreLibrary.patch.find, | 223 ensure(compiler, "Class", compiler.coreLibrary.patch.find, |
224 expectIsPatch: true); | 224 expectIsPatch: true); |
225 | 225 |
226 ensure(compiler, "toString", container.lookupLocalMember, | 226 ensure(compiler, "toString", container.lookupLocalMember, |
227 expectIsPatched: true, checkHasBody: true); | 227 expectIsPatched: true, checkHasBody: true); |
228 ensure(compiler, "toString", container.patch.lookupLocalMember, | 228 ensure(compiler, "toString", container.patch.lookupLocalMember, |
229 expectIsPatch: true, checkHasBody: true); | 229 expectIsPatch: true, checkHasBody: true); |
230 | 230 |
231 Expect.isTrue(compiler.warnings.isEmpty, | 231 Expect.isTrue(compiler.warnings.isEmpty, |
232 "Unexpected warnings: ${compiler.warnings}"); | 232 "Unexpected warnings: ${compiler.warnings}"); |
233 Expect.isTrue(compiler.errors.isEmpty, | 233 Expect.isTrue(compiler.errors.isEmpty, |
234 "Unexpected errors: ${compiler.errors}"); | 234 "Unexpected errors: ${compiler.errors}"); |
235 })); | 235 })); |
236 } | 236 } |
237 | 237 |
238 testPatchGetter() { | 238 testPatchGetter() { |
239 asyncTest(() => applyPatch( | 239 asyncTest(() => applyPatch( |
240 """ | 240 """ |
241 class Class { | 241 class Class { |
242 external int get field; | 242 external int get field; |
243 } | 243 } |
244 """, | 244 """, |
245 """ | 245 """ |
246 patch class Class { | 246 @patch class Class { |
247 patch int get field => 5; | 247 @patch int get field => 5; |
248 } | 248 } |
249 """).then((compiler) { | 249 """).then((compiler) { |
250 var container = ensure(compiler, "Class", compiler.coreLibrary.find, | 250 var container = ensure(compiler, "Class", compiler.coreLibrary.find, |
251 expectIsPatched: true); | 251 expectIsPatched: true); |
252 container.parseNode(compiler); | 252 container.parseNode(compiler); |
253 ensure(compiler, | 253 ensure(compiler, |
254 "field", | 254 "field", |
255 container.lookupLocalMember, | 255 container.lookupLocalMember, |
256 expectIsGetter: true, | 256 expectIsGetter: true, |
257 expectIsPatched: true, | 257 expectIsPatched: true, |
(...skipping 13 matching lines...) Expand all Loading... |
271 } | 271 } |
272 | 272 |
273 testRegularMember() { | 273 testRegularMember() { |
274 asyncTest(() => applyPatch( | 274 asyncTest(() => applyPatch( |
275 """ | 275 """ |
276 class Class { | 276 class Class { |
277 void regular() {} | 277 void regular() {} |
278 } | 278 } |
279 """, | 279 """, |
280 """ | 280 """ |
281 patch class Class { | 281 @patch class Class { |
282 } | 282 } |
283 """).then((compiler) { | 283 """).then((compiler) { |
284 var container = ensure(compiler, "Class", compiler.coreLibrary.find, | 284 var container = ensure(compiler, "Class", compiler.coreLibrary.find, |
285 expectIsPatched: true); | 285 expectIsPatched: true); |
286 container.parseNode(compiler); | 286 container.parseNode(compiler); |
287 ensure(compiler, "Class", compiler.coreLibrary.patch.find, | 287 ensure(compiler, "Class", compiler.coreLibrary.patch.find, |
288 expectIsPatch: true); | 288 expectIsPatch: true); |
289 | 289 |
290 ensure(compiler, "regular", container.lookupLocalMember, | 290 ensure(compiler, "regular", container.lookupLocalMember, |
291 checkHasBody: true, expectIsRegular: true); | 291 checkHasBody: true, expectIsRegular: true); |
292 ensure(compiler, "regular", container.patch.lookupLocalMember, | 292 ensure(compiler, "regular", container.patch.lookupLocalMember, |
293 checkHasBody: true, expectIsRegular: true); | 293 checkHasBody: true, expectIsRegular: true); |
294 | 294 |
295 Expect.isTrue(compiler.warnings.isEmpty, | 295 Expect.isTrue(compiler.warnings.isEmpty, |
296 "Unexpected warnings: ${compiler.warnings}"); | 296 "Unexpected warnings: ${compiler.warnings}"); |
297 Expect.isTrue(compiler.errors.isEmpty, | 297 Expect.isTrue(compiler.errors.isEmpty, |
298 "Unexpected errors: ${compiler.errors}"); | 298 "Unexpected errors: ${compiler.errors}"); |
299 })); | 299 })); |
300 } | 300 } |
301 | 301 |
302 testGhostMember() { | 302 testGhostMember() { |
303 asyncTest(() => applyPatch( | 303 asyncTest(() => applyPatch( |
304 """ | 304 """ |
305 class Class { | 305 class Class { |
306 } | 306 } |
307 """, | 307 """, |
308 """ | 308 """ |
309 patch class Class { | 309 @patch class Class { |
310 void ghost() {} | 310 void ghost() {} |
311 } | 311 } |
312 """).then((compiler) { | 312 """).then((compiler) { |
313 var container = ensure(compiler, "Class", compiler.coreLibrary.find, | 313 var container = ensure(compiler, "Class", compiler.coreLibrary.find, |
314 expectIsPatched: true); | 314 expectIsPatched: true); |
315 container.parseNode(compiler); | 315 container.parseNode(compiler); |
316 ensure(compiler, "Class", compiler.coreLibrary.patch.find, | 316 ensure(compiler, "Class", compiler.coreLibrary.patch.find, |
317 expectIsPatch: true); | 317 expectIsPatch: true); |
318 | 318 |
319 ensure(compiler, "ghost", container.lookupLocalMember, | 319 ensure(compiler, "ghost", container.lookupLocalMember, |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 external void method5({String str}); | 359 external void method5({String str}); |
360 external void method6({String str}); | 360 external void method6({String str}); |
361 external void method7([String s1]); | 361 external void method7([String s1]); |
362 external void method8({String s1}); | 362 external void method8({String s1}); |
363 external void method9(String str); | 363 external void method9(String str); |
364 external void method10([String str]); | 364 external void method10([String str]); |
365 external void method11({String str}); | 365 external void method11({String str}); |
366 } | 366 } |
367 """, | 367 """, |
368 """ | 368 """ |
369 patch class Class { | 369 @patch class Class { |
370 patch int method1() => 0; | 370 @patch int method1() => 0; |
371 patch void method2() {} | 371 @patch void method2() {} |
372 patch void method3(String s2) {} | 372 @patch void method3(String s2) {} |
373 patch void method4([String str, int i]) {} | 373 @patch void method4([String str, int i]) {} |
374 patch void method5() {} | 374 @patch void method5() {} |
375 patch void method6([String str]) {} | 375 @patch void method6([String str]) {} |
376 patch void method7([String s2]) {} | 376 @patch void method7([String s2]) {} |
377 patch void method8({String s2}) {} | 377 @patch void method8({String s2}) {} |
378 patch void method9(int str) {} | 378 @patch void method9(int str) {} |
379 patch void method10([int str]) {} | 379 @patch void method10([int str]) {} |
380 patch void method11({int str}) {} | 380 @patch void method11({int str}) {} |
381 } | 381 } |
382 """).then((compiler) { | 382 """).then((compiler) { |
383 var container = ensure(compiler, "Class", compiler.coreLibrary.find, | 383 var container = ensure(compiler, "Class", compiler.coreLibrary.find, |
384 expectIsPatched: true); | 384 expectIsPatched: true); |
385 container.ensureResolved(compiler); | 385 container.ensureResolved(compiler); |
386 container.parseNode(compiler); | 386 container.parseNode(compiler); |
387 | 387 |
388 void expect(String methodName, List infos, List errors) { | 388 void expect(String methodName, List infos, List errors) { |
389 compiler.clearMessages(); | 389 compiler.clearMessages(); |
390 compiler.resolver.resolveMethodElement( | 390 compiler.resolver.resolveMethodElement( |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
426 [MessageKind.PATCH_PARAMETER_TYPE_MISMATCH]); | 426 [MessageKind.PATCH_PARAMETER_TYPE_MISMATCH]); |
427 })); | 427 })); |
428 } | 428 } |
429 | 429 |
430 testExternalWithoutImplementationTopLevel() { | 430 testExternalWithoutImplementationTopLevel() { |
431 asyncTest(() => applyPatch( | 431 asyncTest(() => applyPatch( |
432 """ | 432 """ |
433 external void foo(); | 433 external void foo(); |
434 """, | 434 """, |
435 """ | 435 """ |
436 // patch void foo() {} | 436 // @patch void foo() {} |
437 """).then((compiler) { | 437 """).then((compiler) { |
438 var function = ensure(compiler, "foo", compiler.coreLibrary.find); | 438 var function = ensure(compiler, "foo", compiler.coreLibrary.find); |
439 compiler.resolver.resolve(function); | 439 compiler.resolver.resolve(function); |
440 Expect.isTrue(compiler.warnings.isEmpty, | 440 Expect.isTrue(compiler.warnings.isEmpty, |
441 "Unexpected warnings: ${compiler.warnings}"); | 441 "Unexpected warnings: ${compiler.warnings}"); |
442 print('testExternalWithoutImplementationTopLevel:${compiler.errors}'); | 442 print('testExternalWithoutImplementationTopLevel:${compiler.errors}'); |
443 Expect.equals(1, compiler.errors.length); | 443 Expect.equals(1, compiler.errors.length); |
444 Expect.isTrue( | 444 Expect.isTrue( |
445 compiler.errors[0].message.kind == | 445 compiler.errors[0].message.kind == |
446 MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION); | 446 MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION); |
447 Expect.stringEquals('External method without an implementation.', | 447 Expect.stringEquals('External method without an implementation.', |
448 compiler.errors[0].message.toString()); | 448 compiler.errors[0].message.toString()); |
449 })); | 449 })); |
450 } | 450 } |
451 | 451 |
452 testExternalWithoutImplementationMember() { | 452 testExternalWithoutImplementationMember() { |
453 asyncTest(() => applyPatch( | 453 asyncTest(() => applyPatch( |
454 """ | 454 """ |
455 class Class { | 455 class Class { |
456 external void foo(); | 456 external void foo(); |
457 } | 457 } |
458 """, | 458 """, |
459 """ | 459 """ |
460 patch class Class { | 460 @patch class Class { |
461 // patch void foo() {} | 461 // @patch void foo() {} |
462 } | 462 } |
463 """).then((compiler) { | 463 """).then((compiler) { |
464 var container = ensure(compiler, "Class", compiler.coreLibrary.find, | 464 var container = ensure(compiler, "Class", compiler.coreLibrary.find, |
465 expectIsPatched: true); | 465 expectIsPatched: true); |
466 container.parseNode(compiler); | 466 container.parseNode(compiler); |
467 | 467 |
468 compiler.warnings.clear(); | 468 compiler.warnings.clear(); |
469 compiler.errors.clear(); | 469 compiler.errors.clear(); |
470 compiler.resolver.resolveMethodElement( | 470 compiler.resolver.resolveMethodElement( |
471 ensure(compiler, "foo", container.lookupLocalMember)); | 471 ensure(compiler, "foo", container.lookupLocalMember)); |
472 Expect.isTrue(compiler.warnings.isEmpty, | 472 Expect.isTrue(compiler.warnings.isEmpty, |
473 "Unexpected warnings: ${compiler.warnings}"); | 473 "Unexpected warnings: ${compiler.warnings}"); |
474 print('testExternalWithoutImplementationMember:${compiler.errors}'); | 474 print('testExternalWithoutImplementationMember:${compiler.errors}'); |
475 Expect.equals(1, compiler.errors.length); | 475 Expect.equals(1, compiler.errors.length); |
476 Expect.isTrue( | 476 Expect.isTrue( |
477 compiler.errors[0].message.kind == | 477 compiler.errors[0].message.kind == |
478 MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION); | 478 MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION); |
479 Expect.stringEquals('External method without an implementation.', | 479 Expect.stringEquals('External method without an implementation.', |
480 compiler.errors[0].message.toString()); | 480 compiler.errors[0].message.toString()); |
481 })); | 481 })); |
482 } | 482 } |
483 | 483 |
484 testIsSubclass() { | 484 testIsSubclass() { |
485 asyncTest(() => applyPatch( | 485 asyncTest(() => applyPatch( |
486 """ | 486 """ |
487 class A {} | 487 class A {} |
488 """, | 488 """, |
489 """ | 489 """ |
490 patch class A {} | 490 @patch class A {} |
491 """).then((compiler) { | 491 """).then((compiler) { |
492 ClassElement cls = ensure(compiler, "A", compiler.coreLibrary.find, | 492 ClassElement cls = ensure(compiler, "A", compiler.coreLibrary.find, |
493 expectIsPatched: true); | 493 expectIsPatched: true); |
494 ClassElement patch = cls.patch; | 494 ClassElement patch = cls.patch; |
495 Expect.isTrue(cls != patch); | 495 Expect.isTrue(cls != patch); |
496 Expect.isTrue(cls.isSubclassOf(patch)); | 496 Expect.isTrue(cls.isSubclassOf(patch)); |
497 Expect.isTrue(patch.isSubclassOf(cls)); | 497 Expect.isTrue(patch.isSubclassOf(cls)); |
498 })); | 498 })); |
499 } | 499 } |
500 | 500 |
501 testPatchNonExistingTopLevel() { | 501 testPatchNonExistingTopLevel() { |
502 asyncTest(() => applyPatch( | 502 asyncTest(() => applyPatch( |
503 """ | 503 """ |
504 // class Class {} | 504 // class Class {} |
505 """, | 505 """, |
506 """ | 506 """ |
507 patch class Class {} | 507 @patch class Class {} |
508 """).then((compiler) { | 508 """).then((compiler) { |
509 Expect.isTrue(compiler.warnings.isEmpty, | 509 Expect.isTrue(compiler.warnings.isEmpty, |
510 "Unexpected warnings: ${compiler.warnings}"); | 510 "Unexpected warnings: ${compiler.warnings}"); |
511 print('testPatchNonExistingTopLevel:${compiler.errors}'); | 511 print('testPatchNonExistingTopLevel:${compiler.errors}'); |
512 Expect.equals(1, compiler.errors.length); | 512 Expect.equals(1, compiler.errors.length); |
513 Expect.isTrue( | 513 Expect.isTrue( |
514 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXISTING); | 514 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXISTING); |
515 })); | 515 })); |
516 } | 516 } |
517 | 517 |
518 testPatchNonExistingMember() { | 518 testPatchNonExistingMember() { |
519 asyncTest(() => applyPatch( | 519 asyncTest(() => applyPatch( |
520 """ | 520 """ |
521 class Class {} | 521 class Class {} |
522 """, | 522 """, |
523 """ | 523 """ |
524 patch class Class { | 524 @patch class Class { |
525 patch void foo() {} | 525 @patch void foo() {} |
526 } | 526 } |
527 """).then((compiler) { | 527 """).then((compiler) { |
528 var container = ensure(compiler, "Class", compiler.coreLibrary.find, | 528 var container = ensure(compiler, "Class", compiler.coreLibrary.find, |
529 expectIsPatched: true); | 529 expectIsPatched: true); |
530 container.parseNode(compiler); | 530 container.parseNode(compiler); |
531 | 531 |
532 Expect.isTrue(compiler.warnings.isEmpty, | 532 Expect.isTrue(compiler.warnings.isEmpty, |
533 "Unexpected warnings: ${compiler.warnings}"); | 533 "Unexpected warnings: ${compiler.warnings}"); |
534 print('testPatchNonExistingMember:${compiler.errors}'); | 534 print('testPatchNonExistingMember:${compiler.errors}'); |
535 Expect.equals(1, compiler.errors.length); | 535 Expect.equals(1, compiler.errors.length); |
536 Expect.isTrue( | 536 Expect.isTrue( |
537 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXISTING); | 537 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXISTING); |
538 })); | 538 })); |
539 } | 539 } |
540 | 540 |
541 testPatchNonPatchablePatch() { | 541 testPatchNonPatchablePatch() { |
542 asyncTest(() => applyPatch( | 542 asyncTest(() => applyPatch( |
543 """ | 543 """ |
544 external get foo; | 544 external get foo; |
545 """, | 545 """, |
546 """ | 546 """ |
547 patch var foo; | 547 @patch var foo; |
548 """).then((compiler) { | 548 """).then((compiler) { |
549 ensure(compiler, "foo", compiler.coreLibrary.find); | 549 ensure(compiler, "foo", compiler.coreLibrary.find); |
550 | 550 |
551 Expect.isTrue(compiler.warnings.isEmpty, | 551 Expect.isTrue(compiler.warnings.isEmpty, |
552 "Unexpected warnings: ${compiler.warnings}"); | 552 "Unexpected warnings: ${compiler.warnings}"); |
553 print('testPatchNonPatchablePatch:${compiler.errors}'); | 553 print('testPatchNonPatchablePatch:${compiler.errors}'); |
554 Expect.equals(1, compiler.errors.length); | 554 Expect.equals(1, compiler.errors.length); |
555 Expect.isTrue( | 555 Expect.isTrue( |
556 compiler.errors[0].message.kind == MessageKind.PATCH_NONPATCHABLE); | 556 compiler.errors[0].message.kind == MessageKind.PATCH_NONPATCHABLE); |
557 })); | 557 })); |
558 } | 558 } |
559 | 559 |
560 testPatchNonPatchableOrigin() { | 560 testPatchNonPatchableOrigin() { |
561 asyncTest(() => applyPatch( | 561 asyncTest(() => applyPatch( |
562 """ | 562 """ |
563 external var foo; | 563 external var foo; |
564 """, | 564 """, |
565 """ | 565 """ |
566 patch get foo => 0; | 566 @patch get foo => 0; |
567 """).then((compiler) { | 567 """).then((compiler) { |
568 ensure(compiler, "foo", compiler.coreLibrary.find); | 568 ensure(compiler, "foo", compiler.coreLibrary.find); |
569 | 569 |
570 Expect.isTrue(compiler.warnings.isEmpty, | 570 Expect.isTrue(compiler.warnings.isEmpty, |
571 "Unexpected warnings: ${compiler.warnings}"); | 571 "Unexpected warnings: ${compiler.warnings}"); |
572 print('testPatchNonPatchableOrigin:${compiler.errors}'); | 572 print('testPatchNonPatchableOrigin:${compiler.errors}'); |
573 Expect.equals(2, compiler.errors.length); | 573 Expect.equals(2, compiler.errors.length); |
574 Expect.equals( | 574 Expect.equals( |
575 MessageKind.EXTRANEOUS_MODIFIER, compiler.errors[0].message.kind); | 575 MessageKind.EXTRANEOUS_MODIFIER, compiler.errors[0].message.kind); |
576 Expect.equals( | 576 Expect.equals( |
577 // TODO(ahe): Eventually, this error should be removed as it will be | 577 // TODO(ahe): Eventually, this error should be removed as it will be |
578 // handled by the regular parser. | 578 // handled by the regular parser. |
579 MessageKind.PATCH_NONPATCHABLE, compiler.errors[1].message.kind); | 579 MessageKind.PATCH_NONPATCHABLE, compiler.errors[1].message.kind); |
580 })); | 580 })); |
581 } | 581 } |
582 | 582 |
583 testPatchNonExternalTopLevel() { | 583 testPatchNonExternalTopLevel() { |
584 asyncTest(() => applyPatch( | 584 asyncTest(() => applyPatch( |
585 """ | 585 """ |
586 void foo() {} | 586 void foo() {} |
587 """, | 587 """, |
588 """ | 588 """ |
589 patch void foo() {} | 589 @patch void foo() {} |
590 """).then((compiler) { | 590 """).then((compiler) { |
591 print('testPatchNonExternalTopLevel.errors:${compiler.errors}'); | 591 print('testPatchNonExternalTopLevel.errors:${compiler.errors}'); |
592 print('testPatchNonExternalTopLevel.warnings:${compiler.warnings}'); | 592 print('testPatchNonExternalTopLevel.warnings:${compiler.warnings}'); |
593 Expect.equals(1, compiler.errors.length); | 593 Expect.equals(1, compiler.errors.length); |
594 Expect.isTrue( | 594 Expect.isTrue( |
595 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXTERNAL); | 595 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXTERNAL); |
596 Expect.equals(0, compiler.warnings.length); | 596 Expect.equals(0, compiler.warnings.length); |
597 Expect.equals(1, compiler.infos.length); | 597 Expect.equals(1, compiler.infos.length); |
598 Expect.isTrue(compiler.infos[0].message.kind == | 598 Expect.isTrue(compiler.infos[0].message.kind == |
599 MessageKind.PATCH_POINT_TO_FUNCTION); | 599 MessageKind.PATCH_POINT_TO_FUNCTION); |
600 })); | 600 })); |
601 } | 601 } |
602 | 602 |
603 testPatchNonExternalMember() { | 603 testPatchNonExternalMember() { |
604 asyncTest(() => applyPatch( | 604 asyncTest(() => applyPatch( |
605 """ | 605 """ |
606 class Class { | 606 class Class { |
607 void foo() {} | 607 void foo() {} |
608 } | 608 } |
609 """, | 609 """, |
610 """ | 610 """ |
611 patch class Class { | 611 @patch class Class { |
612 patch void foo() {} | 612 @patch void foo() {} |
613 } | 613 } |
614 """).then((compiler) { | 614 """).then((compiler) { |
615 var container = ensure(compiler, "Class", compiler.coreLibrary.find, | 615 var container = ensure(compiler, "Class", compiler.coreLibrary.find, |
616 expectIsPatched: true); | 616 expectIsPatched: true); |
617 container.parseNode(compiler); | 617 container.parseNode(compiler); |
618 | 618 |
619 print('testPatchNonExternalMember.errors:${compiler.errors}'); | 619 print('testPatchNonExternalMember.errors:${compiler.errors}'); |
620 print('testPatchNonExternalMember.warnings:${compiler.warnings}'); | 620 print('testPatchNonExternalMember.warnings:${compiler.warnings}'); |
621 Expect.equals(1, compiler.errors.length); | 621 Expect.equals(1, compiler.errors.length); |
622 Expect.isTrue( | 622 Expect.isTrue( |
623 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXTERNAL); | 623 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXTERNAL); |
624 Expect.equals(0, compiler.warnings.length); | 624 Expect.equals(0, compiler.warnings.length); |
625 Expect.equals(1, compiler.infos.length); | 625 Expect.equals(1, compiler.infos.length); |
626 Expect.isTrue(compiler.infos[0].message.kind == | 626 Expect.isTrue(compiler.infos[0].message.kind == |
627 MessageKind.PATCH_POINT_TO_FUNCTION); | 627 MessageKind.PATCH_POINT_TO_FUNCTION); |
628 })); | 628 })); |
629 } | 629 } |
630 | 630 |
631 testPatchNonClass() { | 631 testPatchNonClass() { |
632 asyncTest(() => applyPatch( | 632 asyncTest(() => applyPatch( |
633 """ | 633 """ |
634 external void Class() {} | 634 external void Class() {} |
635 """, | 635 """, |
636 """ | 636 """ |
637 patch class Class {} | 637 @patch class Class {} |
638 """).then((compiler) { | 638 """).then((compiler) { |
639 print('testPatchNonClass.errors:${compiler.errors}'); | 639 print('testPatchNonClass.errors:${compiler.errors}'); |
640 print('testPatchNonClass.warnings:${compiler.warnings}'); | 640 print('testPatchNonClass.warnings:${compiler.warnings}'); |
641 Expect.equals(1, compiler.errors.length); | 641 Expect.equals(1, compiler.errors.length); |
642 Expect.isTrue( | 642 Expect.isTrue( |
643 compiler.errors[0].message.kind == MessageKind.PATCH_NON_CLASS); | 643 compiler.errors[0].message.kind == MessageKind.PATCH_NON_CLASS); |
644 Expect.equals(0, compiler.warnings.length); | 644 Expect.equals(0, compiler.warnings.length); |
645 Expect.equals(1, compiler.infos.length); | 645 Expect.equals(1, compiler.infos.length); |
646 Expect.isTrue( | 646 Expect.isTrue( |
647 compiler.infos[0].message.kind == MessageKind.PATCH_POINT_TO_CLASS); | 647 compiler.infos[0].message.kind == MessageKind.PATCH_POINT_TO_CLASS); |
648 })); | 648 })); |
649 } | 649 } |
650 | 650 |
651 testPatchNonGetter() { | 651 testPatchNonGetter() { |
652 asyncTest(() => applyPatch( | 652 asyncTest(() => applyPatch( |
653 """ | 653 """ |
654 external void foo() {} | 654 external void foo() {} |
655 """, | 655 """, |
656 """ | 656 """ |
657 patch get foo => 0; | 657 @patch get foo => 0; |
658 """).then((compiler) { | 658 """).then((compiler) { |
659 print('testPatchNonClass.errors:${compiler.errors}'); | 659 print('testPatchNonClass.errors:${compiler.errors}'); |
660 print('testPatchNonClass.warnings:${compiler.warnings}'); | 660 print('testPatchNonClass.warnings:${compiler.warnings}'); |
661 Expect.equals(1, compiler.errors.length); | 661 Expect.equals(1, compiler.errors.length); |
662 Expect.isTrue( | 662 Expect.isTrue( |
663 compiler.errors[0].message.kind == MessageKind.PATCH_NON_GETTER); | 663 compiler.errors[0].message.kind == MessageKind.PATCH_NON_GETTER); |
664 Expect.equals(0, compiler.warnings.length); | 664 Expect.equals(0, compiler.warnings.length); |
665 Expect.equals(1, compiler.infos.length); | 665 Expect.equals(1, compiler.infos.length); |
666 Expect.isTrue( | 666 Expect.isTrue( |
667 compiler.infos[0].message.kind == MessageKind.PATCH_POINT_TO_GETTER); | 667 compiler.infos[0].message.kind == MessageKind.PATCH_POINT_TO_GETTER); |
668 })); | 668 })); |
669 } | 669 } |
670 | 670 |
671 testPatchNoGetter() { | 671 testPatchNoGetter() { |
672 asyncTest(() => applyPatch( | 672 asyncTest(() => applyPatch( |
673 """ | 673 """ |
674 external set foo(var value) {} | 674 external set foo(var value) {} |
675 """, | 675 """, |
676 """ | 676 """ |
677 patch get foo => 0; | 677 @patch get foo => 0; |
678 """).then((compiler) { | 678 """).then((compiler) { |
679 print('testPatchNonClass.errors:${compiler.errors}'); | 679 print('testPatchNonClass.errors:${compiler.errors}'); |
680 print('testPatchNonClass.warnings:${compiler.warnings}'); | 680 print('testPatchNonClass.warnings:${compiler.warnings}'); |
681 Expect.equals(1, compiler.errors.length); | 681 Expect.equals(1, compiler.errors.length); |
682 Expect.isTrue( | 682 Expect.isTrue( |
683 compiler.errors[0].message.kind == MessageKind.PATCH_NO_GETTER); | 683 compiler.errors[0].message.kind == MessageKind.PATCH_NO_GETTER); |
684 Expect.equals(0, compiler.warnings.length); | 684 Expect.equals(0, compiler.warnings.length); |
685 Expect.equals(1, compiler.infos.length); | 685 Expect.equals(1, compiler.infos.length); |
686 Expect.isTrue( | 686 Expect.isTrue( |
687 compiler.infos[0].message.kind == MessageKind.PATCH_POINT_TO_GETTER); | 687 compiler.infos[0].message.kind == MessageKind.PATCH_POINT_TO_GETTER); |
688 })); | 688 })); |
689 } | 689 } |
690 | 690 |
691 testPatchNonSetter() { | 691 testPatchNonSetter() { |
692 asyncTest(() => applyPatch( | 692 asyncTest(() => applyPatch( |
693 """ | 693 """ |
694 external void foo() {} | 694 external void foo() {} |
695 """, | 695 """, |
696 """ | 696 """ |
697 patch set foo(var value) {} | 697 @patch set foo(var value) {} |
698 """).then((compiler) { | 698 """).then((compiler) { |
699 print('testPatchNonClass.errors:${compiler.errors}'); | 699 print('testPatchNonClass.errors:${compiler.errors}'); |
700 print('testPatchNonClass.warnings:${compiler.warnings}'); | 700 print('testPatchNonClass.warnings:${compiler.warnings}'); |
701 Expect.equals(1, compiler.errors.length); | 701 Expect.equals(1, compiler.errors.length); |
702 Expect.isTrue( | 702 Expect.isTrue( |
703 compiler.errors[0].message.kind == MessageKind.PATCH_NON_SETTER); | 703 compiler.errors[0].message.kind == MessageKind.PATCH_NON_SETTER); |
704 Expect.equals(0, compiler.warnings.length); | 704 Expect.equals(0, compiler.warnings.length); |
705 Expect.equals(1, compiler.infos.length); | 705 Expect.equals(1, compiler.infos.length); |
706 Expect.isTrue( | 706 Expect.isTrue( |
707 compiler.infos[0].message.kind == MessageKind.PATCH_POINT_TO_SETTER); | 707 compiler.infos[0].message.kind == MessageKind.PATCH_POINT_TO_SETTER); |
708 })); | 708 })); |
709 } | 709 } |
710 | 710 |
711 testPatchNoSetter() { | 711 testPatchNoSetter() { |
712 asyncTest(() => applyPatch( | 712 asyncTest(() => applyPatch( |
713 """ | 713 """ |
714 external get foo; | 714 external get foo; |
715 """, | 715 """, |
716 """ | 716 """ |
717 patch set foo(var value) {} | 717 @patch set foo(var value) {} |
718 """).then((compiler) { | 718 """).then((compiler) { |
719 print('testPatchNonClass.errors:${compiler.errors}'); | 719 print('testPatchNonClass.errors:${compiler.errors}'); |
720 print('testPatchNonClass.warnings:${compiler.warnings}'); | 720 print('testPatchNonClass.warnings:${compiler.warnings}'); |
721 Expect.equals(1, compiler.errors.length); | 721 Expect.equals(1, compiler.errors.length); |
722 Expect.isTrue( | 722 Expect.isTrue( |
723 compiler.errors[0].message.kind == MessageKind.PATCH_NO_SETTER); | 723 compiler.errors[0].message.kind == MessageKind.PATCH_NO_SETTER); |
724 Expect.equals(0, compiler.warnings.length); | 724 Expect.equals(0, compiler.warnings.length); |
725 Expect.equals(1, compiler.infos.length); | 725 Expect.equals(1, compiler.infos.length); |
726 Expect.isTrue( | 726 Expect.isTrue( |
727 compiler.infos[0].message.kind == MessageKind.PATCH_POINT_TO_SETTER); | 727 compiler.infos[0].message.kind == MessageKind.PATCH_POINT_TO_SETTER); |
728 })); | 728 })); |
729 } | 729 } |
730 | 730 |
731 testPatchNonFunction() { | 731 testPatchNonFunction() { |
732 asyncTest(() => applyPatch( | 732 asyncTest(() => applyPatch( |
733 """ | 733 """ |
734 external get foo; | 734 external get foo; |
735 """, | 735 """, |
736 """ | 736 """ |
737 patch void foo() {} | 737 @patch void foo() {} |
738 """).then((compiler) { | 738 """).then((compiler) { |
739 print('testPatchNonClass.errors:${compiler.errors}'); | 739 print('testPatchNonClass.errors:${compiler.errors}'); |
740 print('testPatchNonClass.warnings:${compiler.warnings}'); | 740 print('testPatchNonClass.warnings:${compiler.warnings}'); |
741 Expect.equals(1, compiler.errors.length); | 741 Expect.equals(1, compiler.errors.length); |
742 Expect.isTrue( | 742 Expect.isTrue( |
743 compiler.errors[0].message.kind == MessageKind.PATCH_NON_FUNCTION); | 743 compiler.errors[0].message.kind == MessageKind.PATCH_NON_FUNCTION); |
744 Expect.equals(0, compiler.warnings.length); | 744 Expect.equals(0, compiler.warnings.length); |
745 Expect.equals(1, compiler.infos.length); | 745 Expect.equals(1, compiler.infos.length); |
746 Expect.isTrue( | 746 Expect.isTrue( |
747 compiler.infos[0].message.kind == | 747 compiler.infos[0].message.kind == |
748 MessageKind.PATCH_POINT_TO_FUNCTION); | 748 MessageKind.PATCH_POINT_TO_FUNCTION); |
749 })); | 749 })); |
750 } | 750 } |
751 | 751 |
752 testPatchAndSelector() { | 752 testPatchAndSelector() { |
753 asyncTest(() => applyPatch( | 753 asyncTest(() => applyPatch( |
754 """ | 754 """ |
755 class A { | 755 class A { |
756 external void clear(); | 756 external void clear(); |
757 } | 757 } |
758 class B extends A { | 758 class B extends A { |
759 } | 759 } |
760 """, | 760 """, |
761 """ | 761 """ |
762 patch class A { | 762 @patch class A { |
763 int method() => 0; | 763 int method() => 0; |
764 patch void clear() {} | 764 @patch void clear() {} |
765 } | 765 } |
766 """).then((compiler) { | 766 """).then((compiler) { |
767 ClassElement cls = ensure(compiler, "A", compiler.coreLibrary.find, | 767 ClassElement cls = ensure(compiler, "A", compiler.coreLibrary.find, |
768 expectIsPatched: true); | 768 expectIsPatched: true); |
769 cls.ensureResolved(compiler); | 769 cls.ensureResolved(compiler); |
770 | 770 |
771 ensure(compiler, "method", cls.patch.lookupLocalMember, | 771 ensure(compiler, "method", cls.patch.lookupLocalMember, |
772 checkHasBody: true, expectIsRegular: true); | 772 checkHasBody: true, expectIsRegular: true); |
773 | 773 |
774 ensure(compiler, "clear", cls.lookupLocalMember, | 774 ensure(compiler, "clear", cls.lookupLocalMember, |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
832 String s = 0; | 832 String s = 0; |
833 } | 833 } |
834 } | 834 } |
835 ''', | 835 ''', |
836 MessageKind.NOT_ASSIGNABLE); | 836 MessageKind.NOT_ASSIGNABLE); |
837 } | 837 } |
838 | 838 |
839 void testTypecheckPatchedMembers() { | 839 void testTypecheckPatchedMembers() { |
840 String originText = "external void method();"; | 840 String originText = "external void method();"; |
841 String patchText = """ | 841 String patchText = """ |
842 patch void method() { | 842 @patch void method() { |
843 String s = 0; | 843 String s = 0; |
844 } | 844 } |
845 """; | 845 """; |
846 asyncTest(() => applyPatch(originText, patchText, | 846 asyncTest(() => applyPatch(originText, patchText, |
847 analyzeAll: true, analyzeOnly: true).then((compiler) { | 847 analyzeAll: true, analyzeOnly: true).then((compiler) { |
848 compiler.librariesToAnalyzeWhenRun = [Uri.parse('dart:core')]; | 848 compiler.librariesToAnalyzeWhenRun = [Uri.parse('dart:core')]; |
849 return compiler.runCompiler(null).then((_) { | 849 return compiler.runCompiler(null).then((_) { |
850 compareWarningKinds(patchText, | 850 compareWarningKinds(patchText, |
851 [MessageKind.NOT_ASSIGNABLE], compiler.warnings); | 851 [MessageKind.NOT_ASSIGNABLE], compiler.warnings); |
852 }); | 852 }); |
(...skipping 27 matching lines...) Expand all Loading... |
880 testPatchNoGetter(); | 880 testPatchNoGetter(); |
881 testPatchNonSetter(); | 881 testPatchNonSetter(); |
882 testPatchNoSetter(); | 882 testPatchNoSetter(); |
883 testPatchNonFunction(); | 883 testPatchNonFunction(); |
884 | 884 |
885 testPatchAndSelector(); | 885 testPatchAndSelector(); |
886 | 886 |
887 testAnalyzeAllInjectedMembers(); | 887 testAnalyzeAllInjectedMembers(); |
888 testTypecheckPatchedMembers(); | 888 testTypecheckPatchedMembers(); |
889 } | 889 } |
OLD | NEW |