| 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:js_runtime/shared/embedded_names.dart'; | 5 import 'package:js_runtime/shared/embedded_names.dart'; |
| 6 import 'package:kernel/ast.dart' as ir; | 6 import 'package:kernel/ast.dart' as ir; |
| 7 | 7 |
| 8 import '../common.dart'; | 8 import '../common.dart'; |
| 9 import '../common/names.dart'; | 9 import '../common/names.dart'; |
| 10 import '../compiler.dart'; | 10 import '../compiler.dart'; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 import '../world.dart'; | 29 import '../world.dart'; |
| 30 import 'locals_handler.dart'; | 30 import 'locals_handler.dart'; |
| 31 import 'types.dart'; | 31 import 'types.dart'; |
| 32 | 32 |
| 33 /// A helper class that abstracts all accesses of the AST from Kernel nodes. | 33 /// A helper class that abstracts all accesses of the AST from Kernel nodes. |
| 34 /// | 34 /// |
| 35 /// The goal is to remove all need for the AST from the Kernel SSA builder. | 35 /// The goal is to remove all need for the AST from the Kernel SSA builder. |
| 36 class KernelAstAdapter { | 36 class KernelAstAdapter { |
| 37 final Kernel kernel; | 37 final Kernel kernel; |
| 38 final JavaScriptBackend _backend; | 38 final JavaScriptBackend _backend; |
| 39 final ResolvedAst _resolvedAst; | |
| 40 final Map<ir.Node, ast.Node> _nodeToAst; | 39 final Map<ir.Node, ast.Node> _nodeToAst; |
| 41 final Map<ir.Node, Element> _nodeToElement; | 40 final Map<ir.Node, Element> _nodeToElement; |
| 42 final Map<ir.VariableDeclaration, SyntheticLocal> _syntheticLocals = | 41 final Map<ir.VariableDeclaration, SyntheticLocal> _syntheticLocals = |
| 43 <ir.VariableDeclaration, SyntheticLocal>{}; | 42 <ir.VariableDeclaration, SyntheticLocal>{}; |
| 44 final Map<ir.LabeledStatement, KernelJumpTarget> _jumpTargets = | 43 final Map<ir.LabeledStatement, KernelJumpTarget> _jumpTargets = |
| 45 <ir.LabeledStatement, KernelJumpTarget>{}; | 44 <ir.LabeledStatement, KernelJumpTarget>{}; |
| 46 DartTypeConverter _typeConverter; | 45 DartTypeConverter _typeConverter; |
| 46 ResolvedAst _resolvedAst; |
| 47 |
| 48 /// Sometimes for resolution the resolved AST element needs to change (for |
| 49 /// example, if we're inlining, or if we're in a constructor, but then also |
| 50 /// constructing the field values). We keep track of this with a stack. |
| 51 final List<ResolvedAst> _resolvedAstStack = <ResolvedAst>[]; |
| 47 | 52 |
| 48 KernelAstAdapter(this.kernel, this._backend, this._resolvedAst, | 53 KernelAstAdapter(this.kernel, this._backend, this._resolvedAst, |
| 49 this._nodeToAst, this._nodeToElement) { | 54 this._nodeToAst, this._nodeToElement) { |
| 50 // TODO(het): Maybe just use all of the kernel maps directly? | 55 // TODO(het): Maybe just use all of the kernel maps directly? |
| 51 for (FieldElement fieldElement in kernel.fields.keys) { | 56 for (FieldElement fieldElement in kernel.fields.keys) { |
| 52 _nodeToElement[kernel.fields[fieldElement]] = fieldElement; | 57 _nodeToElement[kernel.fields[fieldElement]] = fieldElement; |
| 53 } | 58 } |
| 54 for (FunctionElement functionElement in kernel.functions.keys) { | 59 for (FunctionElement functionElement in kernel.functions.keys) { |
| 55 _nodeToElement[kernel.functions[functionElement]] = functionElement; | 60 _nodeToElement[kernel.functions[functionElement]] = functionElement; |
| 56 } | 61 } |
| 57 for (ClassElement classElement in kernel.classes.keys) { | 62 for (ClassElement classElement in kernel.classes.keys) { |
| 58 _nodeToElement[kernel.classes[classElement]] = classElement; | 63 _nodeToElement[kernel.classes[classElement]] = classElement; |
| 59 } | 64 } |
| 60 for (LibraryElement libraryElement in kernel.libraries.keys) { | 65 for (LibraryElement libraryElement in kernel.libraries.keys) { |
| 61 _nodeToElement[kernel.libraries[libraryElement]] = libraryElement; | 66 _nodeToElement[kernel.libraries[libraryElement]] = libraryElement; |
| 62 } | 67 } |
| 63 for (LocalFunctionElement localFunction in kernel.localFunctions.keys) { | 68 for (LocalFunctionElement localFunction in kernel.localFunctions.keys) { |
| 64 _nodeToElement[kernel.localFunctions[localFunction]] = localFunction; | 69 _nodeToElement[kernel.localFunctions[localFunction]] = localFunction; |
| 65 } | 70 } |
| 66 for (TypeVariableElement typeVariable in kernel.typeParameters.keys) { | 71 for (TypeVariableElement typeVariable in kernel.typeParameters.keys) { |
| 67 _nodeToElement[kernel.typeParameters[typeVariable]] = typeVariable; | 72 _nodeToElement[kernel.typeParameters[typeVariable]] = typeVariable; |
| 68 } | 73 } |
| 69 _typeConverter = new DartTypeConverter(this); | 74 _typeConverter = new DartTypeConverter(this); |
| 70 } | 75 } |
| 71 | 76 |
| 77 /// Push the existing resolved AST on the stack and shift the current resolved |
| 78 /// AST to the AST that this kernel node points to. |
| 79 void pushResolvedAst(ir.Node node) { |
| 80 _resolvedAstStack.add(_resolvedAst); |
| 81 _resolvedAst = (getElement(node) as AstElement).resolvedAst; |
| 82 } |
| 83 |
| 84 /// Pop the resolved AST stack to reset it to the previous resolved AST node. |
| 85 void popResolvedAstStack() { |
| 86 assert(_resolvedAstStack.isNotEmpty); |
| 87 _resolvedAst = _resolvedAstStack.removeLast(); |
| 88 } |
| 89 |
| 72 Compiler get _compiler => _backend.compiler; | 90 Compiler get _compiler => _backend.compiler; |
| 73 TreeElements get elements => _resolvedAst.elements; | 91 TreeElements get elements => _resolvedAst.elements; |
| 74 DiagnosticReporter get reporter => _compiler.reporter; | 92 DiagnosticReporter get reporter => _compiler.reporter; |
| 75 Element get _target => _resolvedAst.element; | 93 Element get _target => _resolvedAst.element; |
| 76 | 94 |
| 77 GlobalTypeInferenceResults get _globalInferenceResults => | 95 GlobalTypeInferenceResults get _globalInferenceResults => |
| 78 _compiler.globalInference.results; | 96 _compiler.globalInference.results; |
| 79 | 97 |
| 80 GlobalTypeInferenceElementResult _resultOf(Element e) => | 98 GlobalTypeInferenceElementResult _resultOf(Element e) => |
| 81 _globalInferenceResults.resultOf(e); | 99 _globalInferenceResults.resultOf(e); |
| (...skipping 860 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 942 | 960 |
| 943 @override | 961 @override |
| 944 String get name => null; | 962 String get name => null; |
| 945 | 963 |
| 946 @override | 964 @override |
| 947 int get nestingLevel => 1; | 965 int get nestingLevel => 1; |
| 948 | 966 |
| 949 @override | 967 @override |
| 950 ast.Node get statement => null; | 968 ast.Node get statement => null; |
| 951 } | 969 } |
| OLD | NEW |