| 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 "package:async_helper/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(2, compiler.errors.length); | 531 Expect.equals(2, compiler.errors.length); |
| 510 Expect.equals( | 532 Expect.equals( |
| 511 MessageKind.EXTRANEOUS_MODIFIER, compiler.errors[0].message.kind); | 533 MessageKind.EXTRANEOUS_MODIFIER, compiler.errors[0].message.kind); |
| 512 Expect.equals( | 534 Expect.equals( |
| 513 // TODO(ahe): Eventually, this error should be removed as it will be | 535 // TODO(ahe): Eventually, this error should be removed as it will be |
| 514 // handled by the regular parser. | 536 // handled by the regular parser. |
| 515 MessageKind.PATCH_NONPATCHABLE, compiler.errors[1].message.kind); | 537 MessageKind.PATCH_NONPATCHABLE, compiler.errors[1].message.kind); |
| 538 })); |
| 516 } | 539 } |
| 517 | 540 |
| 518 testPatchNonExternalTopLevel() { | 541 testPatchNonExternalTopLevel() { |
| 519 var compiler = applyPatch( | 542 asyncTest(() => applyPatch( |
| 520 """ | 543 """ |
| 521 void foo() {} | 544 void foo() {} |
| 522 """, | 545 """, |
| 523 """ | 546 """ |
| 524 patch void foo() {} | 547 patch void foo() {} |
| 525 """); | 548 """).then((compiler) { |
| 526 print('testPatchNonExternalTopLevel.errors:${compiler.errors}'); | 549 print('testPatchNonExternalTopLevel.errors:${compiler.errors}'); |
| 527 print('testPatchNonExternalTopLevel.warnings:${compiler.warnings}'); | 550 print('testPatchNonExternalTopLevel.warnings:${compiler.warnings}'); |
| 528 Expect.equals(1, compiler.errors.length); | 551 Expect.equals(1, compiler.errors.length); |
| 529 Expect.isTrue( | 552 Expect.isTrue( |
| 530 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXTERNAL); | 553 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXTERNAL); |
| 531 Expect.equals(1, compiler.warnings.length); | 554 Expect.equals(1, compiler.warnings.length); |
| 532 Expect.isTrue( | 555 Expect.isTrue(compiler.warnings[0].message.kind == |
| 533 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_FUNCTION); | 556 MessageKind.PATCH_POINT_TO_FUNCTION); |
| 557 })); |
| 534 } | 558 } |
| 535 | 559 |
| 536 testPatchNonExternalMember() { | 560 testPatchNonExternalMember() { |
| 537 var compiler = applyPatch( | 561 asyncTest(() => applyPatch( |
| 538 """ | 562 """ |
| 539 class Class { | 563 class Class { |
| 540 void foo() {} | 564 void foo() {} |
| 541 } | 565 } |
| 542 """, | 566 """, |
| 543 """ | 567 """ |
| 544 patch class Class { | 568 patch class Class { |
| 545 patch void foo() {} | 569 patch void foo() {} |
| 546 } | 570 } |
| 547 """); | 571 """).then((compiler) { |
| 548 var container = ensure(compiler, "Class", compiler.coreLibrary.find, | 572 var container = ensure(compiler, "Class", compiler.coreLibrary.find, |
| 549 expectIsPatched: true); | 573 expectIsPatched: true); |
| 550 container.parseNode(compiler); | 574 container.parseNode(compiler); |
| 551 | 575 |
| 552 print('testPatchNonExternalMember.errors:${compiler.errors}'); | 576 print('testPatchNonExternalMember.errors:${compiler.errors}'); |
| 553 print('testPatchNonExternalMember.warnings:${compiler.warnings}'); | 577 print('testPatchNonExternalMember.warnings:${compiler.warnings}'); |
| 554 Expect.equals(1, compiler.errors.length); | 578 Expect.equals(1, compiler.errors.length); |
| 555 Expect.isTrue( | 579 Expect.isTrue( |
| 556 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXTERNAL); | 580 compiler.errors[0].message.kind == MessageKind.PATCH_NON_EXTERNAL); |
| 557 Expect.equals(1, compiler.warnings.length); | 581 Expect.equals(1, compiler.warnings.length); |
| 558 Expect.isTrue( | 582 Expect.isTrue(compiler.warnings[0].message.kind == |
| 559 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_FUNCTION); | 583 MessageKind.PATCH_POINT_TO_FUNCTION); |
| 584 })); |
| 560 } | 585 } |
| 561 | 586 |
| 562 testPatchNonClass() { | 587 testPatchNonClass() { |
| 563 var compiler = applyPatch( | 588 asyncTest(() => applyPatch( |
| 564 """ | 589 """ |
| 565 external void Class() {} | 590 external void Class() {} |
| 566 """, | 591 """, |
| 567 """ | 592 """ |
| 568 patch class Class {} | 593 patch class Class {} |
| 569 """); | 594 """).then((compiler) { |
| 570 print('testPatchNonClass.errors:${compiler.errors}'); | 595 print('testPatchNonClass.errors:${compiler.errors}'); |
| 571 print('testPatchNonClass.warnings:${compiler.warnings}'); | 596 print('testPatchNonClass.warnings:${compiler.warnings}'); |
| 572 Expect.equals(1, compiler.errors.length); | 597 Expect.equals(1, compiler.errors.length); |
| 573 Expect.isTrue( | 598 Expect.isTrue( |
| 574 compiler.errors[0].message.kind == MessageKind.PATCH_NON_CLASS); | 599 compiler.errors[0].message.kind == MessageKind.PATCH_NON_CLASS); |
| 575 Expect.equals(1, compiler.warnings.length); | 600 Expect.equals(1, compiler.warnings.length); |
| 576 Expect.isTrue( | 601 Expect.isTrue( |
| 577 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_CLASS); | 602 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_CLASS); |
| 603 })); |
| 578 } | 604 } |
| 579 | 605 |
| 580 testPatchNonGetter() { | 606 testPatchNonGetter() { |
| 581 var compiler = applyPatch( | 607 asyncTest(() => applyPatch( |
| 582 """ | 608 """ |
| 583 external void foo() {} | 609 external void foo() {} |
| 584 """, | 610 """, |
| 585 """ | 611 """ |
| 586 patch get foo => 0; | 612 patch get foo => 0; |
| 587 """); | 613 """).then((compiler) { |
| 588 print('testPatchNonClass.errors:${compiler.errors}'); | 614 print('testPatchNonClass.errors:${compiler.errors}'); |
| 589 print('testPatchNonClass.warnings:${compiler.warnings}'); | 615 print('testPatchNonClass.warnings:${compiler.warnings}'); |
| 590 Expect.equals(1, compiler.errors.length); | 616 Expect.equals(1, compiler.errors.length); |
| 591 Expect.isTrue( | 617 Expect.isTrue( |
| 592 compiler.errors[0].message.kind == MessageKind.PATCH_NON_GETTER); | 618 compiler.errors[0].message.kind == MessageKind.PATCH_NON_GETTER); |
| 593 Expect.equals(1, compiler.warnings.length); | 619 Expect.equals(1, compiler.warnings.length); |
| 594 Expect.isTrue( | 620 Expect.isTrue( |
| 595 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_GETTER); | 621 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_GETTER); |
| 622 })); |
| 596 } | 623 } |
| 597 | 624 |
| 598 testPatchNoGetter() { | 625 testPatchNoGetter() { |
| 599 var compiler = applyPatch( | 626 asyncTest(() => applyPatch( |
| 600 """ | 627 """ |
| 601 external set foo(var value) {} | 628 external set foo(var value) {} |
| 602 """, | 629 """, |
| 603 """ | 630 """ |
| 604 patch get foo => 0; | 631 patch get foo => 0; |
| 605 """); | 632 """).then((compiler) { |
| 606 print('testPatchNonClass.errors:${compiler.errors}'); | 633 print('testPatchNonClass.errors:${compiler.errors}'); |
| 607 print('testPatchNonClass.warnings:${compiler.warnings}'); | 634 print('testPatchNonClass.warnings:${compiler.warnings}'); |
| 608 Expect.equals(1, compiler.errors.length); | 635 Expect.equals(1, compiler.errors.length); |
| 609 Expect.isTrue( | 636 Expect.isTrue( |
| 610 compiler.errors[0].message.kind == MessageKind.PATCH_NO_GETTER); | 637 compiler.errors[0].message.kind == MessageKind.PATCH_NO_GETTER); |
| 611 Expect.equals(1, compiler.warnings.length); | 638 Expect.equals(1, compiler.warnings.length); |
| 612 Expect.isTrue( | 639 Expect.isTrue( |
| 613 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_GETTER); | 640 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_GETTER); |
| 641 })); |
| 614 } | 642 } |
| 615 | 643 |
| 616 testPatchNonSetter() { | 644 testPatchNonSetter() { |
| 617 var compiler = applyPatch( | 645 asyncTest(() => applyPatch( |
| 618 """ | 646 """ |
| 619 external void foo() {} | 647 external void foo() {} |
| 620 """, | 648 """, |
| 621 """ | 649 """ |
| 622 patch set foo(var value) {} | 650 patch set foo(var value) {} |
| 623 """); | 651 """).then((compiler) { |
| 624 print('testPatchNonClass.errors:${compiler.errors}'); | 652 print('testPatchNonClass.errors:${compiler.errors}'); |
| 625 print('testPatchNonClass.warnings:${compiler.warnings}'); | 653 print('testPatchNonClass.warnings:${compiler.warnings}'); |
| 626 Expect.equals(1, compiler.errors.length); | 654 Expect.equals(1, compiler.errors.length); |
| 627 Expect.isTrue( | 655 Expect.isTrue( |
| 628 compiler.errors[0].message.kind == MessageKind.PATCH_NON_SETTER); | 656 compiler.errors[0].message.kind == MessageKind.PATCH_NON_SETTER); |
| 629 Expect.equals(1, compiler.warnings.length); | 657 Expect.equals(1, compiler.warnings.length); |
| 630 Expect.isTrue( | 658 Expect.isTrue( |
| 631 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_SETTER); | 659 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_SETTER); |
| 660 })); |
| 632 } | 661 } |
| 633 | 662 |
| 634 testPatchNoSetter() { | 663 testPatchNoSetter() { |
| 635 var compiler = applyPatch( | 664 asyncTest(() => applyPatch( |
| 636 """ | 665 """ |
| 637 external get foo; | 666 external get foo; |
| 638 """, | 667 """, |
| 639 """ | 668 """ |
| 640 patch set foo(var value) {} | 669 patch set foo(var value) {} |
| 641 """); | 670 """).then((compiler) { |
| 642 print('testPatchNonClass.errors:${compiler.errors}'); | 671 print('testPatchNonClass.errors:${compiler.errors}'); |
| 643 print('testPatchNonClass.warnings:${compiler.warnings}'); | 672 print('testPatchNonClass.warnings:${compiler.warnings}'); |
| 644 Expect.equals(1, compiler.errors.length); | 673 Expect.equals(1, compiler.errors.length); |
| 645 Expect.isTrue( | 674 Expect.isTrue( |
| 646 compiler.errors[0].message.kind == MessageKind.PATCH_NO_SETTER); | 675 compiler.errors[0].message.kind == MessageKind.PATCH_NO_SETTER); |
| 647 Expect.equals(1, compiler.warnings.length); | 676 Expect.equals(1, compiler.warnings.length); |
| 648 Expect.isTrue( | 677 Expect.isTrue( |
| 649 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_SETTER); | 678 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_SETTER); |
| 679 })); |
| 650 } | 680 } |
| 651 | 681 |
| 652 testPatchNonFunction() { | 682 testPatchNonFunction() { |
| 653 var compiler = applyPatch( | 683 asyncTest(() => applyPatch( |
| 654 """ | 684 """ |
| 655 external get foo; | 685 external get foo; |
| 656 """, | 686 """, |
| 657 """ | 687 """ |
| 658 patch void foo() {} | 688 patch void foo() {} |
| 659 """); | 689 """).then((compiler) { |
| 660 print('testPatchNonClass.errors:${compiler.errors}'); | 690 print('testPatchNonClass.errors:${compiler.errors}'); |
| 661 print('testPatchNonClass.warnings:${compiler.warnings}'); | 691 print('testPatchNonClass.warnings:${compiler.warnings}'); |
| 662 Expect.equals(1, compiler.errors.length); | 692 Expect.equals(1, compiler.errors.length); |
| 663 Expect.isTrue( | 693 Expect.isTrue( |
| 664 compiler.errors[0].message.kind == MessageKind.PATCH_NON_FUNCTION); | 694 compiler.errors[0].message.kind == MessageKind.PATCH_NON_FUNCTION); |
| 665 Expect.equals(1, compiler.warnings.length); | 695 Expect.equals(1, compiler.warnings.length); |
| 666 Expect.isTrue( | 696 Expect.isTrue( |
| 667 compiler.warnings[0].message.kind == MessageKind.PATCH_POINT_TO_FUNCTION); | 697 compiler.warnings[0].message.kind == |
| 698 MessageKind.PATCH_POINT_TO_FUNCTION); |
| 699 })); |
| 668 } | 700 } |
| 669 | 701 |
| 670 testPatchAndSelector() { | 702 testPatchAndSelector() { |
| 671 var compiler = applyPatch( | 703 asyncTest(() => applyPatch( |
| 672 """ | 704 """ |
| 673 class A { | 705 class A { |
| 674 external void clear(); | 706 external void clear(); |
| 675 } | 707 } |
| 676 class B extends A { | 708 class B extends A { |
| 677 } | 709 } |
| 678 """, | 710 """, |
| 679 """ | 711 """ |
| 680 patch class A { | 712 patch class A { |
| 681 int method() => 0; | 713 int method() => 0; |
| 682 patch void clear() {} | 714 patch void clear() {} |
| 683 } | 715 } |
| 684 """); | 716 """).then((compiler) { |
| 685 ClassElement cls = ensure(compiler, "A", compiler.coreLibrary.find, | 717 ClassElement cls = ensure(compiler, "A", compiler.coreLibrary.find, |
| 686 expectIsPatched: true); | 718 expectIsPatched: true); |
| 687 cls.ensureResolved(compiler); | 719 cls.ensureResolved(compiler); |
| 688 | 720 |
| 689 ensure(compiler, "method", cls.patch.lookupLocalMember, | 721 ensure(compiler, "method", cls.patch.lookupLocalMember, |
| 690 checkHasBody: true, expectIsRegular: true); | 722 checkHasBody: true, expectIsRegular: true); |
| 691 | 723 |
| 692 ensure(compiler, "clear", cls.lookupLocalMember, | 724 ensure(compiler, "clear", cls.lookupLocalMember, |
| 693 checkHasBody: true, expectIsPatched: true); | 725 checkHasBody: true, expectIsPatched: true); |
| 694 | 726 |
| 695 compiler.phase = Compiler.PHASE_DONE_RESOLVING; | 727 compiler.phase = Compiler.PHASE_DONE_RESOLVING; |
| 696 | 728 |
| 697 // Check that a method just in the patch class is a target for a | 729 // Check that a method just in the patch class is a target for a |
| 698 // typed selector. | 730 // typed selector. |
| 699 var selector = new Selector.call( | 731 var selector = new Selector.call( |
| 700 buildSourceString('method'), compiler.coreLibrary, 0); | 732 buildSourceString('method'), compiler.coreLibrary, 0); |
| 701 var typedSelector = new TypedSelector.exact(cls.rawType, selector); | 733 var typedSelector = new TypedSelector.exact(cls.rawType, selector); |
| 702 Element method = | 734 Element method = |
| 703 cls.implementation.lookupLocalMember(buildSourceString('method')); | 735 cls.implementation.lookupLocalMember(buildSourceString('method')); |
| 704 Expect.isTrue(selector.applies(method, compiler)); | 736 Expect.isTrue(selector.applies(method, compiler)); |
| 705 Expect.isTrue(typedSelector.applies(method, compiler)); | 737 Expect.isTrue(typedSelector.applies(method, compiler)); |
| 706 | 738 |
| 707 // Check that the declaration method in the declaration class is a target | 739 // Check that the declaration method in the declaration class is a target |
| 708 // for a typed selector. | 740 // for a typed selector. |
| 709 selector = new Selector.call( | 741 selector = new Selector.call( |
| 710 buildSourceString('clear'), compiler.coreLibrary, 0); | 742 buildSourceString('clear'), compiler.coreLibrary, 0); |
| 711 typedSelector = new TypedSelector.exact(cls.rawType, selector); | 743 typedSelector = new TypedSelector.exact(cls.rawType, selector); |
| 712 method = cls.lookupLocalMember(buildSourceString('clear')); | 744 method = cls.lookupLocalMember(buildSourceString('clear')); |
| 713 Expect.isTrue(selector.applies(method, compiler)); | 745 Expect.isTrue(selector.applies(method, compiler)); |
| 714 Expect.isTrue(typedSelector.applies(method, compiler)); | 746 Expect.isTrue(typedSelector.applies(method, compiler)); |
| 715 | 747 |
| 716 // Check that the declaration method in the declaration class is a target | 748 // Check that the declaration method in the declaration class is a target |
| 717 // for a typed selector on a subclass. | 749 // for a typed selector on a subclass. |
| 718 cls = ensure(compiler, "B", compiler.coreLibrary.find); | 750 cls = ensure(compiler, "B", compiler.coreLibrary.find); |
| 719 cls.ensureResolved(compiler); | 751 cls.ensureResolved(compiler); |
| 720 typedSelector = new TypedSelector.exact(cls.rawType, selector); | 752 typedSelector = new TypedSelector.exact(cls.rawType, selector); |
| 721 Expect.isTrue(selector.applies(method, compiler)); | 753 Expect.isTrue(selector.applies(method, compiler)); |
| 722 Expect.isTrue(typedSelector.applies(method, compiler)); | 754 Expect.isTrue(typedSelector.applies(method, compiler)); |
| 755 })); |
| 723 } | 756 } |
| 724 | 757 |
| 725 void testAnalyzeAllInjectedMembers() { | 758 void testAnalyzeAllInjectedMembers() { |
| 726 void expect(String patchText, [expectedWarnings]) { | 759 void expect(String patchText, [expectedWarnings]) { |
| 727 if (expectedWarnings == null) expectedWarnings = []; | 760 if (expectedWarnings == null) expectedWarnings = []; |
| 728 if (expectedWarnings is! List) { | 761 if (expectedWarnings is! List) { |
| 729 expectedWarnings = <MessageKind>[expectedWarnings]; | 762 expectedWarnings = <MessageKind>[expectedWarnings]; |
| 730 } | 763 } |
| 731 | 764 |
| 732 var compiler = applyPatch('', patchText, | 765 asyncTest(() => applyPatch('', patchText, analyzeAll: true, |
| 733 analyzeAll: true, analyzeOnly: true); | 766 analyzeOnly: true).then((compiler) { |
| 734 compiler.librariesToAnalyzeWhenRun = [Uri.parse('dart:core')]; | 767 compiler.librariesToAnalyzeWhenRun = [Uri.parse('dart:core')]; |
| 735 compiler.runCompiler(null); | 768 return compiler.runCompiler(null).then((_) { |
| 736 compareWarningKinds(patchText, expectedWarnings, compiler.warnings); | 769 compareWarningKinds(patchText, expectedWarnings, compiler.warnings); |
| 770 }); |
| 771 })); |
| 737 } | 772 } |
| 738 | 773 |
| 739 expect('String s = 0;', MessageKind.NOT_ASSIGNABLE.warning); | 774 expect('String s = 0;', MessageKind.NOT_ASSIGNABLE.warning); |
| 740 expect('void method() { String s = 0; }', MessageKind.NOT_ASSIGNABLE.warning); | 775 expect('void method() { String s = 0; }', MessageKind.NOT_ASSIGNABLE.warning); |
| 741 expect(''' | 776 expect(''' |
| 742 class Class { | 777 class Class { |
| 743 String s = 0; | 778 String s = 0; |
| 744 } | 779 } |
| 745 ''', | 780 ''', |
| 746 MessageKind.NOT_ASSIGNABLE.warning); | 781 MessageKind.NOT_ASSIGNABLE.warning); |
| 747 expect(''' | 782 expect(''' |
| 748 class Class { | 783 class Class { |
| 749 void method() { | 784 void method() { |
| 750 String s = 0; | 785 String s = 0; |
| 751 } | 786 } |
| 752 } | 787 } |
| 753 ''', | 788 ''', |
| 754 MessageKind.NOT_ASSIGNABLE.warning); | 789 MessageKind.NOT_ASSIGNABLE.warning); |
| 755 } | 790 } |
| 756 | 791 |
| 757 void testTypecheckPatchedMembers() { | 792 void testTypecheckPatchedMembers() { |
| 758 String originText = "external void method();"; | 793 String originText = "external void method();"; |
| 759 String patchText = """ | 794 String patchText = """ |
| 760 patch void method() { | 795 patch void method() { |
| 761 String s = 0; | 796 String s = 0; |
| 762 } | 797 } |
| 763 """; | 798 """; |
| 764 var compiler = applyPatch(originText, patchText, | 799 asyncTest(() => applyPatch(originText, patchText, |
| 765 analyzeAll: true, analyzeOnly: true); | 800 analyzeAll: true, analyzeOnly: true).then((compiler) { |
| 766 compiler.librariesToAnalyzeWhenRun = [Uri.parse('dart:core')]; | 801 compiler.librariesToAnalyzeWhenRun = [Uri.parse('dart:core')]; |
| 767 compiler.runCompiler(null); | 802 return compiler.runCompiler(null).then((_) { |
| 768 compareWarningKinds(patchText, | 803 compareWarningKinds(patchText, |
| 769 [MessageKind.NOT_ASSIGNABLE.warning], compiler.warnings); | 804 [MessageKind.NOT_ASSIGNABLE.warning], compiler.warnings); |
| 805 }); |
| 806 })); |
| 770 } | 807 } |
| 771 | 808 |
| 772 main() { | 809 main() { |
| 773 testPatchConstructor(); | 810 testPatchConstructor(); |
| 774 testPatchFunction(); | 811 testPatchFunction(); |
| 775 testPatchMember(); | 812 testPatchMember(); |
| 776 testPatchGetter(); | 813 testPatchGetter(); |
| 777 testRegularMember(); | 814 testRegularMember(); |
| 778 testGhostMember(); | 815 testGhostMember(); |
| 779 testInjectFunction(); | 816 testInjectFunction(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 795 testPatchNoGetter(); | 832 testPatchNoGetter(); |
| 796 testPatchNonSetter(); | 833 testPatchNonSetter(); |
| 797 testPatchNoSetter(); | 834 testPatchNoSetter(); |
| 798 testPatchNonFunction(); | 835 testPatchNonFunction(); |
| 799 | 836 |
| 800 testPatchAndSelector(); | 837 testPatchAndSelector(); |
| 801 | 838 |
| 802 testAnalyzeAllInjectedMembers(); | 839 testAnalyzeAllInjectedMembers(); |
| 803 testTypecheckPatchedMembers(); | 840 testTypecheckPatchedMembers(); |
| 804 } | 841 } |
| OLD | NEW |