| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 'package:kernel/ast.dart' as ir; | 5 import 'package:kernel/ast.dart' as ir; |
| 6 | 6 |
| 7 import '../common.dart'; | 7 import '../common.dart'; |
| 8 import '../common/names.dart'; | 8 import '../common/names.dart'; |
| 9 import '../compiler.dart'; | 9 import '../compiler.dart'; |
| 10 import '../constants/expressions.dart'; | 10 import '../constants/expressions.dart'; |
| 11 import '../core_types.dart'; | 11 import '../core_types.dart'; |
| 12 import '../elements/types.dart'; | 12 import '../elements/types.dart'; |
| 13 import '../elements/elements.dart' show AstElement, ResolvedAst; | 13 import '../elements/elements.dart' show AstElement, ResolvedAst; |
| 14 import '../elements/entities.dart'; | 14 import '../elements/entities.dart'; |
| 15 import '../js_backend/backend.dart' show JavaScriptBackend; | 15 import '../js_backend/backend.dart' show JavaScriptBackend; |
| 16 import '../kernel/element_adapter.dart'; |
| 16 import '../kernel/kernel.dart'; | 17 import '../kernel/kernel.dart'; |
| 17 import '../kernel/kernel_debug.dart'; | 18 import '../kernel/kernel_debug.dart'; |
| 18 import '../resolution/registry.dart' show ResolutionWorldImpactBuilder; | 19 import '../resolution/registry.dart' show ResolutionWorldImpactBuilder; |
| 19 import '../universe/call_structure.dart'; | 20 import '../universe/call_structure.dart'; |
| 20 import '../universe/feature.dart'; | 21 import '../universe/feature.dart'; |
| 21 import '../universe/selector.dart'; | 22 import '../universe/selector.dart'; |
| 22 import '../universe/use.dart'; | 23 import '../universe/use.dart'; |
| 23 | 24 |
| 24 import 'kernel_ast_adapter.dart'; | 25 import 'kernel_ast_adapter.dart'; |
| 25 import '../common/resolution.dart'; | 26 import '../common/resolution.dart'; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 return builder.buildField(field); | 60 return builder.buildField(field); |
| 60 } | 61 } |
| 61 } else { | 62 } else { |
| 62 throw new UnsupportedError("Unsupported element: $element"); | 63 throw new UnsupportedError("Unsupported element: $element"); |
| 63 } | 64 } |
| 64 }); | 65 }); |
| 65 } | 66 } |
| 66 | 67 |
| 67 class KernelImpactBuilder extends ir.Visitor { | 68 class KernelImpactBuilder extends ir.Visitor { |
| 68 final ResolutionWorldImpactBuilder impactBuilder; | 69 final ResolutionWorldImpactBuilder impactBuilder; |
| 69 final KernelWorldBuilder astAdapter; | 70 final KernelElementAdapter elementAdapter; |
| 70 final CommonElements commonElements; | 71 final CommonElements commonElements; |
| 71 | 72 |
| 72 KernelImpactBuilder(String name, this.astAdapter, this.commonElements) | 73 KernelImpactBuilder(String name, this.elementAdapter, this.commonElements) |
| 73 : this.impactBuilder = new ResolutionWorldImpactBuilder(name); | 74 : this.impactBuilder = new ResolutionWorldImpactBuilder(name); |
| 74 | 75 |
| 75 /// Add a checked-mode type use of [type] if it is not `dynamic`. | 76 /// Add a checked-mode type use of [type] if it is not `dynamic`. |
| 76 DartType checkType(ir.DartType irType) { | 77 DartType checkType(ir.DartType irType) { |
| 77 DartType type = astAdapter.getDartType(irType); | 78 DartType type = elementAdapter.getDartType(irType); |
| 78 if (!type.isDynamic) { | 79 if (!type.isDynamic) { |
| 79 impactBuilder.registerTypeUse(new TypeUse.checkedModeCheck(type)); | 80 impactBuilder.registerTypeUse(new TypeUse.checkedModeCheck(type)); |
| 80 } | 81 } |
| 81 return type; | 82 return type; |
| 82 } | 83 } |
| 83 | 84 |
| 84 /// Add checked-mode type use for the parameter type and constant for the | 85 /// Add checked-mode type use for the parameter type and constant for the |
| 85 /// default value of [parameter]. | 86 /// default value of [parameter]. |
| 86 void handleParameter(ir.VariableDeclaration parameter) { | 87 void handleParameter(ir.VariableDeclaration parameter) { |
| 87 checkType(parameter.type); | 88 checkType(parameter.type); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 102 checkType(field.type); | 103 checkType(field.type); |
| 103 if (field.initializer != null) { | 104 if (field.initializer != null) { |
| 104 visitNode(field.initializer); | 105 visitNode(field.initializer); |
| 105 if (!field.isInstanceMember && | 106 if (!field.isInstanceMember && |
| 106 !field.isConst && | 107 !field.isConst && |
| 107 field.initializer is! ir.NullLiteral) { | 108 field.initializer is! ir.NullLiteral) { |
| 108 impactBuilder.registerFeature(Feature.LAZY_FIELD); | 109 impactBuilder.registerFeature(Feature.LAZY_FIELD); |
| 109 } | 110 } |
| 110 } | 111 } |
| 111 if (field.isInstanceMember && | 112 if (field.isInstanceMember && |
| 112 astAdapter.isNativeClass(field.enclosingClass)) { | 113 elementAdapter.isNativeClass(field.enclosingClass)) { |
| 113 impactBuilder | 114 impactBuilder.registerNativeData( |
| 114 .registerNativeData(astAdapter.getNativeBehaviorForFieldLoad(field)); | 115 elementAdapter.getNativeBehaviorForFieldLoad(field)); |
| 115 impactBuilder | 116 impactBuilder.registerNativeData( |
| 116 .registerNativeData(astAdapter.getNativeBehaviorForFieldStore(field)); | 117 elementAdapter.getNativeBehaviorForFieldStore(field)); |
| 117 } | 118 } |
| 118 return impactBuilder; | 119 return impactBuilder; |
| 119 } | 120 } |
| 120 | 121 |
| 121 ResolutionImpact buildConstructor(ir.Constructor constructor) { | 122 ResolutionImpact buildConstructor(ir.Constructor constructor) { |
| 122 handleSignature(constructor.function, checkReturnType: false); | 123 handleSignature(constructor.function, checkReturnType: false); |
| 123 visitNodes(constructor.initializers); | 124 visitNodes(constructor.initializers); |
| 124 visitNode(constructor.function.body); | 125 visitNode(constructor.function.body); |
| 125 return impactBuilder; | 126 return impactBuilder; |
| 126 } | 127 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 138 impactBuilder.registerFeature(Feature.ASYNC); | 139 impactBuilder.registerFeature(Feature.ASYNC); |
| 139 break; | 140 break; |
| 140 case ir.AsyncMarker.AsyncStar: | 141 case ir.AsyncMarker.AsyncStar: |
| 141 impactBuilder.registerFeature(Feature.ASYNC_STAR); | 142 impactBuilder.registerFeature(Feature.ASYNC_STAR); |
| 142 break; | 143 break; |
| 143 case ir.AsyncMarker.SyncYielding: | 144 case ir.AsyncMarker.SyncYielding: |
| 144 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, | 145 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, |
| 145 "Unexpected async marker: ${procedure.function.asyncMarker}"); | 146 "Unexpected async marker: ${procedure.function.asyncMarker}"); |
| 146 } | 147 } |
| 147 if (procedure.isExternal && | 148 if (procedure.isExternal && |
| 148 !astAdapter.isForeignLibrary(procedure.enclosingLibrary)) { | 149 !elementAdapter.isForeignLibrary(procedure.enclosingLibrary)) { |
| 149 impactBuilder | 150 impactBuilder.registerNativeData( |
| 150 .registerNativeData(astAdapter.getNativeBehaviorForMethod(procedure)); | 151 elementAdapter.getNativeBehaviorForMethod(procedure)); |
| 151 } | 152 } |
| 152 return impactBuilder; | 153 return impactBuilder; |
| 153 } | 154 } |
| 154 | 155 |
| 155 void visitNode(ir.Node node) => node?.accept(this); | 156 void visitNode(ir.Node node) => node?.accept(this); |
| 156 | 157 |
| 157 void visitNodes(Iterable<ir.Node> nodes) { | 158 void visitNodes(Iterable<ir.Node> nodes) { |
| 158 nodes.forEach(visitNode); | 159 nodes.forEach(visitNode); |
| 159 } | 160 } |
| 160 | 161 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 } | 246 } |
| 246 | 247 |
| 247 @override | 248 @override |
| 248 void visitConstructorInvocation(ir.ConstructorInvocation node) { | 249 void visitConstructorInvocation(ir.ConstructorInvocation node) { |
| 249 handleNew(node, node.target, isConst: node.isConst); | 250 handleNew(node, node.target, isConst: node.isConst); |
| 250 } | 251 } |
| 251 | 252 |
| 252 void handleNew(ir.InvocationExpression node, ir.Member target, | 253 void handleNew(ir.InvocationExpression node, ir.Member target, |
| 253 {bool isConst: false}) { | 254 {bool isConst: false}) { |
| 254 _visitArguments(node.arguments); | 255 _visitArguments(node.arguments); |
| 255 FunctionEntity constructor = astAdapter.getConstructor(target); | 256 FunctionEntity constructor = elementAdapter.getConstructor(target); |
| 256 InterfaceType type = astAdapter.createInterfaceType( | 257 InterfaceType type = elementAdapter.createInterfaceType( |
| 257 target.enclosingClass, node.arguments.types); | 258 target.enclosingClass, node.arguments.types); |
| 258 CallStructure callStructure = astAdapter.getCallStructure(node.arguments); | 259 CallStructure callStructure = |
| 260 elementAdapter.getCallStructure(node.arguments); |
| 259 impactBuilder.registerStaticUse(isConst | 261 impactBuilder.registerStaticUse(isConst |
| 260 ? new StaticUse.constConstructorInvoke(constructor, callStructure, type) | 262 ? new StaticUse.constConstructorInvoke(constructor, callStructure, type) |
| 261 : new StaticUse.typedConstructorInvoke( | 263 : new StaticUse.typedConstructorInvoke( |
| 262 constructor, callStructure, type)); | 264 constructor, callStructure, type)); |
| 263 if (type.typeArguments.any((DartType type) => !type.isDynamic)) { | 265 if (type.typeArguments.any((DartType type) => !type.isDynamic)) { |
| 264 impactBuilder.registerFeature(Feature.TYPE_VARIABLE_BOUNDS_CHECK); | 266 impactBuilder.registerFeature(Feature.TYPE_VARIABLE_BOUNDS_CHECK); |
| 265 } | 267 } |
| 266 } | 268 } |
| 267 | 269 |
| 268 @override | 270 @override |
| 269 void visitSuperInitializer(ir.SuperInitializer node) { | 271 void visitSuperInitializer(ir.SuperInitializer node) { |
| 270 FunctionEntity target = astAdapter.getConstructor(node.target); | 272 FunctionEntity target = elementAdapter.getConstructor(node.target); |
| 271 _visitArguments(node.arguments); | 273 _visitArguments(node.arguments); |
| 272 impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke( | 274 impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke( |
| 273 target, astAdapter.getCallStructure(node.arguments))); | 275 target, elementAdapter.getCallStructure(node.arguments))); |
| 274 } | 276 } |
| 275 | 277 |
| 276 @override | 278 @override |
| 277 void visitStaticInvocation(ir.StaticInvocation node) { | 279 void visitStaticInvocation(ir.StaticInvocation node) { |
| 278 FunctionEntity target = astAdapter.getMethod(node.target); | 280 FunctionEntity target = elementAdapter.getMethod(node.target); |
| 279 if (node.target.kind == ir.ProcedureKind.Factory) { | 281 if (node.target.kind == ir.ProcedureKind.Factory) { |
| 280 // TODO(johnniwinther): We should not mark the type as instantiated but | 282 // TODO(johnniwinther): We should not mark the type as instantiated but |
| 281 // rather follow the type arguments directly. | 283 // rather follow the type arguments directly. |
| 282 // | 284 // |
| 283 // Consider this: | 285 // Consider this: |
| 284 // | 286 // |
| 285 // abstract class A<T> { | 287 // abstract class A<T> { |
| 286 // factory A.regular() => new B<T>(); | 288 // factory A.regular() => new B<T>(); |
| 287 // factory A.redirect() = B<T>; | 289 // factory A.redirect() = B<T>; |
| 288 // } | 290 // } |
| 289 // | 291 // |
| 290 // class B<T> implements A<T> {} | 292 // class B<T> implements A<T> {} |
| 291 // | 293 // |
| 292 // main() { | 294 // main() { |
| 293 // print(new A<int>.regular() is B<int>); | 295 // print(new A<int>.regular() is B<int>); |
| 294 // print(new A<String>.redirect() is B<String>); | 296 // print(new A<String>.redirect() is B<String>); |
| 295 // } | 297 // } |
| 296 // | 298 // |
| 297 // To track that B is actually instantiated as B<int> and B<String> we | 299 // To track that B is actually instantiated as B<int> and B<String> we |
| 298 // need to follow the type arguments passed to A.regular and A.redirect | 300 // need to follow the type arguments passed to A.regular and A.redirect |
| 299 // to B. Currently, we only do this soundly if we register A<int> and | 301 // to B. Currently, we only do this soundly if we register A<int> and |
| 300 // A<String> as instantiated. We should instead register that A.T is | 302 // A<String> as instantiated. We should instead register that A.T is |
| 301 // instantiated as int and String. | 303 // instantiated as int and String. |
| 302 handleNew(node, node.target, isConst: node.isConst); | 304 handleNew(node, node.target, isConst: node.isConst); |
| 303 } else { | 305 } else { |
| 304 _visitArguments(node.arguments); | 306 _visitArguments(node.arguments); |
| 305 impactBuilder.registerStaticUse(new StaticUse.staticInvoke( | 307 impactBuilder.registerStaticUse(new StaticUse.staticInvoke( |
| 306 target, astAdapter.getCallStructure(node.arguments))); | 308 target, elementAdapter.getCallStructure(node.arguments))); |
| 307 } | 309 } |
| 308 switch (astAdapter.getForeignKind(node)) { | 310 switch (elementAdapter.getForeignKind(node)) { |
| 309 case ForeignKind.JS: | 311 case ForeignKind.JS: |
| 310 impactBuilder | 312 impactBuilder.registerNativeData( |
| 311 .registerNativeData(astAdapter.getNativeBehaviorForJsCall(node)); | 313 elementAdapter.getNativeBehaviorForJsCall(node)); |
| 312 break; | 314 break; |
| 313 case ForeignKind.JS_BUILTIN: | 315 case ForeignKind.JS_BUILTIN: |
| 314 impactBuilder.registerNativeData( | 316 impactBuilder.registerNativeData( |
| 315 astAdapter.getNativeBehaviorForJsBuiltinCall(node)); | 317 elementAdapter.getNativeBehaviorForJsBuiltinCall(node)); |
| 316 break; | 318 break; |
| 317 case ForeignKind.JS_EMBEDDED_GLOBAL: | 319 case ForeignKind.JS_EMBEDDED_GLOBAL: |
| 318 impactBuilder.registerNativeData( | 320 impactBuilder.registerNativeData( |
| 319 astAdapter.getNativeBehaviorForJsEmbeddedGlobalCall(node)); | 321 elementAdapter.getNativeBehaviorForJsEmbeddedGlobalCall(node)); |
| 320 break; | 322 break; |
| 321 case ForeignKind.JS_INTERCEPTOR_CONSTANT: | 323 case ForeignKind.JS_INTERCEPTOR_CONSTANT: |
| 322 InterfaceType type = | 324 InterfaceType type = |
| 323 astAdapter.getInterfaceTypeForJsInterceptorCall(node); | 325 elementAdapter.getInterfaceTypeForJsInterceptorCall(node); |
| 324 if (type != null) { | 326 if (type != null) { |
| 325 impactBuilder.registerTypeUse(new TypeUse.instantiation(type)); | 327 impactBuilder.registerTypeUse(new TypeUse.instantiation(type)); |
| 326 } | 328 } |
| 327 break; | 329 break; |
| 328 case ForeignKind.NONE: | 330 case ForeignKind.NONE: |
| 329 break; | 331 break; |
| 330 } | 332 } |
| 331 } | 333 } |
| 332 | 334 |
| 333 @override | 335 @override |
| 334 void visitStaticGet(ir.StaticGet node) { | 336 void visitStaticGet(ir.StaticGet node) { |
| 335 ir.Member target = node.target; | 337 ir.Member target = node.target; |
| 336 if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) { | 338 if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) { |
| 337 FunctionEntity method = astAdapter.getMethod(target); | 339 FunctionEntity method = elementAdapter.getMethod(target); |
| 338 impactBuilder.registerStaticUse(new StaticUse.staticTearOff(method)); | 340 impactBuilder.registerStaticUse(new StaticUse.staticTearOff(method)); |
| 339 } else { | 341 } else { |
| 340 MemberEntity member = astAdapter.getMember(target); | 342 MemberEntity member = elementAdapter.getMember(target); |
| 341 impactBuilder.registerStaticUse(new StaticUse.staticGet(member)); | 343 impactBuilder.registerStaticUse(new StaticUse.staticGet(member)); |
| 342 } | 344 } |
| 343 } | 345 } |
| 344 | 346 |
| 345 @override | 347 @override |
| 346 void visitStaticSet(ir.StaticSet node) { | 348 void visitStaticSet(ir.StaticSet node) { |
| 347 visitNode(node.value); | 349 visitNode(node.value); |
| 348 MemberEntity member = astAdapter.getMember(node.target); | 350 MemberEntity member = elementAdapter.getMember(node.target); |
| 349 impactBuilder.registerStaticUse(new StaticUse.staticSet(member)); | 351 impactBuilder.registerStaticUse(new StaticUse.staticSet(member)); |
| 350 } | 352 } |
| 351 | 353 |
| 352 void handleSuperInvocation(ir.Node target, ir.Node arguments) { | 354 void handleSuperInvocation(ir.Node target, ir.Node arguments) { |
| 353 FunctionEntity method = astAdapter.getMethod(target); | 355 FunctionEntity method = elementAdapter.getMethod(target); |
| 354 _visitArguments(arguments); | 356 _visitArguments(arguments); |
| 355 impactBuilder.registerStaticUse(new StaticUse.superInvoke( | 357 impactBuilder.registerStaticUse(new StaticUse.superInvoke( |
| 356 method, astAdapter.getCallStructure(arguments))); | 358 method, elementAdapter.getCallStructure(arguments))); |
| 357 } | 359 } |
| 358 | 360 |
| 359 @override | 361 @override |
| 360 void visitDirectMethodInvocation(ir.DirectMethodInvocation node) { | 362 void visitDirectMethodInvocation(ir.DirectMethodInvocation node) { |
| 361 handleSuperInvocation(node.target, node.arguments); | 363 handleSuperInvocation(node.target, node.arguments); |
| 362 } | 364 } |
| 363 | 365 |
| 364 @override | 366 @override |
| 365 void visitSuperMethodInvocation(ir.SuperMethodInvocation node) { | 367 void visitSuperMethodInvocation(ir.SuperMethodInvocation node) { |
| 366 // TODO(johnniwinther): Should we support this or always use the | 368 // TODO(johnniwinther): Should we support this or always use the |
| 367 // [MixinFullResolution] transformer? | 369 // [MixinFullResolution] transformer? |
| 368 handleSuperInvocation(node.interfaceTarget, node.arguments); | 370 handleSuperInvocation(node.interfaceTarget, node.arguments); |
| 369 } | 371 } |
| 370 | 372 |
| 371 void handleSuperGet(ir.Member target) { | 373 void handleSuperGet(ir.Member target) { |
| 372 if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) { | 374 if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) { |
| 373 FunctionEntity method = astAdapter.getMethod(target); | 375 FunctionEntity method = elementAdapter.getMethod(target); |
| 374 impactBuilder.registerStaticUse(new StaticUse.superTearOff(method)); | 376 impactBuilder.registerStaticUse(new StaticUse.superTearOff(method)); |
| 375 } else { | 377 } else { |
| 376 MemberEntity member = astAdapter.getMember(target); | 378 MemberEntity member = elementAdapter.getMember(target); |
| 377 impactBuilder.registerStaticUse(new StaticUse.superGet(member)); | 379 impactBuilder.registerStaticUse(new StaticUse.superGet(member)); |
| 378 } | 380 } |
| 379 } | 381 } |
| 380 | 382 |
| 381 @override | 383 @override |
| 382 void visitDirectPropertyGet(ir.DirectPropertyGet node) { | 384 void visitDirectPropertyGet(ir.DirectPropertyGet node) { |
| 383 handleSuperGet(node.target); | 385 handleSuperGet(node.target); |
| 384 } | 386 } |
| 385 | 387 |
| 386 @override | 388 @override |
| 387 void visitSuperPropertyGet(ir.SuperPropertyGet node) { | 389 void visitSuperPropertyGet(ir.SuperPropertyGet node) { |
| 388 handleSuperGet(node.interfaceTarget); | 390 handleSuperGet(node.interfaceTarget); |
| 389 } | 391 } |
| 390 | 392 |
| 391 void handleSuperSet(ir.Node target, ir.Node value) { | 393 void handleSuperSet(ir.Node target, ir.Node value) { |
| 392 visitNode(value); | 394 visitNode(value); |
| 393 if (target is ir.Field) { | 395 if (target is ir.Field) { |
| 394 FieldEntity field = astAdapter.getField(target); | 396 FieldEntity field = elementAdapter.getField(target); |
| 395 impactBuilder.registerStaticUse(new StaticUse.superFieldSet(field)); | 397 impactBuilder.registerStaticUse(new StaticUse.superFieldSet(field)); |
| 396 } else { | 398 } else { |
| 397 FunctionEntity method = astAdapter.getMethod(target); | 399 FunctionEntity method = elementAdapter.getMethod(target); |
| 398 impactBuilder.registerStaticUse(new StaticUse.superSetterSet(method)); | 400 impactBuilder.registerStaticUse(new StaticUse.superSetterSet(method)); |
| 399 } | 401 } |
| 400 } | 402 } |
| 401 | 403 |
| 402 @override | 404 @override |
| 403 void visitDirectPropertySet(ir.DirectPropertySet node) { | 405 void visitDirectPropertySet(ir.DirectPropertySet node) { |
| 404 handleSuperSet(node.target, node.value); | 406 handleSuperSet(node.target, node.value); |
| 405 } | 407 } |
| 406 | 408 |
| 407 @override | 409 @override |
| 408 void visitSuperPropertySet(ir.SuperPropertySet node) { | 410 void visitSuperPropertySet(ir.SuperPropertySet node) { |
| 409 handleSuperSet(node.interfaceTarget, node.value); | 411 handleSuperSet(node.interfaceTarget, node.value); |
| 410 } | 412 } |
| 411 | 413 |
| 412 @override | 414 @override |
| 413 void visitMethodInvocation(ir.MethodInvocation invocation) { | 415 void visitMethodInvocation(ir.MethodInvocation invocation) { |
| 414 var receiver = invocation.receiver; | 416 var receiver = invocation.receiver; |
| 415 if (receiver is ir.VariableGet && | 417 if (receiver is ir.VariableGet && |
| 416 receiver.variable.isFinal && | 418 receiver.variable.isFinal && |
| 417 receiver.variable.parent is ir.FunctionDeclaration) { | 419 receiver.variable.parent is ir.FunctionDeclaration) { |
| 418 // Invocation of a local function. No need for dynamic use. | 420 // Invocation of a local function. No need for dynamic use. |
| 419 } else { | 421 } else { |
| 420 visitNode(invocation.receiver); | 422 visitNode(invocation.receiver); |
| 421 impactBuilder.registerDynamicUse( | 423 impactBuilder.registerDynamicUse( |
| 422 new DynamicUse(astAdapter.getSelector(invocation), null)); | 424 new DynamicUse(elementAdapter.getSelector(invocation), null)); |
| 423 } | 425 } |
| 424 _visitArguments(invocation.arguments); | 426 _visitArguments(invocation.arguments); |
| 425 } | 427 } |
| 426 | 428 |
| 427 @override | 429 @override |
| 428 void visitPropertyGet(ir.PropertyGet node) { | 430 void visitPropertyGet(ir.PropertyGet node) { |
| 429 visitNode(node.receiver); | 431 visitNode(node.receiver); |
| 430 impactBuilder.registerDynamicUse(new DynamicUse( | 432 impactBuilder.registerDynamicUse(new DynamicUse( |
| 431 new Selector.getter(astAdapter.getName(node.name)), null)); | 433 new Selector.getter(elementAdapter.getName(node.name)), null)); |
| 432 } | 434 } |
| 433 | 435 |
| 434 @override | 436 @override |
| 435 void visitPropertySet(ir.PropertySet node) { | 437 void visitPropertySet(ir.PropertySet node) { |
| 436 visitNode(node.receiver); | 438 visitNode(node.receiver); |
| 437 visitNode(node.value); | 439 visitNode(node.value); |
| 438 impactBuilder.registerDynamicUse(new DynamicUse( | 440 impactBuilder.registerDynamicUse(new DynamicUse( |
| 439 new Selector.setter(astAdapter.getName(node.name)), null)); | 441 new Selector.setter(elementAdapter.getName(node.name)), null)); |
| 440 } | 442 } |
| 441 | 443 |
| 442 @override | 444 @override |
| 443 void visitAssertStatement(ir.AssertStatement node) { | 445 void visitAssertStatement(ir.AssertStatement node) { |
| 444 impactBuilder.registerFeature( | 446 impactBuilder.registerFeature( |
| 445 node.message != null ? Feature.ASSERT_WITH_MESSAGE : Feature.ASSERT); | 447 node.message != null ? Feature.ASSERT_WITH_MESSAGE : Feature.ASSERT); |
| 446 visitNode(node.condition); | 448 visitNode(node.condition); |
| 447 visitNode(node.message); | 449 visitNode(node.message); |
| 448 } | 450 } |
| 449 | 451 |
| 450 @override | 452 @override |
| 451 void visitStringConcatenation(ir.StringConcatenation node) { | 453 void visitStringConcatenation(ir.StringConcatenation node) { |
| 452 impactBuilder.registerFeature(Feature.STRING_INTERPOLATION); | 454 impactBuilder.registerFeature(Feature.STRING_INTERPOLATION); |
| 453 impactBuilder.registerFeature(Feature.STRING_JUXTAPOSITION); | 455 impactBuilder.registerFeature(Feature.STRING_JUXTAPOSITION); |
| 454 visitNodes(node.expressions); | 456 visitNodes(node.expressions); |
| 455 } | 457 } |
| 456 | 458 |
| 457 @override | 459 @override |
| 458 void visitFunctionDeclaration(ir.FunctionDeclaration node) { | 460 void visitFunctionDeclaration(ir.FunctionDeclaration node) { |
| 459 impactBuilder.registerStaticUse( | 461 impactBuilder.registerStaticUse( |
| 460 new StaticUse.closure(astAdapter.getLocalFunction(node))); | 462 new StaticUse.closure(elementAdapter.getLocalFunction(node))); |
| 461 handleSignature(node.function); | 463 handleSignature(node.function); |
| 462 visitNode(node.function.body); | 464 visitNode(node.function.body); |
| 463 } | 465 } |
| 464 | 466 |
| 465 @override | 467 @override |
| 466 void visitFunctionExpression(ir.FunctionExpression node) { | 468 void visitFunctionExpression(ir.FunctionExpression node) { |
| 467 impactBuilder.registerStaticUse( | 469 impactBuilder.registerStaticUse( |
| 468 new StaticUse.closure(astAdapter.getLocalFunction(node))); | 470 new StaticUse.closure(elementAdapter.getLocalFunction(node))); |
| 469 handleSignature(node.function); | 471 handleSignature(node.function); |
| 470 visitNode(node.function.body); | 472 visitNode(node.function.body); |
| 471 } | 473 } |
| 472 | 474 |
| 473 @override | 475 @override |
| 474 void visitVariableDeclaration(ir.VariableDeclaration node) { | 476 void visitVariableDeclaration(ir.VariableDeclaration node) { |
| 475 checkType(node.type); | 477 checkType(node.type); |
| 476 if (node.initializer != null) { | 478 if (node.initializer != null) { |
| 477 visitNode(node.initializer); | 479 visitNode(node.initializer); |
| 478 } else { | 480 } else { |
| 479 impactBuilder.registerFeature(Feature.LOCAL_WITHOUT_INITIALIZER); | 481 impactBuilder.registerFeature(Feature.LOCAL_WITHOUT_INITIALIZER); |
| 480 } | 482 } |
| 481 } | 483 } |
| 482 | 484 |
| 483 @override | 485 @override |
| 484 void visitIsExpression(ir.IsExpression node) { | 486 void visitIsExpression(ir.IsExpression node) { |
| 485 impactBuilder.registerTypeUse( | 487 impactBuilder.registerTypeUse( |
| 486 new TypeUse.isCheck(astAdapter.getDartType(node.type))); | 488 new TypeUse.isCheck(elementAdapter.getDartType(node.type))); |
| 487 visitNode(node.operand); | 489 visitNode(node.operand); |
| 488 } | 490 } |
| 489 | 491 |
| 490 @override | 492 @override |
| 491 void visitAsExpression(ir.AsExpression node) { | 493 void visitAsExpression(ir.AsExpression node) { |
| 492 impactBuilder | 494 impactBuilder.registerTypeUse( |
| 493 .registerTypeUse(new TypeUse.asCast(astAdapter.getDartType(node.type))); | 495 new TypeUse.asCast(elementAdapter.getDartType(node.type))); |
| 494 visitNode(node.operand); | 496 visitNode(node.operand); |
| 495 } | 497 } |
| 496 | 498 |
| 497 @override | 499 @override |
| 498 void visitThrow(ir.Throw node) { | 500 void visitThrow(ir.Throw node) { |
| 499 impactBuilder.registerFeature(Feature.THROW_EXPRESSION); | 501 impactBuilder.registerFeature(Feature.THROW_EXPRESSION); |
| 500 visitNode(node.expression); | 502 visitNode(node.expression); |
| 501 } | 503 } |
| 502 | 504 |
| 503 @override | 505 @override |
| (...skipping 19 matching lines...) Expand all Loading... |
| 523 } | 525 } |
| 524 | 526 |
| 525 @override | 527 @override |
| 526 void visitCatch(ir.Catch node) { | 528 void visitCatch(ir.Catch node) { |
| 527 impactBuilder.registerFeature(Feature.CATCH_STATEMENT); | 529 impactBuilder.registerFeature(Feature.CATCH_STATEMENT); |
| 528 if (node.stackTrace != null) { | 530 if (node.stackTrace != null) { |
| 529 impactBuilder.registerFeature(Feature.STACK_TRACE_IN_CATCH); | 531 impactBuilder.registerFeature(Feature.STACK_TRACE_IN_CATCH); |
| 530 } | 532 } |
| 531 if (node.guard is! ir.DynamicType) { | 533 if (node.guard is! ir.DynamicType) { |
| 532 impactBuilder.registerTypeUse( | 534 impactBuilder.registerTypeUse( |
| 533 new TypeUse.catchType(astAdapter.getDartType(node.guard))); | 535 new TypeUse.catchType(elementAdapter.getDartType(node.guard))); |
| 534 } | 536 } |
| 535 visitNode(node.body); | 537 visitNode(node.body); |
| 536 } | 538 } |
| 537 | 539 |
| 538 @override | 540 @override |
| 539 void visitTryFinally(ir.TryFinally node) { | 541 void visitTryFinally(ir.TryFinally node) { |
| 540 visitNode(node.body); | 542 visitNode(node.body); |
| 541 visitNode(node.finalizer); | 543 visitNode(node.finalizer); |
| 542 } | 544 } |
| 543 | 545 |
| 544 @override | 546 @override |
| 545 void visitTypeLiteral(ir.TypeLiteral node) { | 547 void visitTypeLiteral(ir.TypeLiteral node) { |
| 546 impactBuilder.registerTypeUse( | 548 impactBuilder.registerTypeUse( |
| 547 new TypeUse.typeLiteral(astAdapter.getDartType(node.type))); | 549 new TypeUse.typeLiteral(elementAdapter.getDartType(node.type))); |
| 548 } | 550 } |
| 549 | 551 |
| 550 @override | 552 @override |
| 551 void visitFieldInitializer(ir.FieldInitializer node) { | 553 void visitFieldInitializer(ir.FieldInitializer node) { |
| 552 impactBuilder.registerStaticUse( | 554 impactBuilder.registerStaticUse( |
| 553 new StaticUse.fieldInit(astAdapter.getField(node.field))); | 555 new StaticUse.fieldInit(elementAdapter.getField(node.field))); |
| 554 visitNode(node.value); | 556 visitNode(node.value); |
| 555 } | 557 } |
| 556 | 558 |
| 557 @override | 559 @override |
| 558 void visitRedirectingInitializer(ir.RedirectingInitializer node) { | 560 void visitRedirectingInitializer(ir.RedirectingInitializer node) { |
| 559 _visitArguments(node.arguments); | 561 _visitArguments(node.arguments); |
| 560 FunctionEntity target = astAdapter.getConstructor(node.target); | 562 FunctionEntity target = elementAdapter.getConstructor(node.target); |
| 561 impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke( | 563 impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke( |
| 562 target, astAdapter.getCallStructure(node.arguments))); | 564 target, elementAdapter.getCallStructure(node.arguments))); |
| 563 } | 565 } |
| 564 | 566 |
| 565 // TODO(johnniwinther): Make this throw and visit child nodes explicitly | 567 // TODO(johnniwinther): Make this throw and visit child nodes explicitly |
| 566 // instead to ensure that we don't visit unwanted parts of the ir. | 568 // instead to ensure that we don't visit unwanted parts of the ir. |
| 567 @override | 569 @override |
| 568 void defaultNode(ir.Node node) => node.visitChildren(this); | 570 void defaultNode(ir.Node node) => node.visitChildren(this); |
| 569 } | 571 } |
| OLD | NEW |