Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(351)

Side by Side Diff: pkg/compiler/lib/src/universe/world_impact.dart

Issue 1422623014: Add TypeUse. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « pkg/compiler/lib/src/universe/use.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, 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 library dart2js.universe.world_impact; 5 library dart2js.universe.world_impact;
6 6
7 import '../dart_types.dart' show 7 import '../dart_types.dart' show
8 DartType, 8 DartType,
9 InterfaceType; 9 InterfaceType;
10 import '../elements/elements.dart' show 10 import '../elements/elements.dart' show
11 Element, 11 Element,
12 LocalFunctionElement, 12 LocalFunctionElement,
13 MethodElement; 13 MethodElement;
14 import '../util/util.dart' show 14 import '../util/util.dart' show
15 Setlet; 15 Setlet;
16 16
17 import 'use.dart' show 17 import 'use.dart' show
18 DynamicUse, 18 DynamicUse,
19 StaticUse; 19 StaticUse,
20 TypeUse;
20 21
21 class WorldImpact { 22 class WorldImpact {
22 const WorldImpact(); 23 const WorldImpact();
23 24
24 Iterable<DynamicUse> get dynamicUses => 25 Iterable<DynamicUse> get dynamicUses =>
25 const <DynamicUse>[]; 26 const <DynamicUse>[];
26 27
27 Iterable<StaticUse> get staticUses => const <StaticUse>[]; 28 Iterable<StaticUse> get staticUses => const <StaticUse>[];
28 29
29 // TODO(johnniwinther): Replace this by called constructors with type 30 // TODO(johnniwinther): Replace this by called constructors with type
30 // arguments. 31 // arguments.
31 Iterable<InterfaceType> get instantiatedTypes => const <InterfaceType>[]; 32 // TODO(johnniwinther): Collect all checked types for checked mode separately
33 // to support serialization.
32 34
33 // TODO(johnniwinther): Collect checked types for checked mode separately to 35 Iterable<TypeUse> get typeUses => const <TypeUse>[];
34 // support serialization.
35 Iterable<DartType> get isChecks => const <DartType>[];
36
37 Iterable<DartType> get checkedModeChecks => const <DartType>[];
38
39 Iterable<DartType> get asCasts => const <DartType>[];
40
41 Iterable<DartType> get onCatchTypes => const <DartType>[];
42 36
43 Iterable<LocalFunctionElement> get closures => const <LocalFunctionElement>[]; 37 Iterable<LocalFunctionElement> get closures => const <LocalFunctionElement>[];
44 38
45 Iterable<DartType> get typeLiterals => const <DartType>[];
46
47 String toString() => dump(this); 39 String toString() => dump(this);
48 40
49 static String dump(WorldImpact worldImpact) { 41 static String dump(WorldImpact worldImpact) {
50 StringBuffer sb = new StringBuffer(); 42 StringBuffer sb = new StringBuffer();
51 printOn(sb, worldImpact); 43 printOn(sb, worldImpact);
52 return sb.toString(); 44 return sb.toString();
53 } 45 }
54 46
55 static void printOn(StringBuffer sb, WorldImpact worldImpact) { 47 static void printOn(StringBuffer sb, WorldImpact worldImpact) {
56 void add(String title, Iterable iterable) { 48 void add(String title, Iterable iterable) {
57 if (iterable.isNotEmpty) { 49 if (iterable.isNotEmpty) {
58 sb.write('\n $title:'); 50 sb.write('\n $title:');
59 iterable.forEach((e) => sb.write('\n $e')); 51 iterable.forEach((e) => sb.write('\n $e'));
60 } 52 }
61 } 53 }
62 54
63 add('dynamic uses', worldImpact.dynamicUses); 55 add('dynamic uses', worldImpact.dynamicUses);
64 add('static uses', worldImpact.staticUses); 56 add('static uses', worldImpact.staticUses);
65 add('instantiated types', worldImpact.instantiatedTypes); 57 add('type uses', worldImpact.typeUses);
66 add('is-checks', worldImpact.isChecks);
67 add('checked-mode checks', worldImpact.checkedModeChecks);
68 add('as-casts', worldImpact.asCasts);
69 add('on-catch-types', worldImpact.onCatchTypes);
70 add('closures', worldImpact.closures); 58 add('closures', worldImpact.closures);
71 add('type literals', worldImpact.typeLiterals);
72 } 59 }
73 } 60 }
74 61
75 class WorldImpactBuilder { 62 class WorldImpactBuilder {
76 // TODO(johnniwinther): Do we benefit from lazy initialization of the 63 // TODO(johnniwinther): Do we benefit from lazy initialization of the
77 // [Setlet]s? 64 // [Setlet]s?
78 Setlet<DynamicUse> _dynamicUses; 65 Setlet<DynamicUse> _dynamicUses;
79 Setlet<InterfaceType> _instantiatedTypes;
80 Setlet<StaticUse> _staticUses; 66 Setlet<StaticUse> _staticUses;
81 Setlet<DartType> _isChecks; 67 Setlet<TypeUse> _typeUses;
82 Setlet<DartType> _asCasts;
83 Setlet<DartType> _checkedModeChecks;
84 Setlet<DartType> _onCatchTypes;
85 Setlet<LocalFunctionElement> _closures; 68 Setlet<LocalFunctionElement> _closures;
86 Setlet<DartType> _typeLiterals;
87 69
88 void registerDynamicUse(DynamicUse dynamicUse) { 70 void registerDynamicUse(DynamicUse dynamicUse) {
89 assert(dynamicUse != null); 71 assert(dynamicUse != null);
90 if (_dynamicUses == null) { 72 if (_dynamicUses == null) {
91 _dynamicUses = new Setlet<DynamicUse>(); 73 _dynamicUses = new Setlet<DynamicUse>();
92 } 74 }
93 _dynamicUses.add(dynamicUse); 75 _dynamicUses.add(dynamicUse);
94 } 76 }
95 77
96 Iterable<DynamicUse> get dynamicUses { 78 Iterable<DynamicUse> get dynamicUses {
97 return _dynamicUses != null 79 return _dynamicUses != null
98 ? _dynamicUses : const <DynamicUse>[]; 80 ? _dynamicUses : const <DynamicUse>[];
99 } 81 }
100 82
101 void registerInstantiatedType(InterfaceType type) { 83 void registerTypeUse(TypeUse typeUse) {
102 assert(type != null); 84 assert(typeUse != null);
103 if (_instantiatedTypes == null) { 85 if (_typeUses == null) {
104 _instantiatedTypes = new Setlet<InterfaceType>(); 86 _typeUses = new Setlet<TypeUse>();
105 } 87 }
106 _instantiatedTypes.add(type); 88 _typeUses.add(typeUse);
107 } 89 }
108 90
109 Iterable<InterfaceType> get instantiatedTypes { 91 Iterable<TypeUse> get typeUses {
110 return _instantiatedTypes != null 92 return _typeUses != null
111 ? _instantiatedTypes : const <InterfaceType>[]; 93 ? _typeUses : const <TypeUse>[];
112 }
113
114 void registerTypeLiteral(DartType type) {
115 assert(type != null);
116 if (_typeLiterals == null) {
117 _typeLiterals = new Setlet<DartType>();
118 }
119 _typeLiterals.add(type);
120 }
121
122 Iterable<DartType> get typeLiterals {
123 return _typeLiterals != null
124 ? _typeLiterals : const <DartType>[];
125 } 94 }
126 95
127 void registerStaticUse(StaticUse staticUse) { 96 void registerStaticUse(StaticUse staticUse) {
128 assert(staticUse != null); 97 assert(staticUse != null);
129 if (_staticUses == null) { 98 if (_staticUses == null) {
130 _staticUses = new Setlet<StaticUse>(); 99 _staticUses = new Setlet<StaticUse>();
131 } 100 }
132 _staticUses.add(staticUse); 101 _staticUses.add(staticUse);
133 } 102 }
134 103
135 Iterable<StaticUse> get staticUses { 104 Iterable<StaticUse> get staticUses {
136 return _staticUses != null ? _staticUses : const <StaticUse>[]; 105 return _staticUses != null ? _staticUses : const <StaticUse>[];
137 } 106 }
138 107
139 void registerIsCheck(DartType type) {
140 assert(type != null);
141 if (_isChecks == null) {
142 _isChecks = new Setlet<DartType>();
143 }
144 _isChecks.add(type);
145 }
146
147 Iterable<DartType> get isChecks {
148 return _isChecks != null
149 ? _isChecks : const <DartType>[];
150 }
151
152 void registerAsCast(DartType type) {
153 if (_asCasts == null) {
154 _asCasts = new Setlet<DartType>();
155 }
156 _asCasts.add(type);
157 }
158
159 Iterable<DartType> get asCasts {
160 return _asCasts != null
161 ? _asCasts : const <DartType>[];
162 }
163
164 void registerCheckedModeCheckedType(DartType type) {
165 if (_checkedModeChecks == null) {
166 _checkedModeChecks = new Setlet<DartType>();
167 }
168 _checkedModeChecks.add(type);
169 }
170
171 Iterable<DartType> get checkedModeChecks {
172 return _checkedModeChecks != null
173 ? _checkedModeChecks : const <DartType>[];
174 }
175
176 void registerOnCatchType(DartType type) {
177 assert(type != null);
178 if (_onCatchTypes == null) {
179 _onCatchTypes = new Setlet<DartType>();
180 }
181 _onCatchTypes.add(type);
182 }
183
184 Iterable<DartType> get onCatchTypes {
185 return _onCatchTypes != null
186 ? _onCatchTypes : const <DartType>[];
187 }
188
189 void registerClosure(LocalFunctionElement element) { 108 void registerClosure(LocalFunctionElement element) {
190 if (_closures == null) { 109 if (_closures == null) {
191 _closures = new Setlet<LocalFunctionElement>(); 110 _closures = new Setlet<LocalFunctionElement>();
192 } 111 }
193 _closures.add(element); 112 _closures.add(element);
194 } 113 }
195 114
196 Iterable<LocalFunctionElement> get closures { 115 Iterable<LocalFunctionElement> get closures {
197 return _closures != null 116 return _closures != null
198 ? _closures : const <LocalFunctionElement>[]; 117 ? _closures : const <LocalFunctionElement>[];
199 } 118 }
200 } 119 }
201 120
202 /// Mutable implementation of [WorldImpact] used to transform 121 /// Mutable implementation of [WorldImpact] used to transform
203 /// [ResolutionImpact] or [CodegenImpact] to [WorldImpact]. 122 /// [ResolutionImpact] or [CodegenImpact] to [WorldImpact].
204 class TransformedWorldImpact implements WorldImpact { 123 class TransformedWorldImpact implements WorldImpact {
205 final WorldImpact worldImpact; 124 final WorldImpact worldImpact;
206 125
207 Setlet<StaticUse> _staticUses; 126 Setlet<StaticUse> _staticUses;
208 Setlet<InterfaceType> _instantiatedTypes; 127 Setlet<TypeUse> _typeUses;
209 Setlet<DynamicUse> _dynamicUses; 128 Setlet<DynamicUse> _dynamicUses;
210 129
211 TransformedWorldImpact(this.worldImpact); 130 TransformedWorldImpact(this.worldImpact);
212 131
213 @override 132 @override
214 Iterable<DartType> get asCasts => worldImpact.asCasts;
215
216 @override
217 Iterable<DartType> get checkedModeChecks => worldImpact.checkedModeChecks;
218
219 @override
220 Iterable<DynamicUse> get dynamicUses { 133 Iterable<DynamicUse> get dynamicUses {
221 return _dynamicUses != null 134 return _dynamicUses != null
222 ? _dynamicUses : worldImpact.dynamicUses; 135 ? _dynamicUses : worldImpact.dynamicUses;
223 } 136 }
224 137
225 @override
226 Iterable<DartType> get isChecks => worldImpact.isChecks;
227
228 @override
229 Iterable<DartType> get onCatchTypes => worldImpact.onCatchTypes;
230
231 _unsupported(String message) => throw new UnsupportedError(message);
232
233 void registerDynamicUse(DynamicUse dynamicUse) { 138 void registerDynamicUse(DynamicUse dynamicUse) {
234 if (_dynamicUses == null) { 139 if (_dynamicUses == null) {
235 _dynamicUses = new Setlet<DynamicUse>(); 140 _dynamicUses = new Setlet<DynamicUse>();
236 _dynamicUses.addAll(worldImpact.dynamicUses); 141 _dynamicUses.addAll(worldImpact.dynamicUses);
237 } 142 }
238 _dynamicUses.add(dynamicUse); 143 _dynamicUses.add(dynamicUse);
239 } 144 }
240 145
241 void registerInstantiatedType(InterfaceType type) { 146 void registerTypeUse(TypeUse typeUse) {
242 if (_instantiatedTypes == null) { 147 if (_typeUses == null) {
243 _instantiatedTypes = new Setlet<InterfaceType>(); 148 _typeUses = new Setlet<TypeUse>();
244 _instantiatedTypes.addAll(worldImpact.instantiatedTypes); 149 _typeUses.addAll(worldImpact.typeUses);
245 } 150 }
246 _instantiatedTypes.add(type); 151 _typeUses.add(typeUse);
247 } 152 }
248 153
249 @override 154 @override
250 Iterable<InterfaceType> get instantiatedTypes { 155 Iterable<TypeUse> get typeUses {
251 return _instantiatedTypes != null 156 return _typeUses != null
252 ? _instantiatedTypes : worldImpact.instantiatedTypes; 157 ? _typeUses : worldImpact.typeUses;
253 }
254
255 @override
256 Iterable<DartType> get typeLiterals {
257 return worldImpact.typeLiterals;
258 } 158 }
259 159
260 void registerStaticUse(StaticUse staticUse) { 160 void registerStaticUse(StaticUse staticUse) {
261 if (_staticUses == null) { 161 if (_staticUses == null) {
262 _staticUses = new Setlet<StaticUse>(); 162 _staticUses = new Setlet<StaticUse>();
263 _staticUses.addAll(worldImpact.staticUses); 163 _staticUses.addAll(worldImpact.staticUses);
264 } 164 }
265 _staticUses.add(staticUse); 165 _staticUses.add(staticUse);
266 } 166 }
267 167
268 @override 168 @override
269 Iterable<StaticUse> get staticUses { 169 Iterable<StaticUse> get staticUses {
270 return _staticUses != null ? _staticUses : worldImpact.staticUses; 170 return _staticUses != null ? _staticUses : worldImpact.staticUses;
271 } 171 }
272 172
273 @override 173 @override
274 Iterable<LocalFunctionElement> get closures => worldImpact.closures; 174 Iterable<LocalFunctionElement> get closures => worldImpact.closures;
275 175
276 String toString() { 176 String toString() {
277 StringBuffer sb = new StringBuffer(); 177 StringBuffer sb = new StringBuffer();
278 sb.write('TransformedWorldImpact($worldImpact)'); 178 sb.write('TransformedWorldImpact($worldImpact)');
279 WorldImpact.printOn(sb, this); 179 WorldImpact.printOn(sb, this);
280 return sb.toString(); 180 return sb.toString();
281 } 181 }
282 } 182 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/universe/use.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698