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

Side by Side Diff: pkg/kernel/lib/src/incremental_class_hierarchy.dart

Issue 2924713002: Replace ClassHierarchy.classes with getOrderedClasses(). (Closed)
Patch Set: Created 3 years, 6 months 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
OLDNEW
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, 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 library kernel.incremental_class_hierarchy; 4 library kernel.incremental_class_hierarchy;
5 5
6 import 'dart:collection'; 6 import 'dart:collection';
7 import 'dart:math'; 7 import 'dart:math';
8 8
9 import 'package:kernel/ast.dart'; 9 import 'package:kernel/ast.dart';
10 import 'package:kernel/class_hierarchy.dart'; 10 import 'package:kernel/class_hierarchy.dart';
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 } 67 }
68 return null; 68 return null;
69 } 69 }
70 70
71 /// Lazy and incremental implementation of [ClassHierarchy]. 71 /// Lazy and incremental implementation of [ClassHierarchy].
72 class IncrementalClassHierarchy implements ClassHierarchy { 72 class IncrementalClassHierarchy implements ClassHierarchy {
73 /// The next unique identifier for [_ClassInfo]s. 73 /// The next unique identifier for [_ClassInfo]s.
74 int _nextId = 0; 74 int _nextId = 0;
75 75
76 /// The mapping from [Class]es to the corresponding [_ClassInfo]s. 76 /// The mapping from [Class]es to the corresponding [_ClassInfo]s.
77 /// The map is ordered in such a way that classes are after superclasses.
77 /// It is filled lazily as the client requests information about classes. 78 /// It is filled lazily as the client requests information about classes.
78 final Map<Class, _ClassInfo> _info = {}; 79 final Map<Class, _ClassInfo> _info = new LinkedHashMap<Class, _ClassInfo>();
79
80 @override
81 Iterable<Class> get classes {
82 // TODO(scheglov): implement classes
83 throw new UnimplementedError();
84 }
85 80
86 @override 81 @override
87 void forEachOverridePair(Class node, 82 void forEachOverridePair(Class node,
88 callback(Member declaredMember, Member interfaceMember, bool isSetter)) { 83 callback(Member declaredMember, Member interfaceMember, bool isSetter)) {
89 _ClassInfo info = _getInfo(node); 84 _ClassInfo info = _getInfo(node);
90 for (var supertype in node.supers) { 85 for (var supertype in node.supers) {
91 var superNode = supertype.classNode; 86 var superNode = supertype.classNode;
92 var superInfo = _getInfo(superNode); 87 var superInfo = _getInfo(superNode);
93 88
94 var superGetters = superInfo.interfaceGettersAndCalls; 89 var superGetters = superInfo.interfaceGettersAndCalls;
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 239
245 @override 240 @override
246 Member getInterfaceMember(Class node, Name name, {bool setter: false}) { 241 Member getInterfaceMember(Class node, Name name, {bool setter: false}) {
247 _ClassInfo info = _getInfo(node); 242 _ClassInfo info = _getInfo(node);
248 List<Member> members = 243 List<Member> members =
249 setter ? info.interfaceSetters : info.interfaceGettersAndCalls; 244 setter ? info.interfaceSetters : info.interfaceGettersAndCalls;
250 return _findMemberByName(members, name); 245 return _findMemberByName(members, name);
251 } 246 }
252 247
253 @override 248 @override
249 Iterable<Class> getOrderedClasses(Iterable<Class> unordered) {
250 unordered.forEach(_getInfo);
251 return _info.keys;
252 }
253
254 @override
254 List<Class> getRankedSuperclasses(Class node) { 255 List<Class> getRankedSuperclasses(Class node) {
255 var info = _getInfo(node); 256 var info = _getInfo(node);
256 return _getRankedSuperclassList(info).map((info) => info.node).toList(); 257 return _getRankedSuperclassList(info).map((info) => info.node).toList();
257 } 258 }
258 259
259 @override 260 @override
260 InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass) { 261 InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass) {
261 Supertype castedType = getClassAsInstanceOf(type.classNode, superclass); 262 Supertype castedType = getClassAsInstanceOf(type.classNode, superclass);
262 if (castedType == null) return null; 263 if (castedType == null) return null;
263 return Substitution 264 return Substitution
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 _inheritMembers(declaredGetters, allInheritedGetters); 354 _inheritMembers(declaredGetters, allInheritedGetters);
354 info.interfaceSetters = 355 info.interfaceSetters =
355 _inheritMembers(declaredSetters, allInheritedSetters); 356 _inheritMembers(declaredSetters, allInheritedSetters);
356 } 357 }
357 358
358 /// Return the [_ClassInfo] for the [node]. 359 /// Return the [_ClassInfo] for the [node].
359 _ClassInfo _getInfo(Class node) { 360 _ClassInfo _getInfo(Class node) {
360 var info = _info[node]; 361 var info = _info[node];
361 if (info == null) { 362 if (info == null) {
362 info = new _ClassInfo(_nextId++, node); 363 info = new _ClassInfo(_nextId++, node);
363 _info[node] = info;
364 364
365 void addSupertypeIdentifiers(_ClassInfo superInfo) { 365 void addSupertypeIdentifiers(_ClassInfo superInfo) {
366 info.supertypeIdSet.add(superInfo.id); 366 info.supertypeIdSet.add(superInfo.id);
367 info.supertypeIdSet.addAll(superInfo.supertypeIdSet); 367 info.supertypeIdSet.addAll(superInfo.supertypeIdSet);
368 } 368 }
369 369
370 int superDepth = -1; 370 int superDepth = -1;
371 if (node.supertype != null) { 371 if (node.supertype != null) {
372 var superInfo = _getInfo(node.supertype.classNode); 372 var superInfo = _getInfo(node.supertype.classNode);
373 superDepth = max(superDepth, superInfo.depth); 373 superDepth = max(superDepth, superInfo.depth);
374 addSupertypeIdentifiers(superInfo); 374 addSupertypeIdentifiers(superInfo);
375 _recordSuperTypes(info, node.supertype, superInfo); 375 _recordSuperTypes(info, node.supertype, superInfo);
376 } 376 }
377 if (node.mixedInType != null) { 377 if (node.mixedInType != null) {
378 var mixedInfo = _getInfo(node.mixedInType.classNode); 378 var mixedInfo = _getInfo(node.mixedInType.classNode);
379 superDepth = max(superDepth, mixedInfo.depth); 379 superDepth = max(superDepth, mixedInfo.depth);
380 addSupertypeIdentifiers(mixedInfo); 380 addSupertypeIdentifiers(mixedInfo);
381 _recordSuperTypes(info, node.mixedInType, mixedInfo); 381 _recordSuperTypes(info, node.mixedInType, mixedInfo);
382 } 382 }
383 for (var implementedType in node.implementedTypes) { 383 for (var implementedType in node.implementedTypes) {
384 var implementedInfo = _getInfo(implementedType.classNode); 384 var implementedInfo = _getInfo(implementedType.classNode);
385 superDepth = max(superDepth, implementedInfo.depth); 385 superDepth = max(superDepth, implementedInfo.depth);
386 addSupertypeIdentifiers(implementedInfo); 386 addSupertypeIdentifiers(implementedInfo);
387 _recordSuperTypes(info, implementedType, implementedInfo); 387 _recordSuperTypes(info, implementedType, implementedInfo);
388 } 388 }
389
389 info.depth = superDepth + 1; 390 info.depth = superDepth + 1;
391 _info[node] = info;
390 392
391 _buildDeclaredMembers(info); 393 _buildDeclaredMembers(info);
392 _buildImplementedMembers(info); 394 _buildImplementedMembers(info);
393 _buildInterfaceMembers(info); 395 _buildInterfaceMembers(info);
394 } 396 }
395 return info; 397 return info;
396 } 398 }
397 399
398 List<_ClassInfo> _getRankedSuperclassList(_ClassInfo info) { 400 List<_ClassInfo> _getRankedSuperclassList(_ClassInfo info) {
399 if (info.rankedSuperclassList != null) { 401 if (info.rankedSuperclassList != null) {
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 final int id; 623 final int id;
622 624
623 /// The [Class] node described by this [_ClassInfo]. 625 /// The [Class] node described by this [_ClassInfo].
624 final Class node; 626 final Class node;
625 627
626 /// The number of steps in the longest inheritance path from the class 628 /// The number of steps in the longest inheritance path from the class
627 /// to [Object], or `-1` if the depth has not been computed yet. 629 /// to [Object], or `-1` if the depth has not been computed yet.
628 int depth = -1; 630 int depth = -1;
629 631
630 /// The list of superclasses sorted by depth (descending order) and 632 /// The list of superclasses sorted by depth (descending order) and
631 /// unique identifiers (ascending order), or `null` if the lit has not 633 /// unique identifiers (ascending order), or `null` if the it has not
Paul Berry 2017/06/05 21:59:22 I think you mean "...if the list has not been comp
scheglov 2017/06/05 22:01:33 Correct. Thank you.
632 /// been computed yet. 634 /// been computed yet.
633 List<_ClassInfo> rankedSuperclassList; 635 List<_ClassInfo> rankedSuperclassList;
634 636
635 /// The set of [id]s for supertypes. 637 /// The set of [id]s for supertypes.
636 /// TODO(scheglov): Maybe optimize. 638 /// TODO(scheglov): Maybe optimize.
637 final Set<int> supertypeIdSet = new HashSet<int>(); 639 final Set<int> supertypeIdSet = new HashSet<int>();
638 640
639 /// Maps generic supertype classes to the instantiation implemented by this 641 /// Maps generic supertype classes to the instantiation implemented by this
640 /// class, or `null` if the class does not have generic supertypes. 642 /// class, or `null` if the class does not have generic supertypes.
641 /// 643 ///
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
709 class _LubHeap extends Heap<_ClassInfo> { 711 class _LubHeap extends Heap<_ClassInfo> {
710 @override 712 @override
711 bool sortsBefore(_ClassInfo a, _ClassInfo b) => sortsBeforeStatic(a, b); 713 bool sortsBefore(_ClassInfo a, _ClassInfo b) => sortsBeforeStatic(a, b);
712 714
713 static bool sortsBeforeStatic(_ClassInfo a, _ClassInfo b) { 715 static bool sortsBeforeStatic(_ClassInfo a, _ClassInfo b) {
714 if (a.depth > b.depth) return true; 716 if (a.depth > b.depth) return true;
715 if (a.depth < b.depth) return false; 717 if (a.depth < b.depth) return false;
716 return a.id < b.id; 718 return a.id < b.id;
717 } 719 }
718 } 720 }
OLDNEW
« no previous file with comments | « pkg/kernel/lib/class_hierarchy.dart ('k') | pkg/kernel/lib/transformations/insert_covariance_checks.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698