OLD | NEW |
| (Empty) |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | |
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. | |
4 | |
5 library analyzer2dart.convertedWorld; | |
6 | |
7 import 'dart:collection'; | |
8 | |
9 import 'package:analyzer/analyzer.dart'; | |
10 import 'package:compiler/src/dart_types.dart' as dart2js; | |
11 import 'package:compiler/src/elements/elements.dart' as dart2js; | |
12 import 'package:analyzer/src/generated/element.dart' as analyzer; | |
13 import 'package:compiler/src/cps_ir/cps_ir_nodes.dart' as ir; | |
14 | |
15 import 'closed_world.dart'; | |
16 import 'element_converter.dart'; | |
17 import 'cps_generator.dart'; | |
18 import 'util.dart'; | |
19 | |
20 /// A [ClosedWorld] converted to the dart2js element model. | |
21 abstract class ConvertedWorld { | |
22 Iterable<dart2js.LibraryElement> get libraries; | |
23 Iterable<dart2js.AstElement> get resolvedElements; | |
24 Iterable<dart2js.ClassElement> get instantiatedClasses; | |
25 dart2js.FunctionElement get mainFunction; | |
26 ir.Node getIr(dart2js.Element element); | |
27 dart2js.DartTypes get dartTypes; | |
28 } | |
29 | |
30 class _ConvertedWorldImpl implements ConvertedWorld { | |
31 final dart2js.FunctionElement mainFunction; | |
32 Map<dart2js.AstElement, ir.Node> executableElements = | |
33 new HashMap<dart2js.AstElement, ir.Node>(); | |
34 final List<dart2js.ClassElement> instantiatedClasses = | |
35 <dart2js.ClassElement>[]; | |
36 | |
37 _ConvertedWorldImpl(this.mainFunction); | |
38 | |
39 // TODO(johnniwinther): Add all used libraries and all SDK libraries to the | |
40 // set of libraries in the converted world. | |
41 Iterable<dart2js.LibraryElement> get libraries => [mainFunction.library]; | |
42 | |
43 Iterable<dart2js.AstElement> get resolvedElements => executableElements.keys; | |
44 | |
45 ir.Node getIr(dart2js.Element element) => executableElements[element]; | |
46 | |
47 final dart2js.DartTypes dartTypes = new _DartTypes(); | |
48 } | |
49 | |
50 ConvertedWorld convertWorld(ClosedWorld closedWorld) { | |
51 ElementConverter converter = new ElementConverter(); | |
52 _ConvertedWorldImpl convertedWorld = new _ConvertedWorldImpl( | |
53 converter.convertElement(closedWorld.mainFunction)); | |
54 | |
55 void convert(analyzer.Element analyzerElement, AstNode node) { | |
56 // Skip conversion of SDK sources since we don't generate code for it | |
57 // anyway. | |
58 if (analyzerElement.source.isInSystemLibrary) return; | |
59 | |
60 dart2js.AstElement dart2jsElement = | |
61 converter.convertElement(analyzerElement); | |
62 CpsElementVisitor visitor = new CpsElementVisitor(converter, node); | |
63 ir.Node cpsNode = analyzerElement.accept(visitor); | |
64 convertedWorld.executableElements[dart2jsElement] = cpsNode; | |
65 if (cpsNode == null && !analyzerElement.isSynthetic) { | |
66 String message = | |
67 'No CPS node generated for $analyzerElement (${node.runtimeType}).'; | |
68 reportSourceMessage(analyzerElement.source, node, message); | |
69 throw new UnimplementedError(message); | |
70 } | |
71 } | |
72 | |
73 void convertClass(analyzer.ClassElement analyzerElement, _) { | |
74 // Skip conversion of SDK sources since we don't generate code for it | |
75 // anyway. | |
76 if (analyzerElement.source.isInSystemLibrary) return; | |
77 convertedWorld.instantiatedClasses.add( | |
78 converter.convertElement(analyzerElement)); | |
79 } | |
80 | |
81 closedWorld.executableElements.forEach(convert); | |
82 closedWorld.variables.forEach(convert); | |
83 closedWorld.fields.forEach(convert); | |
84 closedWorld.instantiatedClasses.forEach(convertClass); | |
85 | |
86 return convertedWorld; | |
87 } | |
88 | |
89 // TODO(johnniwinther): Implement [coreTypes] using [TypeProvider]. | |
90 class _DartTypes implements dart2js.DartTypes { | |
91 @override | |
92 get coreTypes => throw new UnsupportedError("coreTypes"); | |
93 | |
94 @override | |
95 bool isSubtype(dart2js.DartType t, dart2js.DartType s) { | |
96 throw new UnsupportedError("isSubtype"); | |
97 } | |
98 } | |
OLD | NEW |