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