OLD | NEW |
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 part of dart2js.js_emitter.program_builder; | 5 part of dart2js.js_emitter.program_builder; |
6 | 6 |
7 /** | 7 /** |
8 * Generates the code for all used classes in the program. Static fields (even | 8 * Generates the code for all used classes in the program. Static fields (even |
9 * in classes) are ignored, since they can be treated as non-class elements. | 9 * in classes) are ignored, since they can be treated as non-class elements. |
10 * | 10 * |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 .toList()); | 203 .toList()); |
204 | 204 |
205 // Compute needed classes. | 205 // Compute needed classes. |
206 Set<ClassEntity> instantiatedClasses = | 206 Set<ClassEntity> instantiatedClasses = |
207 // TODO(johnniwinther): This should be accessed from a codegen closed | 207 // TODO(johnniwinther): This should be accessed from a codegen closed |
208 // world. | 208 // world. |
209 _worldBuilder.directlyInstantiatedClasses | 209 _worldBuilder.directlyInstantiatedClasses |
210 .where(computeClassFilter()) | 210 .where(computeClassFilter()) |
211 .toSet(); | 211 .toSet(); |
212 | 212 |
213 void addClassWithSuperclasses(ClassElement cls) { | 213 void addClassWithSuperclasses(ClassEntity cls) { |
214 neededClasses.add(cls); | 214 neededClasses.add(cls); |
215 for (ClassElement superclass = cls.superclass; | 215 for (ClassEntity superclass = _elementEnvironment.getSuperClass(cls); |
216 superclass != null; | 216 superclass != null; |
217 superclass = superclass.superclass) { | 217 superclass = _elementEnvironment.getSuperClass(superclass)) { |
218 neededClasses.add(superclass); | 218 neededClasses.add(superclass); |
219 } | 219 } |
220 } | 220 } |
221 | 221 |
222 void addClassesWithSuperclasses(Iterable<ClassEntity> classes) { | 222 void addClassesWithSuperclasses(Iterable<ClassEntity> classes) { |
223 for (ClassElement cls in classes) { | 223 for (ClassEntity cls in classes) { |
224 addClassWithSuperclasses(cls); | 224 addClassWithSuperclasses(cls); |
225 } | 225 } |
226 } | 226 } |
227 | 227 |
228 // 1. We need to generate all classes that are instantiated. | 228 // 1. We need to generate all classes that are instantiated. |
229 addClassesWithSuperclasses(instantiatedClasses); | 229 addClassesWithSuperclasses(instantiatedClasses); |
230 | 230 |
231 // 2. Add all classes used as mixins. | 231 // 2. Add all classes used as mixins. |
232 Set<ClassElement> mixinClasses = neededClasses | 232 Set<ClassEntity> mixinClasses = new Set<ClassEntity>(); |
233 .where((ClassElement element) => element.isMixinApplication) | 233 for (ClassEntity cls in neededClasses) { |
234 .map(computeMixinClass) | 234 _elementEnvironment.forEachMixin(cls, (ClassEntity mixinClass) { |
235 .toSet(); | 235 mixinClasses.add(mixinClass); |
| 236 }); |
| 237 } |
236 neededClasses.addAll(mixinClasses); | 238 neededClasses.addAll(mixinClasses); |
237 | 239 |
238 // 3. Find all classes needed for rti. | 240 // 3. Find all classes needed for rti. |
239 // It is important that this is the penultimate step, at this point, | 241 // It is important that this is the penultimate step, at this point, |
240 // neededClasses must only contain classes that have been resolved and | 242 // neededClasses must only contain classes that have been resolved and |
241 // codegen'd. The rtiNeededClasses may contain additional classes, but | 243 // codegen'd. The rtiNeededClasses may contain additional classes, but |
242 // these are thought to not have been instantiated, so we neeed to be able | 244 // these are thought to not have been instantiated, so we neeed to be able |
243 // to identify them later and make sure we only emit "empty shells" without | 245 // to identify them later and make sure we only emit "empty shells" without |
244 // fields, etc. | 246 // fields, etc. |
245 classesOnlyNeededForRti = new Set<ClassElement>(); | 247 classesOnlyNeededForRti = new Set<ClassElement>(); |
(...skipping 29 matching lines...) Expand all Loading... |
275 // 4. Finally, sort the classes. | 277 // 4. Finally, sort the classes. |
276 List<ClassEntity> sortedClasses = _sorter.sortClasses(neededClasses); | 278 List<ClassEntity> sortedClasses = _sorter.sortClasses(neededClasses); |
277 | 279 |
278 for (ClassEntity cls in sortedClasses) { | 280 for (ClassEntity cls in sortedClasses) { |
279 if (_nativeData.isNativeOrExtendsNative(cls) && | 281 if (_nativeData.isNativeOrExtendsNative(cls) && |
280 !classesOnlyNeededForRti.contains(cls)) { | 282 !classesOnlyNeededForRti.contains(cls)) { |
281 // For now, native classes and related classes cannot be deferred. | 283 // For now, native classes and related classes cannot be deferred. |
282 nativeClassesAndSubclasses.add(cls); | 284 nativeClassesAndSubclasses.add(cls); |
283 assert(!_deferredLoadTask.isDeferredClass(cls), failedAt(cls)); | 285 assert(!_deferredLoadTask.isDeferredClass(cls), failedAt(cls)); |
284 outputClassLists | 286 outputClassLists |
285 .putIfAbsent(_deferredLoadTask.mainOutputUnit, | 287 .putIfAbsent( |
286 () => new List<ClassElement>()) | 288 _deferredLoadTask.mainOutputUnit, () => new List<ClassEntity>()) |
287 .add(cls); | 289 .add(cls); |
288 } else { | 290 } else { |
289 outputClassLists | 291 outputClassLists |
290 .putIfAbsent(_deferredLoadTask.outputUnitForClass(cls), | 292 .putIfAbsent(_deferredLoadTask.outputUnitForClass(cls), |
291 () => new List<ClassElement>()) | 293 () => new List<ClassEntity>()) |
292 .add(cls); | 294 .add(cls); |
293 } | 295 } |
294 } | 296 } |
295 } | 297 } |
296 | 298 |
297 void computeNeededStatics() { | 299 void computeNeededStatics() { |
298 bool isStaticFunction(MemberEntity element) => | 300 bool isStaticFunction(MemberEntity element) => |
299 !element.isInstanceMember && !element.isField; | 301 !element.isInstanceMember && !element.isField; |
300 | 302 |
301 Iterable<MemberEntity> elements = | 303 Iterable<MemberEntity> elements = |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 } | 357 } |
356 | 358 |
357 void collect() { | 359 void collect() { |
358 computeNeededDeclarations(); | 360 computeNeededDeclarations(); |
359 computeNeededConstants(); | 361 computeNeededConstants(); |
360 computeNeededStatics(); | 362 computeNeededStatics(); |
361 computeNeededStaticNonFinalFields(); | 363 computeNeededStaticNonFinalFields(); |
362 computeNeededLibraries(); | 364 computeNeededLibraries(); |
363 } | 365 } |
364 } | 366 } |
OLD | NEW |