Chromium Code Reviews| Index: pkg/kernel/lib/src/incremental_class_hierarchy.dart |
| diff --git a/pkg/kernel/lib/src/incremental_class_hierarchy.dart b/pkg/kernel/lib/src/incremental_class_hierarchy.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..cb1696e9b5eadd298634bcc39c17f2382a17de94 |
| --- /dev/null |
| +++ b/pkg/kernel/lib/src/incremental_class_hierarchy.dart |
| @@ -0,0 +1,114 @@ |
| +// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
| +// for details. All rights reserved. Use of this source code is governed by a |
| +// BSD-style license that can be found in the LICENSE file. |
| +library kernel.incremental_class_hierarchy; |
| + |
| +import 'dart:math'; |
| + |
| +import 'package:kernel/ast.dart'; |
| +import 'package:kernel/class_hierarchy.dart'; |
| + |
| +/// Lazy and incremental implementation of [ClassHierarchy]. |
| +class IncrementalClassHierarchy implements ClassHierarchy { |
| + /// The mapping from [Class]es to the corresponding [_ClassInfo]s. |
| + /// It is filled lazily as the client requests information about classes. |
|
ahe
2017/06/02 11:34:48
What are your plans for the incremental part of th
scheglov
2017/06/02 15:36:07
I think we can use single instance of IncrementalC
ahe
2017/06/02 15:43:46
Thank you for explaining.
|
| + final Map<Class, _ClassInfo> _info = {}; |
| + |
| + @override |
| + Iterable<Class> get classes { |
| + // TODO(scheglov): implement classes |
| + throw new UnimplementedError(); |
| + } |
| + |
| + @override |
| + void forEachOverridePair(Class class_, |
| + callback(Member declaredMember, Member interfaceMember, bool isSetter)) { |
| + // TODO(scheglov): implement forEachOverridePair |
| + throw new UnimplementedError(); |
| + } |
| + |
| + @override |
| + Supertype getClassAsInstanceOf(Class class_, Class superclass) { |
| + // TODO(scheglov): implement getClassAsInstanceOf |
| + throw new UnimplementedError(); |
| + } |
| + |
| + @override |
| + int getClassDepth(Class node) { |
| + var info = _getInfo(node); |
| + if (info.depth < 0) { |
| + int superDepth = -1; |
| + if (node.supertype != null) { |
| + superDepth = max(superDepth, getClassDepth(node.supertype.classNode)); |
|
ahe
2017/06/02 11:34:48
Any concerns about recursion here?
Paul Berry
2017/06/02 12:25:48
FWIW the topological sort in ClosedWorldClassHiera
ahe
2017/06/02 12:29:03
This situation might be slightly different. Howeve
|
| + } |
| + if (node.mixedInType != null) { |
| + superDepth = max(superDepth, getClassDepth(node.mixedInType.classNode)); |
| + } |
| + for (var supertype in node.implementedTypes) { |
| + superDepth = max(superDepth, getClassDepth(supertype.classNode)); |
| + } |
| + info.depth = superDepth + 1; |
| + } |
| + |
| + return info.depth; |
| + } |
| + |
| + @override |
| + InterfaceType getClassicLeastUpperBound( |
| + InterfaceType type1, InterfaceType type2) { |
| + // TODO(scheglov): implement getClassicLeastUpperBound |
| + throw new UnimplementedError(); |
| + } |
| + |
| + @override |
| + int getClassIndex(Class class_) { |
| + // TODO(scheglov): implement getClassIndex |
| + throw new UnimplementedError(); |
| + } |
| + |
| + @override |
| + Member getDispatchTarget(Class class_, Name name, {bool setter: false}) { |
| + // TODO(scheglov): implement getDispatchTarget |
| + throw new UnimplementedError(); |
| + } |
| + |
| + @override |
| + Member getInterfaceMember(Class class_, Name name, {bool setter: false}) { |
| + // TODO(scheglov): implement getInterfaceMember |
| + throw new UnimplementedError(); |
| + } |
| + |
| + @override |
| + List<Class> getRankedSuperclasses(Class class_) { |
| + // TODO(scheglov): implement getRankedSuperclasses |
| + throw new UnimplementedError(); |
| + } |
| + |
| + @override |
| + InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass) { |
| + // TODO(scheglov): implement getTypeAsInstanceOf |
| + throw new UnimplementedError(); |
| + } |
| + |
| + @override |
| + bool hasProperSubtypes(Class class_) { |
| + // TODO(scheglov): implement hasProperSubtypes |
| + throw new UnimplementedError(); |
| + } |
| + |
| + /// Return the [_ClassInfo] for the [node]. |
| + _ClassInfo _getInfo(Class node) { |
| + return _info.putIfAbsent(node, () => new _ClassInfo(node)); |
| + } |
| +} |
| + |
| +/// Information about a [Class]. |
| +class _ClassInfo { |
| + final Class node; |
| + |
| + /// The number of steps in the longest inheritance path from the class |
| + /// to [Object], or -1 if the depth has not been computed yet. |
| + int depth = -1; |
| + |
| + _ClassInfo(this.node); |
| +} |