| Index: frog/type.dart
|
| diff --git a/frog/type.dart b/frog/type.dart
|
| index 8399dcc398ffa2b41839ccff3b2970df7ab090f4..237d6c54c681ef8be1544eec9d12871e6758b019 100644
|
| --- a/frog/type.dart
|
| +++ b/frog/type.dart
|
| @@ -91,7 +91,10 @@ class Type implements Named, Hashable {
|
|
|
| set jsname(String name) => _jsname = name;
|
|
|
| + /** The members directly on this type. */
|
| + // TODO(jmesserly): should this be directMembers?
|
| Map<String, Member> get members() => null;
|
| +
|
| Definition get definition() => null;
|
| FactoryMap get factories() => null;
|
|
|
| @@ -108,6 +111,47 @@ class Type implements Named, Hashable {
|
|
|
| int hashCode() => name.hashCode();
|
|
|
| + bool _isAbstract;
|
| + bool get isAbstract() {
|
| + if (_isAbstract == null) {
|
| + if (isClass) {
|
| + _isAbstract = inheritedMembers.getValues().some((m) => m.isAbstract);
|
| + } else {
|
| + _isAbstract = true;
|
| + }
|
| + }
|
| + return _isAbstract;
|
| + }
|
| +
|
| + Map<String, Member> _inheritedMembers;
|
| + /**
|
| + * Gets all members in the class with the corresponding most-derived
|
| + * member.
|
| + */
|
| + // TODO(jmesserly): use this for getMember and do _checkOverride here?
|
| + Map<String, Member> get inheritedMembers() {
|
| + if (_inheritedMembers == null) {
|
| + _inheritedMembers = _getInheritedMembers(<String, Member>{});
|
| + }
|
| + return _inheritedMembers;
|
| + }
|
| +
|
| + _getInheritedMembers(Map<String, Member> flattened) {
|
| + if (interfaces != null) {
|
| + for (var i in interfaces) {
|
| + i._getInheritedMembers(flattened);
|
| + }
|
| + }
|
| + if (parent != null) {
|
| + parent._getInheritedMembers(flattened);
|
| + }
|
| + // Add my members last so they take precedence
|
| + for (var m in getAllMembers().getValues()) {
|
| + flattened[m.name] = m;
|
| + }
|
| + return flattened;
|
| + }
|
| +
|
| void _checkOverride(Member member) {
|
| // always look in parents to check that any overloads are legal
|
| var parentMember = _getMemberInParents(member.name);
|
|
|