| 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 'package:compiler/src/compiler.dart'; | 8 import 'package:compiler/src/compiler.dart'; |
| 9 import 'package:compiler/src/diagnostics/messages.dart' show | 9 import 'package:compiler/src/diagnostics/messages.dart' show |
| 10 MessageKind; | 10 MessageKind; |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 } | 123 } |
| 124 } | 124 } |
| 125 Expect.isFalse(element.isPatched && element.isPatch); | 125 Expect.isFalse(element.isPatched && element.isPatch); |
| 126 return element; | 126 return element; |
| 127 } | 127 } |
| 128 | 128 |
| 129 Future testPatchFunction() async { | 129 Future testPatchFunction() async { |
| 130 var compiler = await applyPatch( | 130 var compiler = await applyPatch( |
| 131 "external test();", | 131 "external test();", |
| 132 "@patch test() { return 'string'; } "); | 132 "@patch test() { return 'string'; } "); |
| 133 ensure(compiler, "test", compiler.coreLibrary.find, | 133 ensure(compiler, "test", compiler.commonElements.coreLibrary.find, |
| 134 expectIsPatched: true, checkHasBody: true); | 134 expectIsPatched: true, checkHasBody: true); |
| 135 ensure(compiler, "test", compiler.coreLibrary.patch.find, | 135 ensure(compiler, "test", compiler.commonElements.coreLibrary.patch.find, |
| 136 expectIsPatch: true, checkHasBody: true); | 136 expectIsPatch: true, checkHasBody: true); |
| 137 | 137 |
| 138 DiagnosticCollector collector = compiler.diagnosticCollector; | 138 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 139 Expect.isTrue(collector.warnings.isEmpty, | 139 Expect.isTrue(collector.warnings.isEmpty, |
| 140 "Unexpected warnings: ${collector.warnings}"); | 140 "Unexpected warnings: ${collector.warnings}"); |
| 141 Expect.isTrue(collector.errors.isEmpty, | 141 Expect.isTrue(collector.errors.isEmpty, |
| 142 "Unexpected errors: ${collector.errors}"); | 142 "Unexpected errors: ${collector.errors}"); |
| 143 } | 143 } |
| 144 | 144 |
| 145 Future testPatchFunctionMetadata() async { | 145 Future testPatchFunctionMetadata() async { |
| 146 var compiler = await applyPatch( | 146 var compiler = await applyPatch( |
| 147 """ | 147 """ |
| 148 const a = 0; | 148 const a = 0; |
| 149 @a external test(); | 149 @a external test(); |
| 150 """, | 150 """, |
| 151 """ | 151 """ |
| 152 const _b = 1; | 152 const _b = 1; |
| 153 @patch @_b test() {} | 153 @patch @_b test() {} |
| 154 """); | 154 """); |
| 155 Element origin = ensure(compiler, "test", compiler.coreLibrary.find, | 155 Element origin = ensure(compiler, "test", |
| 156 expectIsPatched: true, checkHasBody: true); | 156 compiler.commonElements.coreLibrary.find, |
| 157 Element patch = ensure(compiler, "test", compiler.coreLibrary.patch.find, | 157 expectIsPatched: true, checkHasBody: true); |
| 158 expectIsPatch: true, checkHasBody: true); | 158 Element patch = ensure(compiler, "test", |
| 159 compiler.commonElements.coreLibrary.patch.find, |
| 160 expectIsPatch: true, checkHasBody: true); |
| 159 | 161 |
| 160 DiagnosticCollector collector = compiler.diagnosticCollector; | 162 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 161 Expect.isTrue(collector.warnings.isEmpty, | 163 Expect.isTrue(collector.warnings.isEmpty, |
| 162 "Unexpected warnings: ${collector.warnings}"); | 164 "Unexpected warnings: ${collector.warnings}"); |
| 163 Expect.isTrue(collector.errors.isEmpty, | 165 Expect.isTrue(collector.errors.isEmpty, |
| 164 "Unexpected errors: ${collector.errors}"); | 166 "Unexpected errors: ${collector.errors}"); |
| 165 | 167 |
| 166 Expect.equals(1, origin.metadata.length, | 168 Expect.equals(1, origin.metadata.length, |
| 167 "Unexpected origin metadata: ${origin.metadata}."); | 169 "Unexpected origin metadata: ${origin.metadata}."); |
| 168 Expect.equals(3, patch.metadata.length, | 170 Expect.equals(3, patch.metadata.length, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 186 String expectedError, | 188 String expectedError, |
| 187 String defaultPatch: '', | 189 String defaultPatch: '', |
| 188 String expectedInternalError}) async { | 190 String expectedInternalError}) async { |
| 189 return applyPatch( | 191 return applyPatch( |
| 190 "external test();", | 192 "external test();", |
| 191 """ | 193 """ |
| 192 $defaultPatch | 194 $defaultPatch |
| 193 $patchSource | 195 $patchSource |
| 194 """, | 196 """, |
| 195 patchVersion: patchVersion).then((compiler) { | 197 patchVersion: patchVersion).then((compiler) { |
| 196 Element origin = | 198 Element origin = ensure(compiler, "test", |
| 197 ensure(compiler, "test", compiler.coreLibrary.find, | 199 compiler.commonElements.coreLibrary.find, |
| 198 expectIsPatched: expectIsPatched, checkHasBody: true); | 200 expectIsPatched: expectIsPatched, checkHasBody: true); |
| 199 if (expectIsPatched) { | 201 if (expectIsPatched) { |
| 200 AstElement patch = | 202 AstElement patch = ensure(compiler, "test", |
| 201 ensure(compiler, "test", compiler.coreLibrary.patch.find, | 203 compiler.commonElements.coreLibrary.patch.find, |
| 202 expectIsPatch: true, checkHasBody: true); | 204 expectIsPatch: true, checkHasBody: true); |
| 203 Expect.equals(origin.patch, patch); | 205 Expect.equals(origin.patch, patch); |
| 204 Expect.equals(patch.origin, origin); | 206 Expect.equals(patch.origin, origin); |
| 205 Expect.equals(patchText, patch.node.toString()); | 207 Expect.equals(patchText, patch.node.toString()); |
| 206 } | 208 } |
| 207 | 209 |
| 208 compiler.analyzeElement(origin); | 210 compiler.analyzeElement(origin); |
| 209 compiler.enqueuer.resolution.emptyDeferredQueueForTesting(); | 211 compiler.enqueuer.resolution.emptyDeferredQueueForTesting(); |
| 210 | 212 |
| 211 DiagnosticCollector collector = compiler.diagnosticCollector; | 213 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 212 Expect.isTrue(collector.warnings.isEmpty, | 214 Expect.isTrue(collector.warnings.isEmpty, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 242 """ | 244 """ |
| 243 class Class { | 245 class Class { |
| 244 external Class(); | 246 external Class(); |
| 245 } | 247 } |
| 246 """, | 248 """, |
| 247 """ | 249 """ |
| 248 @patch class Class { | 250 @patch class Class { |
| 249 @patch Class(); | 251 @patch Class(); |
| 250 } | 252 } |
| 251 """); | 253 """); |
| 252 var classOrigin = ensure(compiler, "Class", compiler.coreLibrary.find, | 254 var classOrigin = ensure(compiler, "Class", |
| 253 expectIsPatched: true); | 255 compiler.commonElements.coreLibrary.find, expectIsPatched: true); |
| 254 classOrigin.ensureResolved(compiler.resolution); | 256 classOrigin.ensureResolved(compiler.resolution); |
| 255 var classPatch = ensure(compiler, "Class", compiler.coreLibrary.patch.find, | 257 var classPatch = ensure(compiler, "Class", |
| 256 expectIsPatch: true); | 258 compiler.commonElements.coreLibrary.patch.find, expectIsPatch: true); |
| 257 | 259 |
| 258 Expect.equals(classPatch, classOrigin.patch); | 260 Expect.equals(classPatch, classOrigin.patch); |
| 259 Expect.equals(classOrigin, classPatch.origin); | 261 Expect.equals(classOrigin, classPatch.origin); |
| 260 | 262 |
| 261 var constructorOrigin = ensure(compiler, "", | 263 var constructorOrigin = ensure(compiler, "", |
| 262 (name) => classOrigin.localLookup(name), | 264 (name) => classOrigin.localLookup(name), |
| 263 expectIsPatched: true); | 265 expectIsPatched: true); |
| 264 var constructorPatch = ensure(compiler, "", | 266 var constructorPatch = ensure(compiler, "", |
| 265 (name) => classPatch.localLookup(name), | 267 (name) => classPatch.localLookup(name), |
| 266 expectIsPatch: true); | 268 expectIsPatch: true); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 282 Class(x) : this._(x, false); | 284 Class(x) : this._(x, false); |
| 283 | 285 |
| 284 external Class._(x, y); | 286 external Class._(x, y); |
| 285 } | 287 } |
| 286 """, | 288 """, |
| 287 r""" | 289 r""" |
| 288 @patch class Class { | 290 @patch class Class { |
| 289 @patch Class._(x, y) { print('$x,$y'); } | 291 @patch Class._(x, y) { print('$x,$y'); } |
| 290 } | 292 } |
| 291 """); | 293 """); |
| 292 var classOrigin = ensure(compiler, "Class", compiler.coreLibrary.find, | 294 var classOrigin = ensure(compiler, "Class", |
| 293 expectIsPatched: true); | 295 compiler.commonElements.coreLibrary.find, expectIsPatched: true); |
| 294 classOrigin.ensureResolved(compiler.resolution); | 296 classOrigin.ensureResolved(compiler.resolution); |
| 295 | 297 |
| 296 var classPatch = ensure(compiler, "Class", compiler.coreLibrary.patch.find, | 298 var classPatch = ensure(compiler, "Class", |
| 297 expectIsPatch: true); | 299 compiler.commonElements.coreLibrary.patch.find, expectIsPatch: true); |
| 298 | 300 |
| 299 Expect.equals(classOrigin, classPatch.origin); | 301 Expect.equals(classOrigin, classPatch.origin); |
| 300 Expect.equals(classPatch, classOrigin.patch); | 302 Expect.equals(classPatch, classOrigin.patch); |
| 301 | 303 |
| 302 var constructorRedirecting = | 304 var constructorRedirecting = |
| 303 ensure(compiler, "", | 305 ensure(compiler, "", |
| 304 (name) => classOrigin.localLookup(name)); | 306 (name) => classOrigin.localLookup(name)); |
| 305 var constructorOrigin = | 307 var constructorOrigin = |
| 306 ensure(compiler, "_", | 308 ensure(compiler, "_", |
| 307 (name) => classOrigin.localLookup(name), | 309 (name) => classOrigin.localLookup(name), |
| (...skipping 19 matching lines...) Expand all Loading... |
| 327 """ | 329 """ |
| 328 class Class { | 330 class Class { |
| 329 external String toString(); | 331 external String toString(); |
| 330 } | 332 } |
| 331 """, | 333 """, |
| 332 """ | 334 """ |
| 333 @patch class Class { | 335 @patch class Class { |
| 334 @patch String toString() => 'string'; | 336 @patch String toString() => 'string'; |
| 335 } | 337 } |
| 336 """); | 338 """); |
| 337 var container = ensure(compiler, "Class", compiler.coreLibrary.find, | 339 var container = ensure(compiler, "Class", |
| 338 expectIsPatched: true); | 340 compiler.commonElements.coreLibrary.find, expectIsPatched: true); |
| 339 container.parseNode(compiler.parsingContext); | 341 container.parseNode(compiler.parsingContext); |
| 340 ensure(compiler, "Class", compiler.coreLibrary.patch.find, | 342 ensure(compiler, "Class", compiler.commonElements.coreLibrary.patch.find, |
| 341 expectIsPatch: true); | 343 expectIsPatch: true); |
| 342 | 344 |
| 343 ensure(compiler, "toString", container.lookupLocalMember, | 345 ensure(compiler, "toString", container.lookupLocalMember, |
| 344 expectIsPatched: true, checkHasBody: true); | 346 expectIsPatched: true, checkHasBody: true); |
| 345 ensure(compiler, "toString", container.patch.lookupLocalMember, | 347 ensure(compiler, "toString", container.patch.lookupLocalMember, |
| 346 expectIsPatch: true, checkHasBody: true); | 348 expectIsPatch: true, checkHasBody: true); |
| 347 | 349 |
| 348 DiagnosticCollector collector = compiler.diagnosticCollector; | 350 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 349 Expect.isTrue(collector.warnings.isEmpty, | 351 Expect.isTrue(collector.warnings.isEmpty, |
| 350 "Unexpected warnings: ${collector.warnings}"); | 352 "Unexpected warnings: ${collector.warnings}"); |
| 351 Expect.isTrue(collector.errors.isEmpty, | 353 Expect.isTrue(collector.errors.isEmpty, |
| 352 "Unexpected errors: ${collector.errors}"); | 354 "Unexpected errors: ${collector.errors}"); |
| 353 } | 355 } |
| 354 | 356 |
| 355 Future testPatchGetter() async { | 357 Future testPatchGetter() async { |
| 356 var compiler = await applyPatch( | 358 var compiler = await applyPatch( |
| 357 """ | 359 """ |
| 358 class Class { | 360 class Class { |
| 359 external int get field; | 361 external int get field; |
| 360 } | 362 } |
| 361 """, | 363 """, |
| 362 """ | 364 """ |
| 363 @patch class Class { | 365 @patch class Class { |
| 364 @patch int get field => 5; | 366 @patch int get field => 5; |
| 365 } | 367 } |
| 366 """); | 368 """); |
| 367 var container = ensure(compiler, "Class", compiler.coreLibrary.find, | 369 var container = ensure(compiler, "Class", |
| 368 expectIsPatched: true); | 370 compiler.commonElements.coreLibrary.find, expectIsPatched: true); |
| 369 container.parseNode(compiler.parsingContext); | 371 container.parseNode(compiler.parsingContext); |
| 370 ensure(compiler, | 372 ensure(compiler, |
| 371 "field", | 373 "field", |
| 372 container.lookupLocalMember, | 374 container.lookupLocalMember, |
| 373 expectIsGetter: true, | 375 expectIsGetter: true, |
| 374 expectIsPatched: true, | 376 expectIsPatched: true, |
| 375 checkHasBody: true); | 377 checkHasBody: true); |
| 376 ensure(compiler, | 378 ensure(compiler, |
| 377 "field", | 379 "field", |
| 378 container.patch.lookupLocalMember, | 380 container.patch.lookupLocalMember, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 391 var compiler = await applyPatch( | 393 var compiler = await applyPatch( |
| 392 """ | 394 """ |
| 393 class Class { | 395 class Class { |
| 394 void regular() {} | 396 void regular() {} |
| 395 } | 397 } |
| 396 """, | 398 """, |
| 397 """ | 399 """ |
| 398 @patch class Class { | 400 @patch class Class { |
| 399 } | 401 } |
| 400 """); | 402 """); |
| 401 var container = ensure(compiler, "Class", compiler.coreLibrary.find, | 403 var container = ensure(compiler, "Class", |
| 402 expectIsPatched: true); | 404 compiler.commonElements.coreLibrary.find, expectIsPatched: true); |
| 403 container.parseNode(compiler.parsingContext); | 405 container.parseNode(compiler.parsingContext); |
| 404 ensure(compiler, "Class", compiler.coreLibrary.patch.find, | 406 ensure(compiler, "Class", compiler.commonElements.coreLibrary.patch.find, |
| 405 expectIsPatch: true); | 407 expectIsPatch: true); |
| 406 | 408 |
| 407 ensure(compiler, "regular", container.lookupLocalMember, | 409 ensure(compiler, "regular", container.lookupLocalMember, |
| 408 checkHasBody: true, expectIsRegular: true); | 410 checkHasBody: true, expectIsRegular: true); |
| 409 ensure(compiler, "regular", container.patch.lookupLocalMember, | 411 ensure(compiler, "regular", container.patch.lookupLocalMember, |
| 410 checkHasBody: true, expectIsRegular: true); | 412 checkHasBody: true, expectIsRegular: true); |
| 411 | 413 |
| 412 DiagnosticCollector collector = compiler.diagnosticCollector; | 414 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 413 Expect.isTrue(collector.warnings.isEmpty, | 415 Expect.isTrue(collector.warnings.isEmpty, |
| 414 "Unexpected warnings: ${collector.warnings}"); | 416 "Unexpected warnings: ${collector.warnings}"); |
| 415 Expect.isTrue(collector.errors.isEmpty, | 417 Expect.isTrue(collector.errors.isEmpty, |
| 416 "Unexpected errors: ${collector.errors}"); | 418 "Unexpected errors: ${collector.errors}"); |
| 417 } | 419 } |
| 418 | 420 |
| 419 Future testInjectedMember() async { | 421 Future testInjectedMember() async { |
| 420 var compiler = await applyPatch( | 422 var compiler = await applyPatch( |
| 421 """ | 423 """ |
| 422 class Class { | 424 class Class { |
| 423 } | 425 } |
| 424 """, | 426 """, |
| 425 """ | 427 """ |
| 426 @patch class Class { | 428 @patch class Class { |
| 427 void _injected() {} | 429 void _injected() {} |
| 428 } | 430 } |
| 429 """); | 431 """); |
| 430 var container = ensure(compiler, "Class", compiler.coreLibrary.find, | 432 var container = ensure(compiler, "Class", |
| 431 expectIsPatched: true); | 433 compiler.commonElements.coreLibrary.find, expectIsPatched: true); |
| 432 container.parseNode(compiler.parsingContext); | 434 container.parseNode(compiler.parsingContext); |
| 433 ensure(compiler, "Class", compiler.coreLibrary.patch.find, | 435 ensure(compiler, "Class", compiler.commonElements.coreLibrary.patch.find, |
| 434 expectIsPatch: true); | 436 expectIsPatch: true); |
| 435 | 437 |
| 436 ensure(compiler, "_injected", container.lookupLocalMember, | 438 ensure(compiler, "_injected", container.lookupLocalMember, |
| 437 expectIsFound: false); | 439 expectIsFound: false); |
| 438 ensure(compiler, "_injected", container.patch.lookupLocalMember, | 440 ensure(compiler, "_injected", container.patch.lookupLocalMember, |
| 439 checkHasBody: true, expectIsRegular: true); | 441 checkHasBody: true, expectIsRegular: true); |
| 440 | 442 |
| 441 DiagnosticCollector collector = compiler.diagnosticCollector; | 443 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 442 Expect.isTrue(collector.warnings.isEmpty, | 444 Expect.isTrue(collector.warnings.isEmpty, |
| 443 "Unexpected warnings: ${collector.warnings}"); | 445 "Unexpected warnings: ${collector.warnings}"); |
| 444 Expect.isTrue(collector.errors.isEmpty, | 446 Expect.isTrue(collector.errors.isEmpty, |
| 445 "Unexpected errors: ${collector.errors}"); | 447 "Unexpected errors: ${collector.errors}"); |
| 446 } | 448 } |
| 447 | 449 |
| 448 Future testInjectedPublicMember() async { | 450 Future testInjectedPublicMember() async { |
| 449 var compiler = await applyPatch( | 451 var compiler = await applyPatch( |
| 450 """ | 452 """ |
| 451 class Class { | 453 class Class { |
| 452 } | 454 } |
| 453 """, | 455 """, |
| 454 """ | 456 """ |
| 455 @patch class Class { | 457 @patch class Class { |
| 456 void injected() {} | 458 void injected() {} |
| 457 } | 459 } |
| 458 """); | 460 """); |
| 459 var container = ensure(compiler, "Class", compiler.coreLibrary.find, | 461 var container = ensure(compiler, "Class", |
| 460 expectIsPatched: true); | 462 compiler.commonElements.coreLibrary.find, expectIsPatched: true); |
| 461 container.parseNode(compiler.parsingContext); | 463 container.parseNode(compiler.parsingContext); |
| 462 ensure(compiler, "Class", compiler.coreLibrary.patch.find, | 464 ensure(compiler, "Class", compiler.commonElements.coreLibrary.patch.find, |
| 463 expectIsPatch: true); | 465 expectIsPatch: true); |
| 464 | 466 |
| 465 ensure(compiler, "injected", container.lookupLocalMember, | 467 ensure(compiler, "injected", container.lookupLocalMember, |
| 466 expectIsFound: false); | 468 expectIsFound: false); |
| 467 ensure(compiler, "injected", container.patch.lookupLocalMember, | 469 ensure(compiler, "injected", container.patch.lookupLocalMember, |
| 468 checkHasBody: true, expectIsRegular: true); | 470 checkHasBody: true, expectIsRegular: true); |
| 469 | 471 |
| 470 DiagnosticCollector collector = compiler.diagnosticCollector; | 472 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 471 Expect.isTrue(collector.warnings.isEmpty, | 473 Expect.isTrue(collector.warnings.isEmpty, |
| 472 "Unexpected warnings: ${collector.warnings}"); | 474 "Unexpected warnings: ${collector.warnings}"); |
| 473 Expect.equals(1, collector.errors.length, | 475 Expect.equals(1, collector.errors.length, |
| 474 "Unexpected errors: ${collector.errors}"); | 476 "Unexpected errors: ${collector.errors}"); |
| 475 Expect.isTrue( | 477 Expect.isTrue( |
| 476 collector.errors.first.message.kind == | 478 collector.errors.first.message.kind == |
| 477 MessageKind.INJECTED_PUBLIC_MEMBER); | 479 MessageKind.INJECTED_PUBLIC_MEMBER); |
| 478 } | 480 } |
| 479 | 481 |
| 480 Future testInjectedFunction() async { | 482 Future testInjectedFunction() async { |
| 481 var compiler = await applyPatch( | 483 var compiler = await applyPatch( |
| 482 "", | 484 "", |
| 483 "int _function() => 5;"); | 485 "int _function() => 5;"); |
| 484 ensure(compiler, | 486 ensure(compiler, |
| 485 "_function", | 487 "_function", |
| 486 compiler.coreLibrary.find, | 488 compiler.commonElements.coreLibrary.find, |
| 487 expectIsFound: false); | 489 expectIsFound: false); |
| 488 ensure(compiler, | 490 ensure(compiler, |
| 489 "_function", | 491 "_function", |
| 490 compiler.coreLibrary.patch.find, | 492 compiler.commonElements.coreLibrary.patch.find, |
| 491 checkHasBody: true, expectIsRegular: true); | 493 checkHasBody: true, expectIsRegular: true); |
| 492 | 494 |
| 493 DiagnosticCollector collector = compiler.diagnosticCollector; | 495 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 494 Expect.isTrue(collector.warnings.isEmpty, | 496 Expect.isTrue(collector.warnings.isEmpty, |
| 495 "Unexpected warnings: ${collector.warnings}"); | 497 "Unexpected warnings: ${collector.warnings}"); |
| 496 Expect.isTrue(collector.errors.isEmpty, | 498 Expect.isTrue(collector.errors.isEmpty, |
| 497 "Unexpected errors: ${collector.errors}"); | 499 "Unexpected errors: ${collector.errors}"); |
| 498 } | 500 } |
| 499 | 501 |
| 500 Future testInjectedPublicFunction() async { | 502 Future testInjectedPublicFunction() async { |
| 501 var compiler = await applyPatch( | 503 var compiler = await applyPatch( |
| 502 "", | 504 "", |
| 503 "int function() => 5;"); | 505 "int function() => 5;"); |
| 504 ensure(compiler, | 506 ensure(compiler, |
| 505 "function", | 507 "function", |
| 506 compiler.coreLibrary.find, | 508 compiler.commonElements.coreLibrary.find, |
| 507 expectIsFound: false); | 509 expectIsFound: false); |
| 508 ensure(compiler, | 510 ensure(compiler, |
| 509 "function", | 511 "function", |
| 510 compiler.coreLibrary.patch.find, | 512 compiler.commonElements.coreLibrary.patch.find, |
| 511 checkHasBody: true, expectIsRegular: true); | 513 checkHasBody: true, expectIsRegular: true); |
| 512 | 514 |
| 513 DiagnosticCollector collector = compiler.diagnosticCollector; | 515 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 514 Expect.isTrue(collector.warnings.isEmpty, | 516 Expect.isTrue(collector.warnings.isEmpty, |
| 515 "Unexpected warnings: ${collector.warnings}"); | 517 "Unexpected warnings: ${collector.warnings}"); |
| 516 Expect.equals(1, collector.errors.length, | 518 Expect.equals(1, collector.errors.length, |
| 517 "Unexpected errors: ${collector.errors}"); | 519 "Unexpected errors: ${collector.errors}"); |
| 518 Expect.isTrue( | 520 Expect.isTrue( |
| 519 collector.errors.first.message.kind == | 521 collector.errors.first.message.kind == |
| 520 MessageKind.INJECTED_PUBLIC_MEMBER); | 522 MessageKind.INJECTED_PUBLIC_MEMBER); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 545 @patch void method4([String str, int i]) {} | 547 @patch void method4([String str, int i]) {} |
| 546 @patch void method5() {} | 548 @patch void method5() {} |
| 547 @patch void method6([String str]) {} | 549 @patch void method6([String str]) {} |
| 548 @patch void method7([String s2]) {} | 550 @patch void method7([String s2]) {} |
| 549 @patch void method8({String s2}) {} | 551 @patch void method8({String s2}) {} |
| 550 @patch void method9(int str) {} | 552 @patch void method9(int str) {} |
| 551 @patch void method10([int str]) {} | 553 @patch void method10([int str]) {} |
| 552 @patch void method11({int str}) {} | 554 @patch void method11({int str}) {} |
| 553 } | 555 } |
| 554 """); | 556 """); |
| 555 var container = ensure(compiler, "Class", compiler.coreLibrary.find, | 557 var container = ensure(compiler, "Class", |
| 556 expectIsPatched: true); | 558 compiler.commonElements.coreLibrary.find, expectIsPatched: true); |
| 557 container.ensureResolved(compiler.resolution); | 559 container.ensureResolved(compiler.resolution); |
| 558 container.parseNode(compiler.parsingContext); | 560 container.parseNode(compiler.parsingContext); |
| 559 DiagnosticCollector collector = compiler.diagnosticCollector; | 561 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 560 | 562 |
| 561 void expect(String methodName, List infos, List errors) { | 563 void expect(String methodName, List infos, List errors) { |
| 562 collector.clear(); | 564 collector.clear(); |
| 563 compiler.resolver.resolveMethodElement( | 565 compiler.resolver.resolveMethodElement( |
| 564 ensure(compiler, methodName, container.lookupLocalMember, | 566 ensure(compiler, methodName, container.lookupLocalMember, |
| 565 expectIsPatched: true, checkHasBody: true)); | 567 expectIsPatched: true, checkHasBody: true)); |
| 566 Expect.equals(0, collector.warnings.length); | 568 Expect.equals(0, collector.warnings.length); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 } | 602 } |
| 601 | 603 |
| 602 Future testExternalWithoutImplementationTopLevel() async { | 604 Future testExternalWithoutImplementationTopLevel() async { |
| 603 var compiler = await applyPatch( | 605 var compiler = await applyPatch( |
| 604 """ | 606 """ |
| 605 external void foo(); | 607 external void foo(); |
| 606 """, | 608 """, |
| 607 """ | 609 """ |
| 608 // @patch void foo() {} | 610 // @patch void foo() {} |
| 609 """); | 611 """); |
| 610 var function = ensure(compiler, "foo", compiler.coreLibrary.find); | 612 var function = ensure(compiler, "foo", |
| 613 compiler.commonElements.coreLibrary.find); |
| 611 compiler.resolver.resolve(function); | 614 compiler.resolver.resolve(function); |
| 612 DiagnosticCollector collector = compiler.diagnosticCollector; | 615 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 613 Expect.isTrue(collector.warnings.isEmpty, | 616 Expect.isTrue(collector.warnings.isEmpty, |
| 614 "Unexpected warnings: ${collector.warnings}"); | 617 "Unexpected warnings: ${collector.warnings}"); |
| 615 print('testExternalWithoutImplementationTopLevel:${collector.errors}'); | 618 print('testExternalWithoutImplementationTopLevel:${collector.errors}'); |
| 616 Expect.equals(1, collector.errors.length); | 619 Expect.equals(1, collector.errors.length); |
| 617 Expect.isTrue( | 620 Expect.isTrue( |
| 618 collector.errors.first.message.kind == | 621 collector.errors.first.message.kind == |
| 619 MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION); | 622 MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION); |
| 620 Expect.stringEquals('External method without an implementation.', | 623 Expect.stringEquals('External method without an implementation.', |
| 621 collector.errors.first.message.toString()); | 624 collector.errors.first.message.toString()); |
| 622 } | 625 } |
| 623 | 626 |
| 624 Future testExternalWithoutImplementationMember() async { | 627 Future testExternalWithoutImplementationMember() async { |
| 625 var compiler = await applyPatch( | 628 var compiler = await applyPatch( |
| 626 """ | 629 """ |
| 627 class Class { | 630 class Class { |
| 628 external void foo(); | 631 external void foo(); |
| 629 } | 632 } |
| 630 """, | 633 """, |
| 631 """ | 634 """ |
| 632 @patch class Class { | 635 @patch class Class { |
| 633 // @patch void foo() {} | 636 // @patch void foo() {} |
| 634 } | 637 } |
| 635 """); | 638 """); |
| 636 var container = ensure(compiler, "Class", compiler.coreLibrary.find, | 639 var container = ensure(compiler, "Class", |
| 637 expectIsPatched: true); | 640 compiler.commonElements.coreLibrary.find, expectIsPatched: true); |
| 638 container.parseNode(compiler.parsingContext); | 641 container.parseNode(compiler.parsingContext); |
| 639 DiagnosticCollector collector = compiler.diagnosticCollector; | 642 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 640 collector.clear(); | 643 collector.clear(); |
| 641 compiler.resolver.resolveMethodElement( | 644 compiler.resolver.resolveMethodElement( |
| 642 ensure(compiler, "foo", container.lookupLocalMember)); | 645 ensure(compiler, "foo", container.lookupLocalMember)); |
| 643 Expect.isTrue(collector.warnings.isEmpty, | 646 Expect.isTrue(collector.warnings.isEmpty, |
| 644 "Unexpected warnings: ${collector.warnings}"); | 647 "Unexpected warnings: ${collector.warnings}"); |
| 645 print('testExternalWithoutImplementationMember:${collector.errors}'); | 648 print('testExternalWithoutImplementationMember:${collector.errors}'); |
| 646 Expect.equals(1, collector.errors.length); | 649 Expect.equals(1, collector.errors.length); |
| 647 Expect.isTrue( | 650 Expect.isTrue( |
| 648 collector.errors.first.message.kind == | 651 collector.errors.first.message.kind == |
| 649 MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION); | 652 MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION); |
| 650 Expect.stringEquals('External method without an implementation.', | 653 Expect.stringEquals('External method without an implementation.', |
| 651 collector.errors.first.message.toString()); | 654 collector.errors.first.message.toString()); |
| 652 } | 655 } |
| 653 | 656 |
| 654 Future testIsSubclass() async { | 657 Future testIsSubclass() async { |
| 655 var compiler = await applyPatch( | 658 var compiler = await applyPatch( |
| 656 """ | 659 """ |
| 657 class A {} | 660 class A {} |
| 658 """, | 661 """, |
| 659 """ | 662 """ |
| 660 @patch class A {} | 663 @patch class A {} |
| 661 """); | 664 """); |
| 662 ClassElement cls = ensure(compiler, "A", compiler.coreLibrary.find, | 665 ClassElement cls = ensure(compiler, "A", |
| 663 expectIsPatched: true); | 666 compiler.commonElements.coreLibrary.find, expectIsPatched: true); |
| 664 ClassElement patch = cls.patch; | 667 ClassElement patch = cls.patch; |
| 665 Expect.isTrue(cls != patch); | 668 Expect.isTrue(cls != patch); |
| 666 Expect.isTrue(cls.isSubclassOf(patch)); | 669 Expect.isTrue(cls.isSubclassOf(patch)); |
| 667 Expect.isTrue(patch.isSubclassOf(cls)); | 670 Expect.isTrue(patch.isSubclassOf(cls)); |
| 668 } | 671 } |
| 669 | 672 |
| 670 Future testPatchNonExistingTopLevel() async { | 673 Future testPatchNonExistingTopLevel() async { |
| 671 var compiler = await applyPatch( | 674 var compiler = await applyPatch( |
| 672 """ | 675 """ |
| 673 // class Class {} | 676 // class Class {} |
| (...skipping 13 matching lines...) Expand all Loading... |
| 687 Future testPatchNonExistingMember() async { | 690 Future testPatchNonExistingMember() async { |
| 688 var compiler = await applyPatch( | 691 var compiler = await applyPatch( |
| 689 """ | 692 """ |
| 690 class Class {} | 693 class Class {} |
| 691 """, | 694 """, |
| 692 """ | 695 """ |
| 693 @patch class Class { | 696 @patch class Class { |
| 694 @patch void foo() {} | 697 @patch void foo() {} |
| 695 } | 698 } |
| 696 """); | 699 """); |
| 697 var container = ensure(compiler, "Class", compiler.coreLibrary.find, | 700 var container = ensure(compiler, "Class", |
| 698 expectIsPatched: true); | 701 compiler.commonElements.coreLibrary.find, expectIsPatched: true); |
| 699 container.parseNode(compiler.parsingContext); | 702 container.parseNode(compiler.parsingContext); |
| 700 DiagnosticCollector collector = compiler.diagnosticCollector; | 703 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 701 | 704 |
| 702 Expect.isTrue(collector.warnings.isEmpty, | 705 Expect.isTrue(collector.warnings.isEmpty, |
| 703 "Unexpected warnings: ${collector.warnings}"); | 706 "Unexpected warnings: ${collector.warnings}"); |
| 704 print('testPatchNonExistingMember:${collector.errors}'); | 707 print('testPatchNonExistingMember:${collector.errors}'); |
| 705 Expect.equals(1, collector.errors.length); | 708 Expect.equals(1, collector.errors.length); |
| 706 Expect.isTrue( | 709 Expect.isTrue( |
| 707 collector.errors.first.message.kind == MessageKind.PATCH_NON_EXISTING); | 710 collector.errors.first.message.kind == MessageKind.PATCH_NON_EXISTING); |
| 708 } | 711 } |
| 709 | 712 |
| 710 Future testPatchNonPatchablePatch() async { | 713 Future testPatchNonPatchablePatch() async { |
| 711 var compiler = await applyPatch( | 714 var compiler = await applyPatch( |
| 712 """ | 715 """ |
| 713 external get foo; | 716 external get foo; |
| 714 """, | 717 """, |
| 715 """ | 718 """ |
| 716 @patch var foo; | 719 @patch var foo; |
| 717 """); | 720 """); |
| 718 ensure(compiler, "foo", compiler.coreLibrary.find); | 721 ensure(compiler, "foo", compiler.commonElements.coreLibrary.find); |
| 719 | 722 |
| 720 DiagnosticCollector collector = compiler.diagnosticCollector; | 723 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 721 Expect.isTrue(collector.warnings.isEmpty, | 724 Expect.isTrue(collector.warnings.isEmpty, |
| 722 "Unexpected warnings: ${collector.warnings}"); | 725 "Unexpected warnings: ${collector.warnings}"); |
| 723 print('testPatchNonPatchablePatch:${collector.errors}'); | 726 print('testPatchNonPatchablePatch:${collector.errors}'); |
| 724 Expect.equals(1, collector.errors.length); | 727 Expect.equals(1, collector.errors.length); |
| 725 Expect.isTrue( | 728 Expect.isTrue( |
| 726 collector.errors.first.message.kind == MessageKind.PATCH_NONPATCHABLE); | 729 collector.errors.first.message.kind == MessageKind.PATCH_NONPATCHABLE); |
| 727 } | 730 } |
| 728 | 731 |
| 729 Future testPatchNonPatchableOrigin() async { | 732 Future testPatchNonPatchableOrigin() async { |
| 730 var compiler = await applyPatch( | 733 var compiler = await applyPatch( |
| 731 """ | 734 """ |
| 732 external var foo; | 735 external var foo; |
| 733 """, | 736 """, |
| 734 """ | 737 """ |
| 735 @patch get foo => 0; | 738 @patch get foo => 0; |
| 736 """); | 739 """); |
| 737 ensure(compiler, "foo", compiler.coreLibrary.find); | 740 ensure(compiler, "foo", compiler.commonElements.coreLibrary.find); |
| 738 | 741 |
| 739 DiagnosticCollector collector = compiler.diagnosticCollector; | 742 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 740 Expect.isTrue(collector.warnings.isEmpty, | 743 Expect.isTrue(collector.warnings.isEmpty, |
| 741 "Unexpected warnings: ${collector.warnings}"); | 744 "Unexpected warnings: ${collector.warnings}"); |
| 742 print('testPatchNonPatchableOrigin:${collector.errors}'); | 745 print('testPatchNonPatchableOrigin:${collector.errors}'); |
| 743 Expect.equals(2, collector.errors.length); | 746 Expect.equals(2, collector.errors.length); |
| 744 Expect.equals( | 747 Expect.equals( |
| 745 MessageKind.EXTRANEOUS_MODIFIER, collector.errors.first.message.kind); | 748 MessageKind.EXTRANEOUS_MODIFIER, collector.errors.first.message.kind); |
| 746 Expect.equals( | 749 Expect.equals( |
| 747 // TODO(ahe): Eventually, this error should be removed as it will be | 750 // TODO(ahe): Eventually, this error should be removed as it will be |
| (...skipping 27 matching lines...) Expand all Loading... |
| 775 """ | 778 """ |
| 776 class Class { | 779 class Class { |
| 777 void foo() {} | 780 void foo() {} |
| 778 } | 781 } |
| 779 """, | 782 """, |
| 780 """ | 783 """ |
| 781 @patch class Class { | 784 @patch class Class { |
| 782 @patch void foo() {} | 785 @patch void foo() {} |
| 783 } | 786 } |
| 784 """); | 787 """); |
| 785 var container = ensure(compiler, "Class", compiler.coreLibrary.find, | 788 var container = ensure(compiler, "Class", |
| 786 expectIsPatched: true); | 789 compiler.commonElements.coreLibrary.find, expectIsPatched: true); |
| 787 container.parseNode(compiler.parsingContext); | 790 container.parseNode(compiler.parsingContext); |
| 788 | 791 |
| 789 DiagnosticCollector collector = compiler.diagnosticCollector; | 792 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 790 print('testPatchNonExternalMember.errors:${collector.errors}'); | 793 print('testPatchNonExternalMember.errors:${collector.errors}'); |
| 791 print('testPatchNonExternalMember.warnings:${collector.warnings}'); | 794 print('testPatchNonExternalMember.warnings:${collector.warnings}'); |
| 792 Expect.equals(1, collector.errors.length); | 795 Expect.equals(1, collector.errors.length); |
| 793 Expect.isTrue( | 796 Expect.isTrue( |
| 794 collector.errors.first.message.kind == MessageKind.PATCH_NON_EXTERNAL); | 797 collector.errors.first.message.kind == MessageKind.PATCH_NON_EXTERNAL); |
| 795 Expect.equals(0, collector.warnings.length); | 798 Expect.equals(0, collector.warnings.length); |
| 796 Expect.equals(1, collector.infos.length); | 799 Expect.equals(1, collector.infos.length); |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 937 main: """ | 940 main: """ |
| 938 main () { | 941 main () { |
| 939 new A(); // ensure A and B are instantiated | 942 new A(); // ensure A and B are instantiated |
| 940 new B(); | 943 new B(); |
| 941 } | 944 } |
| 942 """, | 945 """, |
| 943 runCompiler: true, analyzeOnly: true); | 946 runCompiler: true, analyzeOnly: true); |
| 944 World world = compiler.world; | 947 World world = compiler.world; |
| 945 world.populate(); | 948 world.populate(); |
| 946 | 949 |
| 947 ClassElement cls = ensure(compiler, "A", compiler.coreLibrary.find, | 950 ClassElement cls = ensure(compiler, "A", |
| 948 expectIsPatched: true); | 951 compiler.commonElements.coreLibrary.find, expectIsPatched: true); |
| 949 cls.ensureResolved(compiler.resolution); | 952 cls.ensureResolved(compiler.resolution); |
| 950 | 953 |
| 951 ensure(compiler, "method", cls.patch.lookupLocalMember, | 954 ensure(compiler, "method", cls.patch.lookupLocalMember, |
| 952 checkHasBody: true, expectIsRegular: true); | 955 checkHasBody: true, expectIsRegular: true); |
| 953 | 956 |
| 954 ensure(compiler, "clear", cls.lookupLocalMember, | 957 ensure(compiler, "clear", cls.lookupLocalMember, |
| 955 checkHasBody: true, expectIsPatched: true); | 958 checkHasBody: true, expectIsPatched: true); |
| 956 | 959 |
| 957 compiler.phase = Compiler.PHASE_DONE_RESOLVING; | 960 compiler.phase = Compiler.PHASE_DONE_RESOLVING; |
| 958 | 961 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 971 selector = | 974 selector = |
| 972 new Selector.call(const PublicName('clear'), CallStructure.NO_ARGS); | 975 new Selector.call(const PublicName('clear'), CallStructure.NO_ARGS); |
| 973 typeMask = new TypeMask.exact(cls, world); | 976 typeMask = new TypeMask.exact(cls, world); |
| 974 method = cls.lookupLocalMember('clear'); | 977 method = cls.lookupLocalMember('clear'); |
| 975 method.computeType(compiler.resolution); | 978 method.computeType(compiler.resolution); |
| 976 Expect.isTrue(selector.applies(method, world)); | 979 Expect.isTrue(selector.applies(method, world)); |
| 977 Expect.isTrue(typeMask.canHit(method, selector, world)); | 980 Expect.isTrue(typeMask.canHit(method, selector, world)); |
| 978 | 981 |
| 979 // Check that the declaration method in the declaration class is a target | 982 // Check that the declaration method in the declaration class is a target |
| 980 // for a typed selector on a subclass. | 983 // for a typed selector on a subclass. |
| 981 cls = ensure(compiler, "B", compiler.coreLibrary.find); | 984 cls = ensure(compiler, "B", compiler.commonElements.coreLibrary.find); |
| 982 cls.ensureResolved(compiler.resolution); | 985 cls.ensureResolved(compiler.resolution); |
| 983 typeMask = new TypeMask.exact(cls, world); | 986 typeMask = new TypeMask.exact(cls, world); |
| 984 Expect.isTrue(selector.applies(method, world)); | 987 Expect.isTrue(selector.applies(method, world)); |
| 985 Expect.isTrue(typeMask.canHit(method, selector, world)); | 988 Expect.isTrue(typeMask.canHit(method, selector, world)); |
| 986 } | 989 } |
| 987 | 990 |
| 988 Future testAnalyzeAllInjectedMembers() async { | 991 Future testAnalyzeAllInjectedMembers() async { |
| 989 Future expect(String patchText, [expectedWarnings]) async { | 992 Future expect(String patchText, [expectedWarnings]) async { |
| 990 if (expectedWarnings == null) expectedWarnings = []; | 993 if (expectedWarnings == null) expectedWarnings = []; |
| 991 if (expectedWarnings is! List) { | 994 if (expectedWarnings is! List) { |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1047 @patch | 1050 @patch |
| 1048 factory B.patchInjected() = _C.injected; | 1051 factory B.patchInjected() = _C.injected; |
| 1049 } | 1052 } |
| 1050 class _C extends B { | 1053 class _C extends B { |
| 1051 _C.injected() : super.patchTarget(); | 1054 _C.injected() : super.patchTarget(); |
| 1052 } | 1055 } |
| 1053 """; | 1056 """; |
| 1054 | 1057 |
| 1055 var compiler = await applyPatch(origin, patch, analyzeAll: true, | 1058 var compiler = await applyPatch(origin, patch, analyzeAll: true, |
| 1056 analyzeOnly: true, runCompiler: true); | 1059 analyzeOnly: true, runCompiler: true); |
| 1057 ClassElement clsA = compiler.coreLibrary.find("A"); | 1060 ClassElement clsA = compiler.commonElements.coreLibrary.find("A"); |
| 1058 ClassElement clsB = compiler.coreLibrary.find("B"); | 1061 ClassElement clsB = compiler.commonElements.coreLibrary.find("B"); |
| 1059 | 1062 |
| 1060 ConstructorElement forward = clsA.lookupConstructor("forward"); | 1063 ConstructorElement forward = clsA.lookupConstructor("forward"); |
| 1061 ConstructorElement target = forward.effectiveTarget; | 1064 ConstructorElement target = forward.effectiveTarget; |
| 1062 Expect.isTrue(target.isPatched, "Unexpected target $target for $forward"); | 1065 Expect.isTrue(target.isPatched, "Unexpected target $target for $forward"); |
| 1063 Expect.isFalse(target.isPatch, "Unexpected target $target for $forward"); | 1066 Expect.isFalse(target.isPatch, "Unexpected target $target for $forward"); |
| 1064 Expect.equals("patchTarget", target.name); | 1067 Expect.equals("patchTarget", target.name); |
| 1065 | 1068 |
| 1066 ConstructorElement forwardOne = clsA.lookupConstructor("forwardOne"); | 1069 ConstructorElement forwardOne = clsA.lookupConstructor("forwardOne"); |
| 1067 target = forwardOne.effectiveTarget; | 1070 target = forwardOne.effectiveTarget; |
| 1068 Expect.isFalse(forwardOne.isMalformed); | 1071 Expect.isFalse(forwardOne.isMalformed); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1135 await testPatchNonFunction(); | 1138 await testPatchNonFunction(); |
| 1136 | 1139 |
| 1137 await testPatchAndSelector(); | 1140 await testPatchAndSelector(); |
| 1138 | 1141 |
| 1139 await testEffectiveTarget(); | 1142 await testEffectiveTarget(); |
| 1140 | 1143 |
| 1141 await testAnalyzeAllInjectedMembers(); | 1144 await testAnalyzeAllInjectedMembers(); |
| 1142 await testTypecheckPatchedMembers(); | 1145 await testTypecheckPatchedMembers(); |
| 1143 }); | 1146 }); |
| 1144 } | 1147 } |
| OLD | NEW |