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

Side by Side Diff: test/class_hierarchy_basic.dart

Issue 2439043002: Introduce Substitution class and Supertype class. (Closed)
Patch Set: Created 4 years, 2 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
« no previous file with comments | « lib/visitor.dart ('k') | test/type_parser.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 library kernel.class_hierarchy_basic; 5 library kernel.class_hierarchy_basic;
6 6
7 import 'package:kernel/class_hierarchy.dart'; 7 import 'package:kernel/class_hierarchy.dart';
8 import 'package:kernel/type_algebra.dart'; 8 import 'package:kernel/type_algebra.dart';
9 import 'package:kernel/ast.dart'; 9 import 'package:kernel/ast.dart';
10 10
11 /// A simple implementation of the class hierarchy interface using 11 /// A simple implementation of the class hierarchy interface using
12 /// hash tables for everything. 12 /// hash tables for everything.
13 class BasicClassHierarchy implements ClassHierarchy { 13 class BasicClassHierarchy implements ClassHierarchy {
14 final Map<Class, Set<Class>> superclasses = <Class, Set<Class>>{}; 14 final Map<Class, Set<Class>> superclasses = <Class, Set<Class>>{};
15 final Map<Class, Set<Class>> superMixtures = <Class, Set<Class>>{}; 15 final Map<Class, Set<Class>> superMixtures = <Class, Set<Class>>{};
16 final Map<Class, Set<Class>> supertypes = <Class, Set<Class>>{}; 16 final Map<Class, Set<Class>> supertypes = <Class, Set<Class>>{};
17 final Map<Class, Map<Class, InterfaceType>> supertypeInstantiations = 17 final Map<Class, Map<Class, Supertype>> supertypeInstantiations =
18 <Class, Map<Class, InterfaceType>>{}; 18 <Class, Map<Class, Supertype>>{};
19 final Map<Class, Map<Name, Member>> gettersAndCalls = 19 final Map<Class, Map<Name, Member>> gettersAndCalls =
20 <Class, Map<Name, Member>>{}; 20 <Class, Map<Name, Member>>{};
21 final Map<Class, Map<Name, Member>> setters = <Class, Map<Name, Member>>{}; 21 final Map<Class, Map<Name, Member>> setters = <Class, Map<Name, Member>>{};
22 final Map<Class, Map<Name, List<Member>>> interfaceGettersAndCalls = 22 final Map<Class, Map<Name, List<Member>>> interfaceGettersAndCalls =
23 <Class, Map<Name, List<Member>>>{}; 23 <Class, Map<Name, List<Member>>>{};
24 final Map<Class, Map<Name, List<Member>>> interfaceSetters = 24 final Map<Class, Map<Name, List<Member>>> interfaceSetters =
25 <Class, Map<Name, List<Member>>>{}; 25 <Class, Map<Name, List<Member>>>{};
26 final List<Class> classes = <Class>[]; 26 final List<Class> classes = <Class>[];
27 final Map<Class, int> classIndex = <Class, int>{}; 27 final Map<Class, int> classIndex = <Class, int>{};
28 28
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 for (var supertype in node.implementedTypes) { 105 for (var supertype in node.implementedTypes) {
106 buildSuperTypeSets(supertype.classNode); 106 buildSuperTypeSets(supertype.classNode);
107 supertypes[node].addAll(supertypes[supertype.classNode]); 107 supertypes[node].addAll(supertypes[supertype.classNode]);
108 } 108 }
109 classes.add(node); 109 classes.add(node);
110 classIndex[node] = classes.length - 1; 110 classIndex[node] = classes.length - 1;
111 } 111 }
112 112
113 void buildSuperTypeInstantiations(Class node) { 113 void buildSuperTypeInstantiations(Class node) {
114 if (supertypeInstantiations.containsKey(node)) return; 114 if (supertypeInstantiations.containsKey(node)) return;
115 supertypeInstantiations[node] = <Class, InterfaceType>{node: node.thisType}; 115 supertypeInstantiations[node] = <Class, Supertype>{
116 node: node.asThisSupertype
117 };
116 for (var supertype in node.supers) { 118 for (var supertype in node.supers) {
117 var superclass = supertype.classNode; 119 var superclass = supertype.classNode;
118 buildSuperTypeInstantiations(superclass); 120 buildSuperTypeInstantiations(superclass);
119 var substitution = new Map<TypeParameter, DartType>.fromIterables( 121 var substitution = Substitution.fromPairs(
120 superclass.typeParameters, supertype.typeArguments); 122 superclass.typeParameters, supertype.typeArguments);
121 supertypeInstantiations[superclass].forEach((key, type) { 123 supertypeInstantiations[superclass].forEach((key, type) {
122 supertypeInstantiations[node][key] = substitute(type, substitution); 124 supertypeInstantiations[node][key] =
125 substitution.substituteSupertype(type);
123 }); 126 });
124 } 127 }
125 } 128 }
126 129
127 void buildDispatchTable(Class node) { 130 void buildDispatchTable(Class node) {
128 if (gettersAndCalls.containsKey(node)) return; 131 if (gettersAndCalls.containsKey(node)) return;
129 gettersAndCalls[node] = <Name, Member>{}; 132 gettersAndCalls[node] = <Name, Member>{};
130 setters[node] = <Name, Member>{}; 133 setters[node] = <Name, Member>{};
131 if (node.supertype != null) { 134 if (node.supertype != null) {
132 buildDispatchTable(node.supertype.classNode); 135 buildDispatchTable(node.supertype.classNode);
(...skipping 23 matching lines...) Expand all
156 Map<Name, List<Member>> source, Map<Name, List<Member>> destination) { 159 Map<Name, List<Member>> source, Map<Name, List<Member>> destination) {
157 for (var name in source.keys) { 160 for (var name in source.keys) {
158 destination.putIfAbsent(name, () => <Member>[]).addAll(source[name]); 161 destination.putIfAbsent(name, () => <Member>[]).addAll(source[name]);
159 } 162 }
160 } 163 }
161 164
162 void buildInterfaceTable(Class node) { 165 void buildInterfaceTable(Class node) {
163 if (interfaceGettersAndCalls.containsKey(node)) return; 166 if (interfaceGettersAndCalls.containsKey(node)) return;
164 interfaceGettersAndCalls[node] = <Name, List<Member>>{}; 167 interfaceGettersAndCalls[node] = <Name, List<Member>>{};
165 interfaceSetters[node] = <Name, List<Member>>{}; 168 interfaceSetters[node] = <Name, List<Member>>{};
166 void inheritFrom(InterfaceType type) { 169 void inheritFrom(Supertype type) {
167 if (type == null) return; 170 if (type == null) return;
168 buildInterfaceTable(type.classNode); 171 buildInterfaceTable(type.classNode);
169 mergeMaps(interfaceGettersAndCalls[type.classNode], 172 mergeMaps(interfaceGettersAndCalls[type.classNode],
170 interfaceGettersAndCalls[node]); 173 interfaceGettersAndCalls[node]);
171 mergeMaps(interfaceSetters[type.classNode], interfaceSetters[node]); 174 mergeMaps(interfaceSetters[type.classNode], interfaceSetters[node]);
172 } 175 }
173 inheritFrom(node.supertype); 176 inheritFrom(node.supertype);
174 inheritFrom(node.mixedInType); 177 inheritFrom(node.mixedInType);
175 node.implementedTypes.forEach(inheritFrom); 178 node.implementedTypes.forEach(inheritFrom);
176 // Overwrite map entries with declared members. 179 // Overwrite map entries with declared members.
(...skipping 19 matching lines...) Expand all
196 } 199 }
197 200
198 bool isSubmixtureOf(Class subtype, Class supertype) { 201 bool isSubmixtureOf(Class subtype, Class supertype) {
199 return superMixtures[subtype].contains(supertype); 202 return superMixtures[subtype].contains(supertype);
200 } 203 }
201 204
202 bool isSubtypeOf(Class subtype, Class supertype) { 205 bool isSubtypeOf(Class subtype, Class supertype) {
203 return supertypes[subtype].contains(supertype); 206 return supertypes[subtype].contains(supertype);
204 } 207 }
205 208
206 InterfaceType getClassAsInstanceOf(Class type, Class supertype) { 209 Supertype getClassAsInstanceOf(Class type, Class supertype) {
207 return supertypeInstantiations[type][supertype]; 210 return supertypeInstantiations[type][supertype];
208 } 211 }
209 212
210 Member getDispatchTarget(Class class_, Name name, {bool setter: false}) { 213 Member getDispatchTarget(Class class_, Name name, {bool setter: false}) {
211 return setter ? setters[class_][name] : gettersAndCalls[class_][name]; 214 return setter ? setters[class_][name] : gettersAndCalls[class_][name];
212 } 215 }
213 216
214 Iterable<Member> getDispatchTargets(Class class_, {bool setters: false}) { 217 Iterable<Member> getDispatchTargets(Class class_, {bool setters: false}) {
215 return setters 218 return setters
216 ? this.setters[class_].values 219 ? this.setters[class_].values
(...skipping 25 matching lines...) Expand all
242 int getClassIndex(Class node) { 245 int getClassIndex(Class node) {
243 return classIndex[node]; 246 return classIndex[node];
244 } 247 }
245 248
246 List<int> getExpenseHistogram() => <int>[]; 249 List<int> getExpenseHistogram() => <int>[];
247 double getCompressionRatio() => 0.0; 250 double getCompressionRatio() => 0.0;
248 int getSuperTypeHashTableSize() => 0; 251 int getSuperTypeHashTableSize() => 0;
249 252
250 noSuchMethod(inv) => super.noSuchMethod(inv); 253 noSuchMethod(inv) => super.noSuchMethod(inv);
251 } 254 }
OLDNEW
« no previous file with comments | « lib/visitor.dart ('k') | test/type_parser.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698