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 |