Chromium Code Reviews| 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'; |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 22 import 'kernel_ast_adapter.dart'; | 22 import 'kernel_ast_adapter.dart'; |
| 23 import '../common/resolution.dart'; | 23 import '../common/resolution.dart'; |
| 24 | 24 |
| 25 /// Computes the [ResolutionImpact] for [resolvedAst] through kernel. | 25 /// Computes the [ResolutionImpact] for [resolvedAst] through kernel. |
| 26 ResolutionImpact build(Compiler compiler, ResolvedAst resolvedAst) { | 26 ResolutionImpact build(Compiler compiler, ResolvedAst resolvedAst) { |
| 27 AstElement element = resolvedAst.element; | 27 AstElement element = resolvedAst.element; |
| 28 JavaScriptBackend backend = compiler.backend; | 28 JavaScriptBackend backend = compiler.backend; |
| 29 Kernel kernel = backend.kernelTask.kernel; | 29 Kernel kernel = backend.kernelTask.kernel; |
| 30 KernelImpactBuilder builder = | 30 KernelImpactBuilder builder = |
| 31 new KernelImpactBuilder(resolvedAst, compiler, kernel); | 31 new KernelImpactBuilder(resolvedAst, compiler, kernel); |
| 32 if (element.isFunction) { | 32 if (element.isFunction || element.isGetter || element.isSetter) { |
| 33 ir.Procedure function = kernel.functions[element]; | 33 ir.Procedure function = kernel.functions[element]; |
| 34 if (function == null) { | 34 if (function == null) { |
| 35 print("FOUND NULL FUNCTION: $element"); | 35 print("FOUND NULL FUNCTION: $element"); |
| 36 } else { | 36 } else { |
| 37 return builder.buildProcedure(function); | 37 return builder.buildProcedure(function); |
| 38 } | 38 } |
| 39 } else { | 39 } else { |
| 40 ir.Field field = kernel.fields[element]; | 40 ir.Field field = kernel.fields[element]; |
| 41 if (field == null) { | 41 if (field == null) { |
| 42 print("FOUND NULL FUNCTION: $element"); | 42 print("FOUND NULL FIELD: $element"); |
| 43 } else { | 43 } else { |
| 44 return builder.buildField(field); | 44 return builder.buildField(field); |
| 45 } | 45 } |
| 46 } | 46 } |
| 47 return null; | 47 return null; |
| 48 } | 48 } |
| 49 | 49 |
| 50 class KernelImpactBuilder extends ir.Visitor { | 50 class KernelImpactBuilder extends ir.Visitor { |
| 51 final ResolvedAst resolvedAst; | 51 final ResolvedAst resolvedAst; |
| 52 final Compiler compiler; | 52 final Compiler compiler; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 86 if (!field.isConst) { | 86 if (!field.isConst) { |
| 87 impactBuilder.registerFeature(Feature.LAZY_FIELD); | 87 impactBuilder.registerFeature(Feature.LAZY_FIELD); |
| 88 } | 88 } |
| 89 } else { | 89 } else { |
| 90 impactBuilder.registerFeature(Feature.FIELD_WITHOUT_INITIALIZER); | 90 impactBuilder.registerFeature(Feature.FIELD_WITHOUT_INITIALIZER); |
| 91 } | 91 } |
| 92 return impactBuilder; | 92 return impactBuilder; |
| 93 } | 93 } |
| 94 | 94 |
| 95 ResolutionImpact buildProcedure(ir.Procedure procedure) { | 95 ResolutionImpact buildProcedure(ir.Procedure procedure) { |
| 96 if (procedure.kind == ir.ProcedureKind.Method || | 96 if (procedure.kind != ir.ProcedureKind.Factory) { |
| 97 procedure.kind == ir.ProcedureKind.Operator) { | |
| 98 checkFunctionTypes(procedure.function); | 97 checkFunctionTypes(procedure.function); |
| 99 visitNode(procedure.function.body); | 98 visitNode(procedure.function.body); |
| 100 switch (procedure.function.asyncMarker) { | 99 switch (procedure.function.asyncMarker) { |
| 101 case ir.AsyncMarker.Sync: | 100 case ir.AsyncMarker.Sync: |
| 102 break; | 101 break; |
| 103 case ir.AsyncMarker.SyncStar: | 102 case ir.AsyncMarker.SyncStar: |
| 104 impactBuilder.registerFeature(Feature.SYNC_STAR); | 103 impactBuilder.registerFeature(Feature.SYNC_STAR); |
| 105 break; | 104 break; |
| 106 case ir.AsyncMarker.Async: | 105 case ir.AsyncMarker.Async: |
| 107 impactBuilder.registerFeature(Feature.ASYNC); | 106 impactBuilder.registerFeature(Feature.ASYNC); |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 273 ir.Member target = node.target; | 272 ir.Member target = node.target; |
| 274 Element element = astAdapter.getElement(target).declaration; | 273 Element element = astAdapter.getElement(target).declaration; |
| 275 if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) { | 274 if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) { |
| 276 impactBuilder.registerStaticUse(new StaticUse.staticTearOff(element)); | 275 impactBuilder.registerStaticUse(new StaticUse.staticTearOff(element)); |
| 277 } else { | 276 } else { |
| 278 impactBuilder.registerStaticUse(new StaticUse.staticGet(element)); | 277 impactBuilder.registerStaticUse(new StaticUse.staticGet(element)); |
| 279 } | 278 } |
| 280 } | 279 } |
| 281 | 280 |
| 282 @override | 281 @override |
| 282 void visitStaticSet(ir.StaticSet node) { | |
| 283 visitNode(node.value); | |
| 284 Element element = astAdapter.getElement(node.target).declaration; | |
| 285 impactBuilder.registerStaticUse(new StaticUse.staticSet(element)); | |
| 286 } | |
| 287 | |
| 288 @override | |
| 283 void visitMethodInvocation(ir.MethodInvocation invocation) { | 289 void visitMethodInvocation(ir.MethodInvocation invocation) { |
| 284 var receiver = invocation.receiver; | 290 var receiver = invocation.receiver; |
| 285 if (receiver is ir.VariableGet && | 291 if (receiver is ir.VariableGet && |
| 286 receiver.variable.isFinal && | 292 receiver.variable.isFinal && |
| 287 receiver.variable.parent is ir.FunctionDeclaration) { | 293 receiver.variable.parent is ir.FunctionDeclaration) { |
| 288 // Invocation of a local function. No need for dynamic use. | 294 // Invocation of a local function. No need for dynamic use. |
| 289 } else { | 295 } else { |
| 290 visitNode(invocation.receiver); | 296 visitNode(invocation.receiver); |
| 291 impactBuilder.registerDynamicUse( | 297 impactBuilder.registerDynamicUse( |
| 292 new DynamicUse(astAdapter.getSelector(invocation), null)); | 298 new DynamicUse(astAdapter.getSelector(invocation), null)); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 377 impactBuilder.registerFeature(Feature.ASYNC_FOR_IN); | 383 impactBuilder.registerFeature(Feature.ASYNC_FOR_IN); |
| 378 } else { | 384 } else { |
| 379 impactBuilder.registerFeature(Feature.SYNC_FOR_IN); | 385 impactBuilder.registerFeature(Feature.SYNC_FOR_IN); |
| 380 impactBuilder | 386 impactBuilder |
| 381 .registerDynamicUse(new DynamicUse(Selectors.iterator, null)); | 387 .registerDynamicUse(new DynamicUse(Selectors.iterator, null)); |
| 382 } | 388 } |
| 383 impactBuilder.registerDynamicUse(new DynamicUse(Selectors.current, null)); | 389 impactBuilder.registerDynamicUse(new DynamicUse(Selectors.current, null)); |
| 384 impactBuilder.registerDynamicUse(new DynamicUse(Selectors.moveNext, null)); | 390 impactBuilder.registerDynamicUse(new DynamicUse(Selectors.moveNext, null)); |
| 385 } | 391 } |
| 386 | 392 |
| 393 @override | |
| 394 void visitTryCatch(ir.TryCatch node) { | |
| 395 visitNode(node.body); | |
| 396 visitNodes(node.catches); | |
| 397 } | |
| 398 | |
| 399 @override | |
| 400 void visitCatch(ir.Catch node) { | |
| 401 impactBuilder.registerFeature(Feature.CATCH_STATEMENT); | |
| 402 visitNode(node.exception); | |
| 403 if (node.stackTrace != null) { | |
| 404 impactBuilder.registerFeature(Feature.STACK_TRACE_IN_CATCH); | |
| 405 } | |
| 406 if (node.guard is! ir.DynamicType) { | |
| 407 impactBuilder.registerTypeUse( | |
| 408 new TypeUse.catchType(astAdapter.getDartType(node.guard))); | |
| 409 } | |
| 410 visitNode(node.body); | |
| 411 } | |
| 412 | |
| 413 @override | |
| 414 void visitTryFinally(ir.TryFinally node) { | |
| 415 visitNode(node.body); | |
|
Harry Terkelsen
2016/09/27 17:12:37
also visit the finalizer
Johnni Winther
2016/09/30 07:59:04
Done.
| |
| 416 } | |
| 417 | |
| 387 // TODO(johnniwinther): Make this throw and visit child nodes explicitly | 418 // TODO(johnniwinther): Make this throw and visit child nodes explicitly |
| 388 // instead to ensure that we don't visit unwanted parts of the ir. | 419 // instead to ensure that we don't visit unwanted parts of the ir. |
| 389 @override | 420 @override |
| 390 void defaultNode(ir.Node node) => node.visitChildren(this); | 421 void defaultNode(ir.Node node) => node.visitChildren(this); |
| 391 } | 422 } |
| OLD | NEW |