| Index: pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
|
| diff --git a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
|
| index dbac0a01824c1a1dd540ba584389872b13ac9839..3fbfd8cb164eba963ddae0434caf0ec6706babb0 100644
|
| --- a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
|
| +++ b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
|
| @@ -5,6 +5,7 @@
|
| import 'package:js_runtime/shared/embedded_names.dart';
|
| import 'package:kernel/ast.dart' as ir;
|
|
|
| +import '../closure.dart';
|
| import '../common.dart';
|
| import '../compiler.dart';
|
| import '../constants/expressions.dart';
|
| @@ -86,6 +87,35 @@ class KernelAstAdapter extends KernelElementAdapterMixin {
|
| _typeConverter = new DartTypeConverter(this);
|
| }
|
|
|
| + /// Called to find the corresponding Kernel element for a particular Element
|
| + /// before traversing over it with a Kernel visitor.
|
| + ir.Node getInitialKernelNode(Element originTarget) {
|
| + ir.Node target;
|
| + if (originTarget.isPatch) {
|
| + originTarget = originTarget.origin;
|
| + }
|
| + if (originTarget is FunctionElement) {
|
| + if (originTarget is ConstructorBodyElement) {
|
| + ConstructorBodyElement body = originTarget;
|
| + originTarget = body.constructor;
|
| + }
|
| + target = kernel.functions[originTarget];
|
| + // Closures require a lookup one level deeper in the closure class mapper.
|
| + if (target == null) {
|
| + FunctionElement originTargetFunction = originTarget;
|
| + ClosureClassMap classMap = _compiler.closureToClassMapper
|
| + .getClosureToClassMapping(originTargetFunction.resolvedAst);
|
| + if (classMap.closureElement != null) {
|
| + target = kernel.localFunctions[classMap.closureElement];
|
| + }
|
| + }
|
| + } else if (originTarget is FieldElement) {
|
| + target = kernel.fields[originTarget];
|
| + }
|
| + assert(target != null);
|
| + return target;
|
| + }
|
| +
|
| @override
|
| CommonElements get commonElements => _compiler.commonElements;
|
|
|
|
|