| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 import 'dart:async'; | 5 import 'dart:async'; |
| 6 import 'package:expect/expect.dart'; | 6 import 'package:expect/expect.dart'; |
| 7 import 'package:async_helper/async_helper.dart'; | 7 import 'package:async_helper/async_helper.dart'; |
| 8 import 'package:compiler/src/compiler.dart'; | 8 import 'package:compiler/src/compiler.dart'; |
| 9 import 'package:compiler/src/diagnostics/messages.dart' show MessageKind; | 9 import 'package:compiler/src/diagnostics/messages.dart' show MessageKind; |
| 10 import 'package:compiler/src/elements/elements.dart'; | 10 import 'package:compiler/src/elements/elements.dart'; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 compiler.registerSource(uri, "$DEFAULT_PATCH_CORE_SOURCE\n$patch"); | 32 compiler.registerSource(uri, "$DEFAULT_PATCH_CORE_SOURCE\n$patch"); |
| 33 if (runCompiler) { | 33 if (runCompiler) { |
| 34 await compiler.run(null, main); | 34 await compiler.run(null, main); |
| 35 } else { | 35 } else { |
| 36 await compiler.init(main); | 36 await compiler.init(main); |
| 37 } | 37 } |
| 38 return compiler; | 38 return compiler; |
| 39 } | 39 } |
| 40 | 40 |
| 41 void expectHasBody(compiler, ElementX element) { | 41 void expectHasBody(compiler, ElementX element) { |
| 42 var node = element.parseNode(compiler.parsingContext); | 42 dynamic node = element.parseNode(compiler.parsingContext); |
| 43 Expect.isNotNull(node, "Element isn't parseable, when a body was expected"); | 43 Expect.isNotNull(node, "Element isn't parseable, when a body was expected"); |
| 44 Expect.isNotNull(node.body); | 44 Expect.isNotNull(node.body); |
| 45 // If the element has a body it is either a Block or a Return statement, | 45 // If the element has a body it is either a Block or a Return statement, |
| 46 // both with different begin and end tokens. | 46 // both with different begin and end tokens. |
| 47 Expect.isTrue(node.body is Block || node.body is Return); | 47 Expect.isTrue(node.body is Block || node.body is Return); |
| 48 Expect.notEquals(node.body.getBeginToken(), node.body.getEndToken()); | 48 Expect.notEquals(node.body.getBeginToken(), node.body.getEndToken()); |
| 49 } | 49 } |
| 50 | 50 |
| 51 void expectHasNoBody(compiler, ElementX element) { | 51 void expectHasNoBody(compiler, ElementX element) { |
| 52 var node = element.parseNode(compiler.parsingContext); | 52 dynamic node = element.parseNode(compiler.parsingContext); |
| 53 Expect.isNotNull(node, "Element isn't parseable, when a body was expected"); | 53 Expect.isNotNull(node, "Element isn't parseable, when a body was expected"); |
| 54 Expect.isFalse(node.hasBody); | 54 Expect.isFalse(node.hasBody); |
| 55 } | 55 } |
| 56 | 56 |
| 57 Element ensure(compiler, String name, Element lookup(name), | 57 Element ensure(compiler, String name, Element lookup(name), |
| 58 {bool expectIsPatched: false, | 58 {bool expectIsPatched: false, |
| 59 bool expectIsPatch: false, | 59 bool expectIsPatch: false, |
| 60 bool checkHasBody: false, | 60 bool checkHasBody: false, |
| 61 bool expectIsGetter: false, | 61 bool expectIsGetter: false, |
| 62 bool expectIsFound: true, | 62 bool expectIsFound: true, |
| 63 bool expectIsRegular: false}) { | 63 bool expectIsRegular: false}) { |
| 64 var element = lookup(name); | 64 dynamic element = lookup(name); |
| 65 if (!expectIsFound) { | 65 if (!expectIsFound) { |
| 66 Expect.isNull(element); | 66 Expect.isNull(element); |
| 67 return element; | 67 return element; |
| 68 } | 68 } |
| 69 Expect.isNotNull(element); | 69 Expect.isNotNull(element); |
| 70 if (expectIsGetter) { | 70 if (expectIsGetter) { |
| 71 Expect.isTrue(element is AbstractFieldElement); | 71 Expect.isTrue(element is AbstractFieldElement); |
| 72 Expect.isNotNull(element.getter); | 72 Expect.isNotNull(element.getter); |
| 73 element = element.getter; | 73 element = element.getter; |
| 74 } | 74 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 | 112 |
| 113 if (checkHasBody) { | 113 if (checkHasBody) { |
| 114 expectHasBody(compiler, element); | 114 expectHasBody(compiler, element); |
| 115 } | 115 } |
| 116 } | 116 } |
| 117 Expect.isFalse(element.isPatched && element.isPatch); | 117 Expect.isFalse(element.isPatched && element.isPatch); |
| 118 return element; | 118 return element; |
| 119 } | 119 } |
| 120 | 120 |
| 121 Future testPatchFunction() async { | 121 Future testPatchFunction() async { |
| 122 var compiler = await applyPatch( | 122 dynamic compiler = await applyPatch( |
| 123 "external test();", "@patch test() { return 'string'; } "); | 123 "external test();", "@patch test() { return 'string'; } "); |
| 124 ensure(compiler, "test", compiler.resolution.commonElements.coreLibrary.find, | 124 ensure(compiler, "test", compiler.resolution.commonElements.coreLibrary.find, |
| 125 expectIsPatched: true, checkHasBody: true); | 125 expectIsPatched: true, checkHasBody: true); |
| 126 ensure(compiler, "test", | 126 ensure(compiler, "test", |
| 127 compiler.resolution.commonElements.coreLibrary.patch.find, | 127 compiler.resolution.commonElements.coreLibrary.patch.find, |
| 128 expectIsPatch: true, checkHasBody: true); | 128 expectIsPatch: true, checkHasBody: true); |
| 129 | 129 |
| 130 DiagnosticCollector collector = compiler.diagnosticCollector; | 130 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 131 Expect.isTrue( | 131 Expect.isTrue( |
| 132 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 132 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 133 Expect.isTrue( | 133 Expect.isTrue( |
| 134 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); | 134 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); |
| 135 } | 135 } |
| 136 | 136 |
| 137 Future testPatchFunctionMetadata() async { | 137 Future testPatchFunctionMetadata() async { |
| 138 var compiler = await applyPatch( | 138 dynamic compiler = await applyPatch( |
| 139 """ | 139 """ |
| 140 const a = 0; | 140 const a = 0; |
| 141 @a external test(); | 141 @a external test(); |
| 142 """, | 142 """, |
| 143 """ | 143 """ |
| 144 const _b = 1; | 144 const _b = 1; |
| 145 @patch @_b test() {} | 145 @patch @_b test() {} |
| 146 """); | 146 """); |
| 147 Element origin = ensure( | 147 Element origin = ensure( |
| 148 compiler, "test", compiler.resolution.commonElements.coreLibrary.find, | 148 compiler, "test", compiler.resolution.commonElements.coreLibrary.find, |
| 149 expectIsPatched: true, checkHasBody: true); | 149 expectIsPatched: true, checkHasBody: true); |
| 150 Element patch = ensure(compiler, "test", | 150 Element patch = ensure(compiler, "test", |
| 151 compiler.resolution.commonElements.coreLibrary.patch.find, | 151 compiler.resolution.commonElements.coreLibrary.patch.find, |
| 152 expectIsPatch: true, checkHasBody: true); | 152 expectIsPatch: true, checkHasBody: true); |
| 153 | 153 |
| 154 DiagnosticCollector collector = compiler.diagnosticCollector; | 154 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 155 Expect.isTrue( | 155 Expect.isTrue( |
| 156 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 156 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 157 Expect.isTrue( | 157 Expect.isTrue( |
| 158 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); | 158 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); |
| 159 | 159 |
| 160 Expect.equals(1, origin.metadata.length, | 160 Expect.equals(1, origin.metadata.length, |
| 161 "Unexpected origin metadata: ${origin.metadata}."); | 161 "Unexpected origin metadata: ${origin.metadata}."); |
| 162 Expect.equals(3, patch.metadata.length, | 162 Expect.equals(3, patch.metadata.length, |
| 163 "Unexpected patch metadata: ${patch.metadata}."); | 163 "Unexpected patch metadata: ${patch.metadata}."); |
| 164 } | 164 } |
| 165 | 165 |
| 166 Future testPatchFunctionGeneric() async { | 166 Future testPatchFunctionGeneric() async { |
| 167 var compiler = await applyPatch( | 167 dynamic compiler = await applyPatch( |
| 168 "external T test<T>();", "@patch T test<T>() { return null; } "); | 168 "external T test<T>();", "@patch T test<T>() { return null; } "); |
| 169 Element origin = ensure( | 169 Element origin = ensure( |
| 170 compiler, "test", compiler.resolution.commonElements.coreLibrary.find, | 170 compiler, "test", compiler.resolution.commonElements.coreLibrary.find, |
| 171 expectIsPatched: true, checkHasBody: true); | 171 expectIsPatched: true, checkHasBody: true); |
| 172 ensure(compiler, "test", | 172 ensure(compiler, "test", |
| 173 compiler.resolution.commonElements.coreLibrary.patch.find, | 173 compiler.resolution.commonElements.coreLibrary.patch.find, |
| 174 expectIsPatch: true, checkHasBody: true); | 174 expectIsPatch: true, checkHasBody: true); |
| 175 compiler.resolver.resolve(origin); | 175 compiler.resolver.resolve(origin); |
| 176 | 176 |
| 177 DiagnosticCollector collector = compiler.diagnosticCollector; | 177 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 178 Expect.isTrue( | 178 Expect.isTrue( |
| 179 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 179 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 180 Expect.isTrue( | 180 Expect.isTrue( |
| 181 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); | 181 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); |
| 182 } | 182 } |
| 183 | 183 |
| 184 Future testPatchFunctionGenericExtraTypeVariable() async { | 184 Future testPatchFunctionGenericExtraTypeVariable() async { |
| 185 var compiler = await applyPatch( | 185 dynamic compiler = await applyPatch( |
| 186 "external T test<T>();", "@patch T test<T, S>() { return null; } "); | 186 "external T test<T>();", "@patch T test<T, S>() { return null; } "); |
| 187 Element origin = ensure( | 187 Element origin = ensure( |
| 188 compiler, "test", compiler.resolution.commonElements.coreLibrary.find, | 188 compiler, "test", compiler.resolution.commonElements.coreLibrary.find, |
| 189 expectIsPatched: true, checkHasBody: true); | 189 expectIsPatched: true, checkHasBody: true); |
| 190 ensure(compiler, "test", | 190 ensure(compiler, "test", |
| 191 compiler.resolution.commonElements.coreLibrary.patch.find, | 191 compiler.resolution.commonElements.coreLibrary.patch.find, |
| 192 expectIsPatch: true, checkHasBody: true); | 192 expectIsPatch: true, checkHasBody: true); |
| 193 compiler.resolver.resolve(origin); | 193 compiler.resolver.resolve(origin); |
| 194 | 194 |
| 195 DiagnosticCollector collector = compiler.diagnosticCollector; | 195 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 196 Expect.isTrue( | 196 Expect.isTrue( |
| 197 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 197 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 198 Expect.equals(1, collector.errors.length); | 198 Expect.equals(1, collector.errors.length); |
| 199 Expect.isTrue(collector.errors.first.message.kind == | 199 Expect.isTrue(collector.errors.first.message.kind == |
| 200 MessageKind.PATCH_TYPE_VARIABLES_MISMATCH); | 200 MessageKind.PATCH_TYPE_VARIABLES_MISMATCH); |
| 201 } | 201 } |
| 202 | 202 |
| 203 Future testPatchFunctionGenericDifferentNames() async { | 203 Future testPatchFunctionGenericDifferentNames() async { |
| 204 var compiler = await applyPatch( | 204 dynamic compiler = await applyPatch( |
| 205 "external T test<T, S>();", "@patch T test<S, T>() { return null; } "); | 205 "external T test<T, S>();", "@patch T test<S, T>() { return null; } "); |
| 206 Element origin = ensure( | 206 Element origin = ensure( |
| 207 compiler, "test", compiler.resolution.commonElements.coreLibrary.find, | 207 compiler, "test", compiler.resolution.commonElements.coreLibrary.find, |
| 208 expectIsPatched: true, checkHasBody: true); | 208 expectIsPatched: true, checkHasBody: true); |
| 209 ensure(compiler, "test", | 209 ensure(compiler, "test", |
| 210 compiler.resolution.commonElements.coreLibrary.patch.find, | 210 compiler.resolution.commonElements.coreLibrary.patch.find, |
| 211 expectIsPatch: true, checkHasBody: true); | 211 expectIsPatch: true, checkHasBody: true); |
| 212 compiler.resolver.resolve(origin); | 212 compiler.resolver.resolve(origin); |
| 213 | 213 |
| 214 DiagnosticCollector collector = compiler.diagnosticCollector; | 214 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 215 Expect.isTrue( | 215 Expect.isTrue( |
| 216 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 216 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 217 Expect.equals(1, collector.errors.length); | 217 Expect.equals(1, collector.errors.length); |
| 218 Expect.isTrue(collector.errors.first.message.kind == | 218 Expect.isTrue(collector.errors.first.message.kind == |
| 219 MessageKind.PATCH_TYPE_VARIABLES_MISMATCH); | 219 MessageKind.PATCH_TYPE_VARIABLES_MISMATCH); |
| 220 } | 220 } |
| 221 | 221 |
| 222 Future testPatchConstructor() async { | 222 Future testPatchConstructor() async { |
| 223 var compiler = await applyPatch( | 223 dynamic compiler = await applyPatch( |
| 224 """ | 224 """ |
| 225 class Class { | 225 class Class { |
| 226 external Class(); | 226 external Class(); |
| 227 } | 227 } |
| 228 """, | 228 """, |
| 229 """ | 229 """ |
| 230 @patch class Class { | 230 @patch class Class { |
| 231 @patch Class(); | 231 @patch Class(); |
| 232 } | 232 } |
| 233 """); | 233 """); |
| 234 var classOrigin = ensure( | 234 dynamic classOrigin = ensure( |
| 235 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, | 235 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, |
| 236 expectIsPatched: true); | 236 expectIsPatched: true); |
| 237 classOrigin.ensureResolved(compiler.resolution); | 237 classOrigin.ensureResolved(compiler.resolution); |
| 238 var classPatch = ensure(compiler, "Class", | 238 dynamic classPatch = ensure(compiler, "Class", |
| 239 compiler.resolution.commonElements.coreLibrary.patch.find, | 239 compiler.resolution.commonElements.coreLibrary.patch.find, |
| 240 expectIsPatch: true); | 240 expectIsPatch: true); |
| 241 | 241 |
| 242 Expect.equals(classPatch, classOrigin.patch); | 242 Expect.equals(classPatch, classOrigin.patch); |
| 243 Expect.equals(classOrigin, classPatch.origin); | 243 Expect.equals(classOrigin, classPatch.origin); |
| 244 | 244 |
| 245 var constructorOrigin = ensure( | 245 dynamic constructorOrigin = ensure( |
| 246 compiler, "", (name) => classOrigin.localLookup(name), | 246 compiler, "", (name) => classOrigin.localLookup(name), |
| 247 expectIsPatched: true); | 247 expectIsPatched: true); |
| 248 var constructorPatch = ensure( | 248 dynamic constructorPatch = ensure( |
| 249 compiler, "", (name) => classPatch.localLookup(name), | 249 compiler, "", (name) => classPatch.localLookup(name), |
| 250 expectIsPatch: true); | 250 expectIsPatch: true); |
| 251 | 251 |
| 252 Expect.equals(constructorPatch, constructorOrigin.patch); | 252 Expect.equals(constructorPatch, constructorOrigin.patch); |
| 253 Expect.equals(constructorOrigin, constructorPatch.origin); | 253 Expect.equals(constructorOrigin, constructorPatch.origin); |
| 254 | 254 |
| 255 DiagnosticCollector collector = compiler.diagnosticCollector; | 255 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 256 Expect.isTrue( | 256 Expect.isTrue( |
| 257 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 257 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 258 Expect.isTrue( | 258 Expect.isTrue( |
| 259 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); | 259 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); |
| 260 } | 260 } |
| 261 | 261 |
| 262 Future testPatchRedirectingConstructor() async { | 262 Future testPatchRedirectingConstructor() async { |
| 263 var compiler = await applyPatch( | 263 dynamic compiler = await applyPatch( |
| 264 """ | 264 """ |
| 265 class Class { | 265 class Class { |
| 266 Class(x) : this._(x, false); | 266 Class(x) : this._(x, false); |
| 267 | 267 |
| 268 external Class._(x, y); | 268 external Class._(x, y); |
| 269 } | 269 } |
| 270 """, | 270 """, |
| 271 r""" | 271 r""" |
| 272 @patch class Class { | 272 @patch class Class { |
| 273 @patch Class._(x, y) { print('$x,$y'); } | 273 @patch Class._(x, y) { print('$x,$y'); } |
| 274 } | 274 } |
| 275 """); | 275 """); |
| 276 var classOrigin = ensure( | 276 dynamic classOrigin = ensure( |
| 277 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, | 277 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, |
| 278 expectIsPatched: true); | 278 expectIsPatched: true); |
| 279 classOrigin.ensureResolved(compiler.resolution); | 279 classOrigin.ensureResolved(compiler.resolution); |
| 280 | 280 |
| 281 var classPatch = ensure(compiler, "Class", | 281 dynamic classPatch = ensure(compiler, "Class", |
| 282 compiler.resolution.commonElements.coreLibrary.patch.find, | 282 compiler.resolution.commonElements.coreLibrary.patch.find, |
| 283 expectIsPatch: true); | 283 expectIsPatch: true); |
| 284 | 284 |
| 285 Expect.equals(classOrigin, classPatch.origin); | 285 Expect.equals(classOrigin, classPatch.origin); |
| 286 Expect.equals(classPatch, classOrigin.patch); | 286 Expect.equals(classPatch, classOrigin.patch); |
| 287 | 287 |
| 288 var constructorRedirecting = | 288 dynamic constructorRedirecting = |
| 289 ensure(compiler, "", (name) => classOrigin.localLookup(name)); | 289 ensure(compiler, "", (name) => classOrigin.localLookup(name)); |
| 290 var constructorOrigin = ensure( | 290 dynamic constructorOrigin = ensure( |
| 291 compiler, "_", (name) => classOrigin.localLookup(name), | 291 compiler, "_", (name) => classOrigin.localLookup(name), |
| 292 expectIsPatched: true); | 292 expectIsPatched: true); |
| 293 var constructorPatch = ensure( | 293 dynamic constructorPatch = ensure( |
| 294 compiler, "_", (name) => classPatch.localLookup(name), | 294 compiler, "_", (name) => classPatch.localLookup(name), |
| 295 expectIsPatch: true); | 295 expectIsPatch: true); |
| 296 Expect.equals(constructorOrigin, constructorPatch.origin); | 296 Expect.equals(constructorOrigin, constructorPatch.origin); |
| 297 Expect.equals(constructorPatch, constructorOrigin.patch); | 297 Expect.equals(constructorPatch, constructorOrigin.patch); |
| 298 | 298 |
| 299 compiler.resolver.resolve(constructorRedirecting); | 299 compiler.resolver.resolve(constructorRedirecting); |
| 300 | 300 |
| 301 DiagnosticCollector collector = compiler.diagnosticCollector; | 301 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 302 Expect.isTrue( | 302 Expect.isTrue( |
| 303 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 303 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 304 Expect.isTrue( | 304 Expect.isTrue( |
| 305 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); | 305 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); |
| 306 } | 306 } |
| 307 | 307 |
| 308 Future testPatchMember() async { | 308 Future testPatchMember() async { |
| 309 var compiler = await applyPatch( | 309 dynamic compiler = await applyPatch( |
| 310 """ | 310 """ |
| 311 class Class { | 311 class Class { |
| 312 external String toString(); | 312 external String toString(); |
| 313 } | 313 } |
| 314 """, | 314 """, |
| 315 """ | 315 """ |
| 316 @patch class Class { | 316 @patch class Class { |
| 317 @patch String toString() => 'string'; | 317 @patch String toString() => 'string'; |
| 318 } | 318 } |
| 319 """); | 319 """); |
| 320 var container = ensure( | 320 dynamic container = ensure( |
| 321 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, | 321 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, |
| 322 expectIsPatched: true); | 322 expectIsPatched: true); |
| 323 container.parseNode(compiler.parsingContext); | 323 container.parseNode(compiler.parsingContext); |
| 324 ensure(compiler, "Class", | 324 ensure(compiler, "Class", |
| 325 compiler.resolution.commonElements.coreLibrary.patch.find, | 325 compiler.resolution.commonElements.coreLibrary.patch.find, |
| 326 expectIsPatch: true); | 326 expectIsPatch: true); |
| 327 | 327 |
| 328 ensure(compiler, "toString", container.lookupLocalMember, | 328 ensure(compiler, "toString", container.lookupLocalMember, |
| 329 expectIsPatched: true, checkHasBody: true); | 329 expectIsPatched: true, checkHasBody: true); |
| 330 ensure(compiler, "toString", container.patch.lookupLocalMember, | 330 ensure(compiler, "toString", container.patch.lookupLocalMember, |
| 331 expectIsPatch: true, checkHasBody: true); | 331 expectIsPatch: true, checkHasBody: true); |
| 332 | 332 |
| 333 DiagnosticCollector collector = compiler.diagnosticCollector; | 333 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 334 Expect.isTrue( | 334 Expect.isTrue( |
| 335 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 335 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 336 Expect.isTrue( | 336 Expect.isTrue( |
| 337 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); | 337 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); |
| 338 } | 338 } |
| 339 | 339 |
| 340 Future testPatchGetter() async { | 340 Future testPatchGetter() async { |
| 341 var compiler = await applyPatch( | 341 dynamic compiler = await applyPatch( |
| 342 """ | 342 """ |
| 343 class Class { | 343 class Class { |
| 344 external int get field; | 344 external int get field; |
| 345 } | 345 } |
| 346 """, | 346 """, |
| 347 """ | 347 """ |
| 348 @patch class Class { | 348 @patch class Class { |
| 349 @patch int get field => 5; | 349 @patch int get field => 5; |
| 350 } | 350 } |
| 351 """); | 351 """); |
| 352 var container = ensure( | 352 dynamic container = ensure( |
| 353 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, | 353 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, |
| 354 expectIsPatched: true); | 354 expectIsPatched: true); |
| 355 container.parseNode(compiler.parsingContext); | 355 container.parseNode(compiler.parsingContext); |
| 356 ensure(compiler, "field", container.lookupLocalMember, | 356 ensure(compiler, "field", container.lookupLocalMember, |
| 357 expectIsGetter: true, expectIsPatched: true, checkHasBody: true); | 357 expectIsGetter: true, expectIsPatched: true, checkHasBody: true); |
| 358 ensure(compiler, "field", container.patch.lookupLocalMember, | 358 ensure(compiler, "field", container.patch.lookupLocalMember, |
| 359 expectIsGetter: true, expectIsPatch: true, checkHasBody: true); | 359 expectIsGetter: true, expectIsPatch: true, checkHasBody: true); |
| 360 | 360 |
| 361 DiagnosticCollector collector = compiler.diagnosticCollector; | 361 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 362 Expect.isTrue( | 362 Expect.isTrue( |
| 363 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 363 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 364 Expect.isTrue( | 364 Expect.isTrue( |
| 365 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); | 365 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); |
| 366 } | 366 } |
| 367 | 367 |
| 368 Future testRegularMember() async { | 368 Future testRegularMember() async { |
| 369 var compiler = await applyPatch( | 369 dynamic compiler = await applyPatch( |
| 370 """ | 370 """ |
| 371 class Class { | 371 class Class { |
| 372 void regular() {} | 372 void regular() {} |
| 373 } | 373 } |
| 374 """, | 374 """, |
| 375 """ | 375 """ |
| 376 @patch class Class { | 376 @patch class Class { |
| 377 } | 377 } |
| 378 """); | 378 """); |
| 379 var container = ensure( | 379 dynamic container = ensure( |
| 380 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, | 380 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, |
| 381 expectIsPatched: true); | 381 expectIsPatched: true); |
| 382 container.parseNode(compiler.parsingContext); | 382 container.parseNode(compiler.parsingContext); |
| 383 ensure(compiler, "Class", | 383 ensure(compiler, "Class", |
| 384 compiler.resolution.commonElements.coreLibrary.patch.find, | 384 compiler.resolution.commonElements.coreLibrary.patch.find, |
| 385 expectIsPatch: true); | 385 expectIsPatch: true); |
| 386 | 386 |
| 387 ensure(compiler, "regular", container.lookupLocalMember, | 387 ensure(compiler, "regular", container.lookupLocalMember, |
| 388 checkHasBody: true, expectIsRegular: true); | 388 checkHasBody: true, expectIsRegular: true); |
| 389 ensure(compiler, "regular", container.patch.lookupLocalMember, | 389 ensure(compiler, "regular", container.patch.lookupLocalMember, |
| 390 checkHasBody: true, expectIsRegular: true); | 390 checkHasBody: true, expectIsRegular: true); |
| 391 | 391 |
| 392 DiagnosticCollector collector = compiler.diagnosticCollector; | 392 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 393 Expect.isTrue( | 393 Expect.isTrue( |
| 394 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 394 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 395 Expect.isTrue( | 395 Expect.isTrue( |
| 396 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); | 396 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); |
| 397 } | 397 } |
| 398 | 398 |
| 399 Future testInjectedMember() async { | 399 Future testInjectedMember() async { |
| 400 var compiler = await applyPatch( | 400 dynamic compiler = await applyPatch( |
| 401 """ | 401 """ |
| 402 class Class { | 402 class Class { |
| 403 } | 403 } |
| 404 """, | 404 """, |
| 405 """ | 405 """ |
| 406 @patch class Class { | 406 @patch class Class { |
| 407 void _injected() {} | 407 void _injected() {} |
| 408 } | 408 } |
| 409 """); | 409 """); |
| 410 var container = ensure( | 410 dynamic container = ensure( |
| 411 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, | 411 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, |
| 412 expectIsPatched: true); | 412 expectIsPatched: true); |
| 413 container.parseNode(compiler.parsingContext); | 413 container.parseNode(compiler.parsingContext); |
| 414 ensure(compiler, "Class", | 414 ensure(compiler, "Class", |
| 415 compiler.resolution.commonElements.coreLibrary.patch.find, | 415 compiler.resolution.commonElements.coreLibrary.patch.find, |
| 416 expectIsPatch: true); | 416 expectIsPatch: true); |
| 417 | 417 |
| 418 ensure(compiler, "_injected", container.lookupLocalMember, | 418 ensure(compiler, "_injected", container.lookupLocalMember, |
| 419 expectIsFound: false); | 419 expectIsFound: false); |
| 420 ensure(compiler, "_injected", container.patch.lookupLocalMember, | 420 ensure(compiler, "_injected", container.patch.lookupLocalMember, |
| 421 checkHasBody: true, expectIsRegular: true); | 421 checkHasBody: true, expectIsRegular: true); |
| 422 | 422 |
| 423 DiagnosticCollector collector = compiler.diagnosticCollector; | 423 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 424 Expect.isTrue( | 424 Expect.isTrue( |
| 425 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 425 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 426 Expect.isTrue( | 426 Expect.isTrue( |
| 427 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); | 427 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); |
| 428 } | 428 } |
| 429 | 429 |
| 430 Future testInjectedPublicMember() async { | 430 Future testInjectedPublicMember() async { |
| 431 var compiler = await applyPatch( | 431 dynamic compiler = await applyPatch( |
| 432 """ | 432 """ |
| 433 class Class { | 433 class Class { |
| 434 } | 434 } |
| 435 """, | 435 """, |
| 436 """ | 436 """ |
| 437 @patch class Class { | 437 @patch class Class { |
| 438 void injected() {} | 438 void injected() {} |
| 439 } | 439 } |
| 440 """); | 440 """); |
| 441 var container = ensure( | 441 dynamic container = ensure( |
| 442 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, | 442 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, |
| 443 expectIsPatched: true); | 443 expectIsPatched: true); |
| 444 container.parseNode(compiler.parsingContext); | 444 container.parseNode(compiler.parsingContext); |
| 445 ensure(compiler, "Class", | 445 ensure(compiler, "Class", |
| 446 compiler.resolution.commonElements.coreLibrary.patch.find, | 446 compiler.resolution.commonElements.coreLibrary.patch.find, |
| 447 expectIsPatch: true); | 447 expectIsPatch: true); |
| 448 | 448 |
| 449 ensure(compiler, "injected", container.lookupLocalMember, | 449 ensure(compiler, "injected", container.lookupLocalMember, |
| 450 expectIsFound: false); | 450 expectIsFound: false); |
| 451 ensure(compiler, "injected", container.patch.lookupLocalMember, | 451 ensure(compiler, "injected", container.patch.lookupLocalMember, |
| 452 checkHasBody: true, expectIsRegular: true); | 452 checkHasBody: true, expectIsRegular: true); |
| 453 | 453 |
| 454 DiagnosticCollector collector = compiler.diagnosticCollector; | 454 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 455 Expect.isTrue( | 455 Expect.isTrue( |
| 456 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 456 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 457 Expect.equals( | 457 Expect.equals( |
| 458 1, collector.errors.length, "Unexpected errors: ${collector.errors}"); | 458 1, collector.errors.length, "Unexpected errors: ${collector.errors}"); |
| 459 Expect.isTrue(collector.errors.first.message.kind == | 459 Expect.isTrue(collector.errors.first.message.kind == |
| 460 MessageKind.INJECTED_PUBLIC_MEMBER); | 460 MessageKind.INJECTED_PUBLIC_MEMBER); |
| 461 } | 461 } |
| 462 | 462 |
| 463 Future testInjectedFunction() async { | 463 Future testInjectedFunction() async { |
| 464 var compiler = await applyPatch("", "int _function() => 5;"); | 464 dynamic compiler = await applyPatch("", "int _function() => 5;"); |
| 465 ensure(compiler, "_function", | 465 ensure(compiler, "_function", |
| 466 compiler.resolution.commonElements.coreLibrary.find, | 466 compiler.resolution.commonElements.coreLibrary.find, |
| 467 expectIsFound: false); | 467 expectIsFound: false); |
| 468 ensure(compiler, "_function", | 468 ensure(compiler, "_function", |
| 469 compiler.resolution.commonElements.coreLibrary.patch.find, | 469 compiler.resolution.commonElements.coreLibrary.patch.find, |
| 470 checkHasBody: true, expectIsRegular: true); | 470 checkHasBody: true, expectIsRegular: true); |
| 471 | 471 |
| 472 DiagnosticCollector collector = compiler.diagnosticCollector; | 472 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 473 Expect.isTrue( | 473 Expect.isTrue( |
| 474 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 474 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 475 Expect.isTrue( | 475 Expect.isTrue( |
| 476 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); | 476 collector.errors.isEmpty, "Unexpected errors: ${collector.errors}"); |
| 477 } | 477 } |
| 478 | 478 |
| 479 Future testInjectedPublicFunction() async { | 479 Future testInjectedPublicFunction() async { |
| 480 var compiler = await applyPatch("", "int function() => 5;"); | 480 dynamic compiler = await applyPatch("", "int function() => 5;"); |
| 481 ensure( | 481 ensure( |
| 482 compiler, "function", compiler.resolution.commonElements.coreLibrary.find, | 482 compiler, "function", compiler.resolution.commonElements.coreLibrary.find, |
| 483 expectIsFound: false); | 483 expectIsFound: false); |
| 484 ensure(compiler, "function", | 484 ensure(compiler, "function", |
| 485 compiler.resolution.commonElements.coreLibrary.patch.find, | 485 compiler.resolution.commonElements.coreLibrary.patch.find, |
| 486 checkHasBody: true, expectIsRegular: true); | 486 checkHasBody: true, expectIsRegular: true); |
| 487 | 487 |
| 488 DiagnosticCollector collector = compiler.diagnosticCollector; | 488 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 489 Expect.isTrue( | 489 Expect.isTrue( |
| 490 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 490 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 491 Expect.equals( | 491 Expect.equals( |
| 492 1, collector.errors.length, "Unexpected errors: ${collector.errors}"); | 492 1, collector.errors.length, "Unexpected errors: ${collector.errors}"); |
| 493 Expect.isTrue(collector.errors.first.message.kind == | 493 Expect.isTrue(collector.errors.first.message.kind == |
| 494 MessageKind.INJECTED_PUBLIC_MEMBER); | 494 MessageKind.INJECTED_PUBLIC_MEMBER); |
| 495 } | 495 } |
| 496 | 496 |
| 497 Future testPatchSignatureCheck() async { | 497 Future testPatchSignatureCheck() async { |
| 498 var compiler = await applyPatch( | 498 dynamic compiler = await applyPatch( |
| 499 """ | 499 """ |
| 500 class Class { | 500 class Class { |
| 501 external String method1(); | 501 external String method1(); |
| 502 external void method2(String str); | 502 external void method2(String str); |
| 503 external void method3(String s1); | 503 external void method3(String s1); |
| 504 external void method4([String str]); | 504 external void method4([String str]); |
| 505 external void method5({String str}); | 505 external void method5({String str}); |
| 506 external void method6({String str}); | 506 external void method6({String str}); |
| 507 external void method7([String s1]); | 507 external void method7([String s1]); |
| 508 external void method8({String s1}); | 508 external void method8({String s1}); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 519 @patch void method4([String str, int i]) {} | 519 @patch void method4([String str, int i]) {} |
| 520 @patch void method5() {} | 520 @patch void method5() {} |
| 521 @patch void method6([String str]) {} | 521 @patch void method6([String str]) {} |
| 522 @patch void method7([String s2]) {} | 522 @patch void method7([String s2]) {} |
| 523 @patch void method8({String s2}) {} | 523 @patch void method8({String s2}) {} |
| 524 @patch void method9(int str) {} | 524 @patch void method9(int str) {} |
| 525 @patch void method10([int str]) {} | 525 @patch void method10([int str]) {} |
| 526 @patch void method11({int str}) {} | 526 @patch void method11({int str}) {} |
| 527 } | 527 } |
| 528 """); | 528 """); |
| 529 var container = ensure( | 529 dynamic container = ensure( |
| 530 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, | 530 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, |
| 531 expectIsPatched: true); | 531 expectIsPatched: true); |
| 532 container.ensureResolved(compiler.resolution); | 532 container.ensureResolved(compiler.resolution); |
| 533 container.parseNode(compiler.parsingContext); | 533 container.parseNode(compiler.parsingContext); |
| 534 DiagnosticCollector collector = compiler.diagnosticCollector; | 534 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 535 | 535 |
| 536 void expect(String methodName, List infos, List errors) { | 536 void expect(String methodName, List infos, List errors) { |
| 537 collector.clear(); | 537 collector.clear(); |
| 538 compiler.resolver.resolveMethodElement(ensure( | 538 compiler.resolver.resolveMethodElement(ensure( |
| 539 compiler, methodName, container.lookupLocalMember, | 539 compiler, methodName, container.lookupLocalMember, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 564 [MessageKind.PATCH_PARAMETER_MISMATCH]); | 564 [MessageKind.PATCH_PARAMETER_MISMATCH]); |
| 565 expect("method9", [MessageKind.PATCH_POINT_TO_PARAMETER], | 565 expect("method9", [MessageKind.PATCH_POINT_TO_PARAMETER], |
| 566 [MessageKind.PATCH_PARAMETER_TYPE_MISMATCH]); | 566 [MessageKind.PATCH_PARAMETER_TYPE_MISMATCH]); |
| 567 expect("method10", [MessageKind.PATCH_POINT_TO_PARAMETER], | 567 expect("method10", [MessageKind.PATCH_POINT_TO_PARAMETER], |
| 568 [MessageKind.PATCH_PARAMETER_TYPE_MISMATCH]); | 568 [MessageKind.PATCH_PARAMETER_TYPE_MISMATCH]); |
| 569 expect("method11", [MessageKind.PATCH_POINT_TO_PARAMETER], | 569 expect("method11", [MessageKind.PATCH_POINT_TO_PARAMETER], |
| 570 [MessageKind.PATCH_PARAMETER_TYPE_MISMATCH]); | 570 [MessageKind.PATCH_PARAMETER_TYPE_MISMATCH]); |
| 571 } | 571 } |
| 572 | 572 |
| 573 Future testExternalWithoutImplementationTopLevel() async { | 573 Future testExternalWithoutImplementationTopLevel() async { |
| 574 var compiler = await applyPatch( | 574 dynamic compiler = await applyPatch( |
| 575 """ | 575 """ |
| 576 external void foo(); | 576 external void foo(); |
| 577 """, | 577 """, |
| 578 """ | 578 """ |
| 579 // @patch void foo() {} | 579 // @patch void foo() {} |
| 580 """); | 580 """); |
| 581 var function = ensure( | 581 dynamic function = ensure( |
| 582 compiler, "foo", compiler.resolution.commonElements.coreLibrary.find); | 582 compiler, "foo", compiler.resolution.commonElements.coreLibrary.find); |
| 583 compiler.resolver.resolve(function); | 583 compiler.resolver.resolve(function); |
| 584 DiagnosticCollector collector = compiler.diagnosticCollector; | 584 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 585 Expect.isTrue( | 585 Expect.isTrue( |
| 586 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 586 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 587 print('testExternalWithoutImplementationTopLevel:${collector.errors}'); | 587 print('testExternalWithoutImplementationTopLevel:${collector.errors}'); |
| 588 Expect.equals(1, collector.errors.length); | 588 Expect.equals(1, collector.errors.length); |
| 589 Expect.isTrue(collector.errors.first.message.kind == | 589 Expect.isTrue(collector.errors.first.message.kind == |
| 590 MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION); | 590 MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION); |
| 591 Expect.stringEquals('External method without an implementation.', | 591 Expect.stringEquals('External method without an implementation.', |
| 592 collector.errors.first.message.toString()); | 592 collector.errors.first.message.toString()); |
| 593 } | 593 } |
| 594 | 594 |
| 595 Future testExternalWithoutImplementationMember() async { | 595 Future testExternalWithoutImplementationMember() async { |
| 596 var compiler = await applyPatch( | 596 dynamic compiler = await applyPatch( |
| 597 """ | 597 """ |
| 598 class Class { | 598 class Class { |
| 599 external void foo(); | 599 external void foo(); |
| 600 } | 600 } |
| 601 """, | 601 """, |
| 602 """ | 602 """ |
| 603 @patch class Class { | 603 @patch class Class { |
| 604 // @patch void foo() {} | 604 // @patch void foo() {} |
| 605 } | 605 } |
| 606 """); | 606 """); |
| 607 var container = ensure( | 607 dynamic container = ensure( |
| 608 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, | 608 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, |
| 609 expectIsPatched: true); | 609 expectIsPatched: true); |
| 610 container.parseNode(compiler.parsingContext); | 610 container.parseNode(compiler.parsingContext); |
| 611 DiagnosticCollector collector = compiler.diagnosticCollector; | 611 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 612 collector.clear(); | 612 collector.clear(); |
| 613 compiler.resolver.resolveMethodElement( | 613 compiler.resolver.resolveMethodElement( |
| 614 ensure(compiler, "foo", container.lookupLocalMember)); | 614 ensure(compiler, "foo", container.lookupLocalMember)); |
| 615 Expect.isTrue( | 615 Expect.isTrue( |
| 616 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 616 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 617 print('testExternalWithoutImplementationMember:${collector.errors}'); | 617 print('testExternalWithoutImplementationMember:${collector.errors}'); |
| 618 Expect.equals(1, collector.errors.length); | 618 Expect.equals(1, collector.errors.length); |
| 619 Expect.isTrue(collector.errors.first.message.kind == | 619 Expect.isTrue(collector.errors.first.message.kind == |
| 620 MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION); | 620 MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION); |
| 621 Expect.stringEquals('External method without an implementation.', | 621 Expect.stringEquals('External method without an implementation.', |
| 622 collector.errors.first.message.toString()); | 622 collector.errors.first.message.toString()); |
| 623 } | 623 } |
| 624 | 624 |
| 625 Future testIsSubclass() async { | 625 Future testIsSubclass() async { |
| 626 var compiler = await applyPatch( | 626 dynamic compiler = await applyPatch( |
| 627 """ | 627 """ |
| 628 class A {} | 628 class A {} |
| 629 """, | 629 """, |
| 630 """ | 630 """ |
| 631 @patch class A {} | 631 @patch class A {} |
| 632 """); | 632 """); |
| 633 ClassElement cls = ensure( | 633 ClassElement cls = ensure( |
| 634 compiler, "A", compiler.resolution.commonElements.coreLibrary.find, | 634 compiler, "A", compiler.resolution.commonElements.coreLibrary.find, |
| 635 expectIsPatched: true); | 635 expectIsPatched: true); |
| 636 ClassElement patch = cls.patch; | 636 ClassElement patch = cls.patch; |
| 637 Expect.isTrue(cls != patch); | 637 Expect.isTrue(cls != patch); |
| 638 Expect.isTrue(cls.isSubclassOf(patch)); | 638 Expect.isTrue(cls.isSubclassOf(patch)); |
| 639 Expect.isTrue(patch.isSubclassOf(cls)); | 639 Expect.isTrue(patch.isSubclassOf(cls)); |
| 640 } | 640 } |
| 641 | 641 |
| 642 Future testPatchNonExistingTopLevel() async { | 642 Future testPatchNonExistingTopLevel() async { |
| 643 var compiler = await applyPatch( | 643 dynamic compiler = await applyPatch( |
| 644 """ | 644 """ |
| 645 // class Class {} | 645 // class Class {} |
| 646 """, | 646 """, |
| 647 """ | 647 """ |
| 648 @patch class Class {} | 648 @patch class Class {} |
| 649 """); | 649 """); |
| 650 DiagnosticCollector collector = compiler.diagnosticCollector; | 650 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 651 Expect.isTrue( | 651 Expect.isTrue( |
| 652 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 652 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 653 print('testPatchNonExistingTopLevel:${collector.errors}'); | 653 print('testPatchNonExistingTopLevel:${collector.errors}'); |
| 654 Expect.equals(1, collector.errors.length); | 654 Expect.equals(1, collector.errors.length); |
| 655 Expect.isTrue( | 655 Expect.isTrue( |
| 656 collector.errors.first.message.kind == MessageKind.PATCH_NON_EXISTING); | 656 collector.errors.first.message.kind == MessageKind.PATCH_NON_EXISTING); |
| 657 } | 657 } |
| 658 | 658 |
| 659 Future testPatchNonExistingMember() async { | 659 Future testPatchNonExistingMember() async { |
| 660 var compiler = await applyPatch( | 660 dynamic compiler = await applyPatch( |
| 661 """ | 661 """ |
| 662 class Class {} | 662 class Class {} |
| 663 """, | 663 """, |
| 664 """ | 664 """ |
| 665 @patch class Class { | 665 @patch class Class { |
| 666 @patch void foo() {} | 666 @patch void foo() {} |
| 667 } | 667 } |
| 668 """); | 668 """); |
| 669 var container = ensure( | 669 dynamic container = ensure( |
| 670 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, | 670 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, |
| 671 expectIsPatched: true); | 671 expectIsPatched: true); |
| 672 container.parseNode(compiler.parsingContext); | 672 container.parseNode(compiler.parsingContext); |
| 673 DiagnosticCollector collector = compiler.diagnosticCollector; | 673 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 674 | 674 |
| 675 Expect.isTrue( | 675 Expect.isTrue( |
| 676 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 676 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 677 print('testPatchNonExistingMember:${collector.errors}'); | 677 print('testPatchNonExistingMember:${collector.errors}'); |
| 678 Expect.equals(1, collector.errors.length); | 678 Expect.equals(1, collector.errors.length); |
| 679 Expect.isTrue( | 679 Expect.isTrue( |
| 680 collector.errors.first.message.kind == MessageKind.PATCH_NON_EXISTING); | 680 collector.errors.first.message.kind == MessageKind.PATCH_NON_EXISTING); |
| 681 } | 681 } |
| 682 | 682 |
| 683 Future testPatchNonPatchablePatch() async { | 683 Future testPatchNonPatchablePatch() async { |
| 684 var compiler = await applyPatch( | 684 dynamic compiler = await applyPatch( |
| 685 """ | 685 """ |
| 686 external get foo; | 686 external get foo; |
| 687 """, | 687 """, |
| 688 """ | 688 """ |
| 689 @patch var foo; | 689 @patch var foo; |
| 690 """); | 690 """); |
| 691 ensure(compiler, "foo", compiler.resolution.commonElements.coreLibrary.find); | 691 ensure(compiler, "foo", compiler.resolution.commonElements.coreLibrary.find); |
| 692 | 692 |
| 693 DiagnosticCollector collector = compiler.diagnosticCollector; | 693 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 694 Expect.isTrue( | 694 Expect.isTrue( |
| 695 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 695 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 696 print('testPatchNonPatchablePatch:${collector.errors}'); | 696 print('testPatchNonPatchablePatch:${collector.errors}'); |
| 697 Expect.equals(1, collector.errors.length); | 697 Expect.equals(1, collector.errors.length); |
| 698 Expect.isTrue( | 698 Expect.isTrue( |
| 699 collector.errors.first.message.kind == MessageKind.PATCH_NONPATCHABLE); | 699 collector.errors.first.message.kind == MessageKind.PATCH_NONPATCHABLE); |
| 700 } | 700 } |
| 701 | 701 |
| 702 Future testPatchNonPatchableOrigin() async { | 702 Future testPatchNonPatchableOrigin() async { |
| 703 var compiler = await applyPatch( | 703 dynamic compiler = await applyPatch( |
| 704 """ | 704 """ |
| 705 external var foo; | 705 external var foo; |
| 706 """, | 706 """, |
| 707 """ | 707 """ |
| 708 @patch get foo => 0; | 708 @patch get foo => 0; |
| 709 """); | 709 """); |
| 710 ensure(compiler, "foo", compiler.resolution.commonElements.coreLibrary.find); | 710 ensure(compiler, "foo", compiler.resolution.commonElements.coreLibrary.find); |
| 711 | 711 |
| 712 DiagnosticCollector collector = compiler.diagnosticCollector; | 712 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 713 Expect.isTrue( | 713 Expect.isTrue( |
| 714 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); | 714 collector.warnings.isEmpty, "Unexpected warnings: ${collector.warnings}"); |
| 715 print('testPatchNonPatchableOrigin:${collector.errors}'); | 715 print('testPatchNonPatchableOrigin:${collector.errors}'); |
| 716 Expect.equals(2, collector.errors.length); | 716 Expect.equals(2, collector.errors.length); |
| 717 Expect.equals( | 717 Expect.equals( |
| 718 MessageKind.EXTRANEOUS_MODIFIER, collector.errors.first.message.kind); | 718 MessageKind.EXTRANEOUS_MODIFIER, collector.errors.first.message.kind); |
| 719 Expect.equals( | 719 Expect.equals( |
| 720 // TODO(ahe): Eventually, this error should be removed as it will be | 720 // TODO(ahe): Eventually, this error should be removed as it will be |
| 721 // handled by the regular parser. | 721 // handled by the regular parser. |
| 722 MessageKind.PATCH_NONPATCHABLE, | 722 MessageKind.PATCH_NONPATCHABLE, |
| 723 collector.errors.elementAt(1).message.kind); | 723 collector.errors.elementAt(1).message.kind); |
| 724 } | 724 } |
| 725 | 725 |
| 726 Future testPatchNonExternalTopLevel() async { | 726 Future testPatchNonExternalTopLevel() async { |
| 727 var compiler = await applyPatch( | 727 dynamic compiler = await applyPatch( |
| 728 """ | 728 """ |
| 729 void foo() {} | 729 void foo() {} |
| 730 """, | 730 """, |
| 731 """ | 731 """ |
| 732 @patch void foo() {} | 732 @patch void foo() {} |
| 733 """); | 733 """); |
| 734 DiagnosticCollector collector = compiler.diagnosticCollector; | 734 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 735 print('testPatchNonExternalTopLevel.errors:${collector.errors}'); | 735 print('testPatchNonExternalTopLevel.errors:${collector.errors}'); |
| 736 print('testPatchNonExternalTopLevel.warnings:${collector.warnings}'); | 736 print('testPatchNonExternalTopLevel.warnings:${collector.warnings}'); |
| 737 Expect.equals(1, collector.errors.length); | 737 Expect.equals(1, collector.errors.length); |
| 738 Expect.isTrue( | 738 Expect.isTrue( |
| 739 collector.errors.first.message.kind == MessageKind.PATCH_NON_EXTERNAL); | 739 collector.errors.first.message.kind == MessageKind.PATCH_NON_EXTERNAL); |
| 740 Expect.equals(0, collector.warnings.length); | 740 Expect.equals(0, collector.warnings.length); |
| 741 Expect.equals(1, collector.infos.length); | 741 Expect.equals(1, collector.infos.length); |
| 742 Expect.isTrue(collector.infos.first.message.kind == | 742 Expect.isTrue(collector.infos.first.message.kind == |
| 743 MessageKind.PATCH_POINT_TO_FUNCTION); | 743 MessageKind.PATCH_POINT_TO_FUNCTION); |
| 744 } | 744 } |
| 745 | 745 |
| 746 Future testPatchNonExternalMember() async { | 746 Future testPatchNonExternalMember() async { |
| 747 var compiler = await applyPatch( | 747 dynamic compiler = await applyPatch( |
| 748 """ | 748 """ |
| 749 class Class { | 749 class Class { |
| 750 void foo() {} | 750 void foo() {} |
| 751 } | 751 } |
| 752 """, | 752 """, |
| 753 """ | 753 """ |
| 754 @patch class Class { | 754 @patch class Class { |
| 755 @patch void foo() {} | 755 @patch void foo() {} |
| 756 } | 756 } |
| 757 """); | 757 """); |
| 758 var container = ensure( | 758 dynamic container = ensure( |
| 759 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, | 759 compiler, "Class", compiler.resolution.commonElements.coreLibrary.find, |
| 760 expectIsPatched: true); | 760 expectIsPatched: true); |
| 761 container.parseNode(compiler.parsingContext); | 761 container.parseNode(compiler.parsingContext); |
| 762 | 762 |
| 763 DiagnosticCollector collector = compiler.diagnosticCollector; | 763 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 764 print('testPatchNonExternalMember.errors:${collector.errors}'); | 764 print('testPatchNonExternalMember.errors:${collector.errors}'); |
| 765 print('testPatchNonExternalMember.warnings:${collector.warnings}'); | 765 print('testPatchNonExternalMember.warnings:${collector.warnings}'); |
| 766 Expect.equals(1, collector.errors.length); | 766 Expect.equals(1, collector.errors.length); |
| 767 Expect.isTrue( | 767 Expect.isTrue( |
| 768 collector.errors.first.message.kind == MessageKind.PATCH_NON_EXTERNAL); | 768 collector.errors.first.message.kind == MessageKind.PATCH_NON_EXTERNAL); |
| 769 Expect.equals(0, collector.warnings.length); | 769 Expect.equals(0, collector.warnings.length); |
| 770 Expect.equals(1, collector.infos.length); | 770 Expect.equals(1, collector.infos.length); |
| 771 Expect.isTrue(collector.infos.first.message.kind == | 771 Expect.isTrue(collector.infos.first.message.kind == |
| 772 MessageKind.PATCH_POINT_TO_FUNCTION); | 772 MessageKind.PATCH_POINT_TO_FUNCTION); |
| 773 } | 773 } |
| 774 | 774 |
| 775 Future testPatchNonClass() async { | 775 Future testPatchNonClass() async { |
| 776 var compiler = await applyPatch( | 776 dynamic compiler = await applyPatch( |
| 777 """ | 777 """ |
| 778 external void Class() {} | 778 external void Class() {} |
| 779 """, | 779 """, |
| 780 """ | 780 """ |
| 781 @patch class Class {} | 781 @patch class Class {} |
| 782 """); | 782 """); |
| 783 DiagnosticCollector collector = compiler.diagnosticCollector; | 783 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 784 print('testPatchNonClass.errors:${collector.errors}'); | 784 print('testPatchNonClass.errors:${collector.errors}'); |
| 785 print('testPatchNonClass.warnings:${collector.warnings}'); | 785 print('testPatchNonClass.warnings:${collector.warnings}'); |
| 786 Expect.equals(1, collector.errors.length); | 786 Expect.equals(1, collector.errors.length); |
| 787 Expect.isTrue( | 787 Expect.isTrue( |
| 788 collector.errors.first.message.kind == MessageKind.PATCH_NON_CLASS); | 788 collector.errors.first.message.kind == MessageKind.PATCH_NON_CLASS); |
| 789 Expect.equals(0, collector.warnings.length); | 789 Expect.equals(0, collector.warnings.length); |
| 790 Expect.equals(1, collector.infos.length); | 790 Expect.equals(1, collector.infos.length); |
| 791 Expect.isTrue( | 791 Expect.isTrue( |
| 792 collector.infos.first.message.kind == MessageKind.PATCH_POINT_TO_CLASS); | 792 collector.infos.first.message.kind == MessageKind.PATCH_POINT_TO_CLASS); |
| 793 } | 793 } |
| 794 | 794 |
| 795 Future testPatchNonGetter() async { | 795 Future testPatchNonGetter() async { |
| 796 var compiler = await applyPatch( | 796 dynamic compiler = await applyPatch( |
| 797 """ | 797 """ |
| 798 external void foo() {} | 798 external void foo() {} |
| 799 """, | 799 """, |
| 800 """ | 800 """ |
| 801 @patch get foo => 0; | 801 @patch get foo => 0; |
| 802 """); | 802 """); |
| 803 DiagnosticCollector collector = compiler.diagnosticCollector; | 803 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 804 print('testPatchNonClass.errors:${collector.errors}'); | 804 print('testPatchNonClass.errors:${collector.errors}'); |
| 805 print('testPatchNonClass.warnings:${collector.warnings}'); | 805 print('testPatchNonClass.warnings:${collector.warnings}'); |
| 806 Expect.equals(1, collector.errors.length); | 806 Expect.equals(1, collector.errors.length); |
| 807 Expect.isTrue( | 807 Expect.isTrue( |
| 808 collector.errors.first.message.kind == MessageKind.PATCH_NON_GETTER); | 808 collector.errors.first.message.kind == MessageKind.PATCH_NON_GETTER); |
| 809 Expect.equals(0, collector.warnings.length); | 809 Expect.equals(0, collector.warnings.length); |
| 810 Expect.equals(1, collector.infos.length); | 810 Expect.equals(1, collector.infos.length); |
| 811 Expect.isTrue( | 811 Expect.isTrue( |
| 812 collector.infos.first.message.kind == MessageKind.PATCH_POINT_TO_GETTER); | 812 collector.infos.first.message.kind == MessageKind.PATCH_POINT_TO_GETTER); |
| 813 } | 813 } |
| 814 | 814 |
| 815 Future testPatchNoGetter() async { | 815 Future testPatchNoGetter() async { |
| 816 var compiler = await applyPatch( | 816 dynamic compiler = await applyPatch( |
| 817 """ | 817 """ |
| 818 external set foo(var value) {} | 818 external set foo(var value) {} |
| 819 """, | 819 """, |
| 820 """ | 820 """ |
| 821 @patch get foo => 0; | 821 @patch get foo => 0; |
| 822 """); | 822 """); |
| 823 DiagnosticCollector collector = compiler.diagnosticCollector; | 823 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 824 print('testPatchNonClass.errors:${collector.errors}'); | 824 print('testPatchNonClass.errors:${collector.errors}'); |
| 825 print('testPatchNonClass.warnings:${collector.warnings}'); | 825 print('testPatchNonClass.warnings:${collector.warnings}'); |
| 826 Expect.equals(1, collector.errors.length); | 826 Expect.equals(1, collector.errors.length); |
| 827 Expect.isTrue( | 827 Expect.isTrue( |
| 828 collector.errors.first.message.kind == MessageKind.PATCH_NO_GETTER); | 828 collector.errors.first.message.kind == MessageKind.PATCH_NO_GETTER); |
| 829 Expect.equals(0, collector.warnings.length); | 829 Expect.equals(0, collector.warnings.length); |
| 830 Expect.equals(1, collector.infos.length); | 830 Expect.equals(1, collector.infos.length); |
| 831 Expect.isTrue( | 831 Expect.isTrue( |
| 832 collector.infos.first.message.kind == MessageKind.PATCH_POINT_TO_GETTER); | 832 collector.infos.first.message.kind == MessageKind.PATCH_POINT_TO_GETTER); |
| 833 } | 833 } |
| 834 | 834 |
| 835 Future testPatchNonSetter() async { | 835 Future testPatchNonSetter() async { |
| 836 var compiler = await applyPatch( | 836 dynamic compiler = await applyPatch( |
| 837 """ | 837 """ |
| 838 external void foo() {} | 838 external void foo() {} |
| 839 """, | 839 """, |
| 840 """ | 840 """ |
| 841 @patch set foo(var value) {} | 841 @patch set foo(var value) {} |
| 842 """); | 842 """); |
| 843 DiagnosticCollector collector = compiler.diagnosticCollector; | 843 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 844 print('testPatchNonClass.errors:${collector.errors}'); | 844 print('testPatchNonClass.errors:${collector.errors}'); |
| 845 print('testPatchNonClass.warnings:${collector.warnings}'); | 845 print('testPatchNonClass.warnings:${collector.warnings}'); |
| 846 Expect.equals(1, collector.errors.length); | 846 Expect.equals(1, collector.errors.length); |
| 847 Expect.isTrue( | 847 Expect.isTrue( |
| 848 collector.errors.first.message.kind == MessageKind.PATCH_NON_SETTER); | 848 collector.errors.first.message.kind == MessageKind.PATCH_NON_SETTER); |
| 849 Expect.equals(0, collector.warnings.length); | 849 Expect.equals(0, collector.warnings.length); |
| 850 Expect.equals(1, collector.infos.length); | 850 Expect.equals(1, collector.infos.length); |
| 851 Expect.isTrue( | 851 Expect.isTrue( |
| 852 collector.infos.first.message.kind == MessageKind.PATCH_POINT_TO_SETTER); | 852 collector.infos.first.message.kind == MessageKind.PATCH_POINT_TO_SETTER); |
| 853 } | 853 } |
| 854 | 854 |
| 855 Future testPatchNoSetter() async { | 855 Future testPatchNoSetter() async { |
| 856 var compiler = await applyPatch( | 856 dynamic compiler = await applyPatch( |
| 857 """ | 857 """ |
| 858 external get foo; | 858 external get foo; |
| 859 """, | 859 """, |
| 860 """ | 860 """ |
| 861 @patch set foo(var value) {} | 861 @patch set foo(var value) {} |
| 862 """); | 862 """); |
| 863 DiagnosticCollector collector = compiler.diagnosticCollector; | 863 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 864 print('testPatchNonClass.errors:${collector.errors}'); | 864 print('testPatchNonClass.errors:${collector.errors}'); |
| 865 print('testPatchNonClass.warnings:${collector.warnings}'); | 865 print('testPatchNonClass.warnings:${collector.warnings}'); |
| 866 Expect.equals(1, collector.errors.length); | 866 Expect.equals(1, collector.errors.length); |
| 867 Expect.isTrue( | 867 Expect.isTrue( |
| 868 collector.errors.first.message.kind == MessageKind.PATCH_NO_SETTER); | 868 collector.errors.first.message.kind == MessageKind.PATCH_NO_SETTER); |
| 869 Expect.equals(0, collector.warnings.length); | 869 Expect.equals(0, collector.warnings.length); |
| 870 Expect.equals(1, collector.infos.length); | 870 Expect.equals(1, collector.infos.length); |
| 871 Expect.isTrue( | 871 Expect.isTrue( |
| 872 collector.infos.first.message.kind == MessageKind.PATCH_POINT_TO_SETTER); | 872 collector.infos.first.message.kind == MessageKind.PATCH_POINT_TO_SETTER); |
| 873 } | 873 } |
| 874 | 874 |
| 875 Future testPatchNonFunction() async { | 875 Future testPatchNonFunction() async { |
| 876 var compiler = await applyPatch( | 876 dynamic compiler = await applyPatch( |
| 877 """ | 877 """ |
| 878 external get foo; | 878 external get foo; |
| 879 """, | 879 """, |
| 880 """ | 880 """ |
| 881 @patch void foo() {} | 881 @patch void foo() {} |
| 882 """); | 882 """); |
| 883 DiagnosticCollector collector = compiler.diagnosticCollector; | 883 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 884 print('testPatchNonClass.errors:${collector.errors}'); | 884 print('testPatchNonClass.errors:${collector.errors}'); |
| 885 print('testPatchNonClass.warnings:${collector.warnings}'); | 885 print('testPatchNonClass.warnings:${collector.warnings}'); |
| 886 Expect.equals(1, collector.errors.length); | 886 Expect.equals(1, collector.errors.length); |
| 887 Expect.isTrue( | 887 Expect.isTrue( |
| 888 collector.errors.first.message.kind == MessageKind.PATCH_NON_FUNCTION); | 888 collector.errors.first.message.kind == MessageKind.PATCH_NON_FUNCTION); |
| 889 Expect.equals(0, collector.warnings.length); | 889 Expect.equals(0, collector.warnings.length); |
| 890 Expect.equals(1, collector.infos.length); | 890 Expect.equals(1, collector.infos.length); |
| 891 Expect.isTrue(collector.infos.first.message.kind == | 891 Expect.isTrue(collector.infos.first.message.kind == |
| 892 MessageKind.PATCH_POINT_TO_FUNCTION); | 892 MessageKind.PATCH_POINT_TO_FUNCTION); |
| 893 } | 893 } |
| 894 | 894 |
| 895 Future testPatchAndSelector() async { | 895 Future testPatchAndSelector() async { |
| 896 var compiler = await applyPatch( | 896 dynamic compiler = await applyPatch( |
| 897 """ | 897 """ |
| 898 class A { | 898 class A { |
| 899 external void clear(); | 899 external void clear(); |
| 900 } | 900 } |
| 901 class B extends A { | 901 class B extends A { |
| 902 } | 902 } |
| 903 """, | 903 """, |
| 904 """ | 904 """ |
| 905 @patch class A { | 905 @patch class A { |
| 906 int method() => 0; | 906 int method() => 0; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 961 Expect.isTrue(typeMask.canHit(method, selector, world)); | 961 Expect.isTrue(typeMask.canHit(method, selector, world)); |
| 962 } | 962 } |
| 963 | 963 |
| 964 Future testAnalyzeAllInjectedMembers() async { | 964 Future testAnalyzeAllInjectedMembers() async { |
| 965 Future expect(String patchText, [expectedWarnings]) async { | 965 Future expect(String patchText, [expectedWarnings]) async { |
| 966 if (expectedWarnings == null) expectedWarnings = []; | 966 if (expectedWarnings == null) expectedWarnings = []; |
| 967 if (expectedWarnings is! List) { | 967 if (expectedWarnings is! List) { |
| 968 expectedWarnings = <MessageKind>[expectedWarnings]; | 968 expectedWarnings = <MessageKind>[expectedWarnings]; |
| 969 } | 969 } |
| 970 | 970 |
| 971 var compiler = | 971 dynamic compiler = |
| 972 await applyPatch('', patchText, analyzeAll: true, analyzeOnly: true); | 972 await applyPatch('', patchText, analyzeAll: true, analyzeOnly: true); |
| 973 compiler.librariesToAnalyzeWhenRun = [Uri.parse('dart:core')]; | 973 compiler.librariesToAnalyzeWhenRun = [Uri.parse('dart:core')]; |
| 974 await compiler.run(null); | 974 await compiler.run(null); |
| 975 DiagnosticCollector collector = compiler.diagnosticCollector; | 975 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 976 compareWarningKinds(patchText, expectedWarnings, collector.warnings); | 976 compareWarningKinds(patchText, expectedWarnings, collector.warnings); |
| 977 } | 977 } |
| 978 | 978 |
| 979 await expect('String s = 0;', MessageKind.NOT_ASSIGNABLE); | 979 await expect('String s = 0;', MessageKind.NOT_ASSIGNABLE); |
| 980 await expect('void method() { String s = 0; }', MessageKind.NOT_ASSIGNABLE); | 980 await expect('void method() { String s = 0; }', MessageKind.NOT_ASSIGNABLE); |
| 981 await expect( | 981 await expect( |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1023 @patch | 1023 @patch |
| 1024 factory B.reflectBack() = B.originTarget; | 1024 factory B.reflectBack() = B.originTarget; |
| 1025 @patch | 1025 @patch |
| 1026 factory B.patchInjected() = _C.injected; | 1026 factory B.patchInjected() = _C.injected; |
| 1027 } | 1027 } |
| 1028 class _C extends B { | 1028 class _C extends B { |
| 1029 _C.injected() : super.patchTarget(); | 1029 _C.injected() : super.patchTarget(); |
| 1030 } | 1030 } |
| 1031 """; | 1031 """; |
| 1032 | 1032 |
| 1033 var compiler = await applyPatch(origin, patch, | 1033 dynamic compiler = await applyPatch(origin, patch, |
| 1034 analyzeAll: true, analyzeOnly: true, runCompiler: true); | 1034 analyzeAll: true, analyzeOnly: true, runCompiler: true); |
| 1035 ClassElement clsA = compiler.resolution.commonElements.coreLibrary.find("A"); | 1035 ClassElement clsA = compiler.resolution.commonElements.coreLibrary.find("A"); |
| 1036 ClassElement clsB = compiler.resolution.commonElements.coreLibrary.find("B"); | 1036 ClassElement clsB = compiler.resolution.commonElements.coreLibrary.find("B"); |
| 1037 Expect.isNotNull(clsB); |
| 1037 | 1038 |
| 1038 ConstructorElement forward = clsA.lookupConstructor("forward"); | 1039 ConstructorElement forward = clsA.lookupConstructor("forward"); |
| 1039 ConstructorElement target = forward.effectiveTarget; | 1040 ConstructorElement target = forward.effectiveTarget; |
| 1040 Expect.isTrue(target.isPatched, "Unexpected target $target for $forward"); | 1041 Expect.isTrue(target.isPatched, "Unexpected target $target for $forward"); |
| 1041 Expect.isFalse(target.isPatch, "Unexpected target $target for $forward"); | 1042 Expect.isFalse(target.isPatch, "Unexpected target $target for $forward"); |
| 1042 Expect.equals("patchTarget", target.name); | 1043 Expect.equals("patchTarget", target.name); |
| 1043 | 1044 |
| 1044 ConstructorElement forwardOne = clsA.lookupConstructor("forwardOne"); | 1045 ConstructorElement forwardOne = clsA.lookupConstructor("forwardOne"); |
| 1045 target = forwardOne.effectiveTarget; | 1046 target = forwardOne.effectiveTarget; |
| 1046 Expect.isFalse(forwardOne.isMalformed); | 1047 Expect.isFalse(forwardOne.isMalformed); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1061 Expect.equals("injected", target.name); | 1062 Expect.equals("injected", target.name); |
| 1062 } | 1063 } |
| 1063 | 1064 |
| 1064 Future testTypecheckPatchedMembers() async { | 1065 Future testTypecheckPatchedMembers() async { |
| 1065 String originText = "external void method();"; | 1066 String originText = "external void method();"; |
| 1066 String patchText = """ | 1067 String patchText = """ |
| 1067 @patch void method() { | 1068 @patch void method() { |
| 1068 String s = 0; | 1069 String s = 0; |
| 1069 } | 1070 } |
| 1070 """; | 1071 """; |
| 1071 var compiler = await applyPatch(originText, patchText, | 1072 dynamic compiler = await applyPatch(originText, patchText, |
| 1072 analyzeAll: true, analyzeOnly: true); | 1073 analyzeAll: true, analyzeOnly: true); |
| 1073 compiler.librariesToAnalyzeWhenRun = [Uri.parse('dart:core')]; | 1074 compiler.librariesToAnalyzeWhenRun = [Uri.parse('dart:core')]; |
| 1074 await compiler.run(null); | 1075 await compiler.run(null); |
| 1075 DiagnosticCollector collector = compiler.diagnosticCollector; | 1076 DiagnosticCollector collector = compiler.diagnosticCollector; |
| 1076 compareWarningKinds( | 1077 compareWarningKinds( |
| 1077 patchText, [MessageKind.NOT_ASSIGNABLE], collector.warnings); | 1078 patchText, [MessageKind.NOT_ASSIGNABLE], collector.warnings); |
| 1078 } | 1079 } |
| 1079 | 1080 |
| 1080 main() { | 1081 main() { |
| 1081 asyncTest(() async { | 1082 asyncTest(() async { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1114 await testPatchNonFunction(); | 1115 await testPatchNonFunction(); |
| 1115 | 1116 |
| 1116 await testPatchAndSelector(); | 1117 await testPatchAndSelector(); |
| 1117 | 1118 |
| 1118 await testEffectiveTarget(); | 1119 await testEffectiveTarget(); |
| 1119 | 1120 |
| 1120 await testAnalyzeAllInjectedMembers(); | 1121 await testAnalyzeAllInjectedMembers(); |
| 1121 await testTypecheckPatchedMembers(); | 1122 await testTypecheckPatchedMembers(); |
| 1122 }); | 1123 }); |
| 1123 } | 1124 } |
| OLD | NEW |