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); |