| 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 '../compiler.dart'; | 8 import '../compiler.dart'; |
| 9 import '../constants/values.dart'; | 9 import '../constants/values.dart'; |
| 10 import '../dart_types.dart'; | 10 import '../dart_types.dart'; |
| 11 import '../elements/elements.dart'; | 11 import '../elements/elements.dart'; |
| 12 import '../js_backend/js_backend.dart'; | 12 import '../js_backend/js_backend.dart'; |
| 13 import '../kernel/kernel.dart'; |
| 13 import '../resolution/tree_elements.dart'; | 14 import '../resolution/tree_elements.dart'; |
| 14 import '../tree/tree.dart' as ast; | 15 import '../tree/tree.dart' as ast; |
| 15 import '../types/masks.dart'; | 16 import '../types/masks.dart'; |
| 16 import '../universe/call_structure.dart'; | 17 import '../universe/call_structure.dart'; |
| 17 import '../universe/selector.dart'; | 18 import '../universe/selector.dart'; |
| 18 import '../universe/side_effects.dart'; | 19 import '../universe/side_effects.dart'; |
| 19 | |
| 20 import 'types.dart'; | 20 import 'types.dart'; |
| 21 | 21 |
| 22 /// A helper class that abstracts all accesses of the AST from Kernel nodes. | 22 /// A helper class that abstracts all accesses of the AST from Kernel nodes. |
| 23 /// | 23 /// |
| 24 /// The goal is to remove all need for the AST from the Kernel SSA builder. | 24 /// The goal is to remove all need for the AST from the Kernel SSA builder. |
| 25 class KernelAstAdapter { | 25 class KernelAstAdapter { |
| 26 final Kernel kernel; |
| 26 final JavaScriptBackend _backend; | 27 final JavaScriptBackend _backend; |
| 27 final ResolvedAst _resolvedAst; | 28 final ResolvedAst _resolvedAst; |
| 28 final Map<ir.Node, ast.Node> _nodeToAst; | 29 final Map<ir.Node, ast.Node> _nodeToAst; |
| 29 final Map<ir.Node, Element> _nodeToElement; | 30 final Map<ir.Node, Element> _nodeToElement; |
| 30 DartTypeConverter _typeConverter; | 31 DartTypeConverter _typeConverter; |
| 31 | 32 |
| 32 KernelAstAdapter( | 33 KernelAstAdapter(this.kernel, this._backend, this._resolvedAst, |
| 33 this._backend, | 34 this._nodeToAst, this._nodeToElement) { |
| 34 this._resolvedAst, | |
| 35 this._nodeToAst, | |
| 36 this._nodeToElement, | |
| 37 Map<FieldElement, ir.Field> fields, | |
| 38 Map<FunctionElement, ir.Member> functions, | |
| 39 Map<ClassElement, ir.Class> classes, | |
| 40 Map<LibraryElement, ir.Library> libraries) { | |
| 41 // TODO(het): Maybe just use all of the kernel maps directly? | 35 // TODO(het): Maybe just use all of the kernel maps directly? |
| 42 for (FieldElement fieldElement in fields.keys) { | 36 for (FieldElement fieldElement in kernel.fields.keys) { |
| 43 _nodeToElement[fields[fieldElement]] = fieldElement; | 37 _nodeToElement[kernel.fields[fieldElement]] = fieldElement; |
| 44 } | 38 } |
| 45 for (FunctionElement functionElement in functions.keys) { | 39 for (FunctionElement functionElement in kernel.functions.keys) { |
| 46 _nodeToElement[functions[functionElement]] = functionElement; | 40 _nodeToElement[kernel.functions[functionElement]] = functionElement; |
| 47 } | 41 } |
| 48 for (ClassElement classElement in classes.keys) { | 42 for (ClassElement classElement in kernel.classes.keys) { |
| 49 _nodeToElement[classes[classElement]] = classElement; | 43 _nodeToElement[kernel.classes[classElement]] = classElement; |
| 50 } | 44 } |
| 51 for (LibraryElement libraryElement in libraries.keys) { | 45 for (LibraryElement libraryElement in kernel.libraries.keys) { |
| 52 _nodeToElement[libraries[libraryElement]] = libraryElement; | 46 _nodeToElement[kernel.libraries[libraryElement]] = libraryElement; |
| 53 } | 47 } |
| 54 _typeConverter = new DartTypeConverter(this); | 48 _typeConverter = new DartTypeConverter(this); |
| 55 } | 49 } |
| 56 | 50 |
| 57 Compiler get _compiler => _backend.compiler; | 51 Compiler get _compiler => _backend.compiler; |
| 58 TreeElements get _elements => _resolvedAst.elements; | 52 TreeElements get _elements => _resolvedAst.elements; |
| 59 | 53 |
| 60 ConstantValue getConstantForSymbol(ir.SymbolLiteral node) { | 54 ConstantValue getConstantForSymbol(ir.SymbolLiteral node) { |
| 61 ast.Node astNode = getNode(node); | 55 ast.Node astNode = getNode(node); |
| 62 ConstantValue constantValue = _backend.constants | 56 ConstantValue constantValue = _backend.constants |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 bool isIntercepted(ir.Node node) { | 150 bool isIntercepted(ir.Node node) { |
| 157 Selector selector; | 151 Selector selector; |
| 158 if (node is ir.PropertyGet) { | 152 if (node is ir.PropertyGet) { |
| 159 selector = getGetterSelector(node); | 153 selector = getGetterSelector(node); |
| 160 } else { | 154 } else { |
| 161 selector = getSelector(node); | 155 selector = getSelector(node); |
| 162 } | 156 } |
| 163 return _backend.isInterceptedSelector(selector); | 157 return _backend.isInterceptedSelector(selector); |
| 164 } | 158 } |
| 165 | 159 |
| 160 ir.Procedure get mapLiteralConstructor => |
| 161 kernel.functions[_backend.helpers.mapLiteralConstructor]; |
| 162 |
| 163 ir.Procedure get mapLiteralConstructorEmpty => |
| 164 kernel.functions[_backend.helpers.mapLiteralConstructorEmpty]; |
| 165 |
| 166 DartType getDartType(ir.DartType type) { | 166 DartType getDartType(ir.DartType type) { |
| 167 return type.accept(_typeConverter); | 167 return type.accept(_typeConverter); |
| 168 } | 168 } |
| 169 } | 169 } |
| 170 | 170 |
| 171 class DartTypeConverter extends ir.DartTypeVisitor<DartType> { | 171 class DartTypeConverter extends ir.DartTypeVisitor<DartType> { |
| 172 final KernelAstAdapter astAdapter; | 172 final KernelAstAdapter astAdapter; |
| 173 | 173 |
| 174 DartTypeConverter(this.astAdapter); | 174 DartTypeConverter(this.astAdapter); |
| 175 | 175 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 202 @override | 202 @override |
| 203 DartType visitDynamicType(ir.DynamicType node) { | 203 DartType visitDynamicType(ir.DynamicType node) { |
| 204 return const DynamicType(); | 204 return const DynamicType(); |
| 205 } | 205 } |
| 206 | 206 |
| 207 @override | 207 @override |
| 208 DartType visitInvalidType(ir.InvalidType node) { | 208 DartType visitInvalidType(ir.InvalidType node) { |
| 209 throw new UnimplementedError("Invalid types not currently supported"); | 209 throw new UnimplementedError("Invalid types not currently supported"); |
| 210 } | 210 } |
| 211 } | 211 } |
| OLD | NEW |