OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 class Type implements Named, Hashable { | 5 class Type implements Named, Hashable { |
6 final String name; | 6 final String name; |
7 bool isTested; | 7 bool isTested; |
8 | 8 |
9 /** | 9 /** |
10 * For core types (int, String, etc) this is the generated type assertion | 10 * For core types (int, String, etc) this is the generated type assertion |
11 * function (uses JS "typeof"). This field is null for all other types. | 11 * function (uses JS "typeof"). This field is null for all other types. |
12 */ | 12 */ |
13 String typeCheckCode; | 13 String typeCheckCode; |
14 | 14 |
15 String _jsname; | 15 String _jsname; |
16 | 16 |
17 Member _typeMember; | 17 Member _typeMember; |
18 | 18 |
19 /** Stubs used to call into this method dynamically. Lazy initialized. */ | 19 /** Stubs used to call into this method dynamically. Lazy initialized. */ |
20 Map<String, VarMember> varStubs; | 20 Map<String, VarMember> varStubs; |
21 | 21 |
22 Type(this.name): isTested = false; | 22 /** Cache of [MemberSet]s that have been resolved. */ |
| 23 Map<String, MemberSet> _resolvedMembers; |
| 24 |
| 25 Type(this.name): isTested = false, _resolvedMembers = {}; |
23 | 26 |
24 void markUsed() {} | 27 void markUsed() {} |
25 abstract void genMethod(Member method); | 28 abstract void genMethod(Member method); |
26 | 29 |
27 TypeMember get typeMember() { | 30 TypeMember get typeMember() { |
28 if (_typeMember == null) { | 31 if (_typeMember == null) { |
29 _typeMember = new TypeMember(this); | 32 _typeMember = new TypeMember(this); |
30 } | 33 } |
31 return _typeMember; | 34 return _typeMember; |
32 } | 35 } |
33 | 36 |
34 abstract SourceSpan get span(); | 37 abstract SourceSpan get span(); |
35 | 38 |
36 abstract Type resolveType(TypeReference node, bool isRequired); | 39 abstract Type resolveType(TypeReference node, bool isRequired); |
37 | 40 |
38 abstract Type resolveTypeParams(ConcreteType inType); | 41 abstract Type resolveTypeParams(ConcreteType inType); |
39 | 42 |
40 abstract MemberSet resolveMember(String name); | |
41 Member getMember(String name) => null; | 43 Member getMember(String name) => null; |
42 abstract MethodMember getConstructor(String name); | 44 abstract MethodMember getConstructor(String name); |
43 abstract MethodMember getFactory(Type type, String name); | 45 abstract MethodMember getFactory(Type type, String name); |
44 abstract Type getOrMakeConcreteType(List<Type> typeArgs); | 46 abstract Type getOrMakeConcreteType(List<Type> typeArgs); |
45 abstract Map<String, MethodMember> get constructors(); | 47 abstract Map<String, MethodMember> get constructors(); |
46 abstract addDirectSubtype(Type type); | 48 abstract addDirectSubtype(Type type); |
47 abstract bool get isClass(); | 49 abstract bool get isClass(); |
48 abstract Library get library(); | 50 abstract Library get library(); |
| 51 Set<Type> get subtypes() => null; |
49 | 52 |
50 // TODO(jmesserly): rename to isDynamic? | 53 // TODO(jmesserly): rename to isDynamic? |
51 bool get isVar() => false; | 54 bool get isVar() => false; |
52 bool get isTop() => false; | 55 bool get isTop() => false; |
53 | 56 |
54 bool get isObject() => false; | 57 bool get isObject() => false; |
55 bool get isString() => false; | 58 bool get isString() => false; |
56 bool get isBool() => false; | 59 bool get isBool() => false; |
57 bool get isFunction() => false; | 60 bool get isFunction() => false; |
58 bool get isList() => false; | 61 bool get isList() => false; |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 return ret; | 165 return ret; |
163 } | 166 } |
164 } | 167 } |
165 return null; | 168 return null; |
166 } else { | 169 } else { |
167 return world.objectType.getMember(memberName); | 170 return world.objectType.getMember(memberName); |
168 } | 171 } |
169 } | 172 } |
170 } | 173 } |
171 | 174 |
| 175 MemberSet resolveMember(String memberName) { |
| 176 MemberSet ret = _resolvedMembers[memberName]; |
| 177 if (ret != null) return ret; |
| 178 |
| 179 Member member = getMember(memberName); |
| 180 if (member == null) { |
| 181 // TODO(jimhug): Check for members on subtypes given dart's dynamism. |
| 182 return null; |
| 183 } |
| 184 |
| 185 // TODO(jimhug): Move this adding subtypes logic to MemberSet? |
| 186 ret = new MemberSet(member); |
| 187 _resolvedMembers[memberName] = ret; |
| 188 if (member.isStatic) { |
| 189 return ret; |
| 190 } else { |
| 191 for (var t in subtypes) { |
| 192 if (!isClass && t.isClass) { |
| 193 // If this is an interface, the actual implementation may |
| 194 // come from a class that does not implement this interface. |
| 195 // TODO(vsm): Use a more efficient lookup strategy. |
| 196 // TODO(jimhug): This is made uglier by need to avoid dups. |
| 197 final m = t.getMember(memberName); |
| 198 if (m != null && ret.members.indexOf(m) == -1) { |
| 199 ret.add(m); |
| 200 } |
| 201 } else { |
| 202 final m = t.members[memberName]; |
| 203 if (m != null) ret.add(m); |
| 204 } |
| 205 } |
| 206 return ret; |
| 207 } |
| 208 } |
| 209 |
172 void ensureSubtypeOf(Type other, SourceSpan span, [bool typeErrors=false]) { | 210 void ensureSubtypeOf(Type other, SourceSpan span, [bool typeErrors=false]) { |
173 if (!isSubtypeOf(other)) { | 211 if (!isSubtypeOf(other)) { |
174 var msg = 'type $name is not a subtype of ${other.name}'; | 212 var msg = 'type $name is not a subtype of ${other.name}'; |
175 if (typeErrors) { | 213 if (typeErrors) { |
176 world.error(msg, span); | 214 world.error(msg, span); |
177 } else { | 215 } else { |
178 world.warning(msg, span); | 216 world.warning(msg, span); |
179 } | 217 } |
180 } | 218 } |
181 } | 219 } |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
477 FactoryMap get factories() => type.factories; | 515 FactoryMap get factories() => type.factories; |
478 Collection<Type> get typeArgsInOrder() => type.typeArgsInOrder; | 516 Collection<Type> get typeArgsInOrder() => type.typeArgsInOrder; |
479 DefinedType get genericType() => type.genericType; | 517 DefinedType get genericType() => type.genericType; |
480 List<Type> get interfaces() => type.interfaces; | 518 List<Type> get interfaces() => type.interfaces; |
481 Type get parent() => type.parent; | 519 Type get parent() => type.parent; |
482 Map<String, Member> getAllMembers() => type.getAllMembers(); | 520 Map<String, Member> getAllMembers() => type.getAllMembers(); |
483 bool get isNativeType() => type.isNativeType; | 521 bool get isNativeType() => type.isNativeType; |
484 } | 522 } |
485 | 523 |
486 /** A concrete version of a generic type. */ | 524 /** A concrete version of a generic type. */ |
error: old chunk mismatch |
None
OLD | NEW |