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

Side by Side Diff: sdk/lib/_internal/compiler/implementation/resolution/class_members.dart

Issue 177963002: Use List instead of Link in the type system. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 9 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 resolution.compute_members; 5 library resolution.compute_members;
6 6
7 import '../elements/elements.dart' 7 import '../elements/elements.dart'
8 show Element, 8 show Element,
9 Name, 9 Name,
10 PublicName, 10 PublicName,
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 declaredMembers[name] = new DeclaredMember( 140 declaredMembers[name] = new DeclaredMember(
141 name, element, thisType, type, 141 name, element, thisType, type,
142 new FunctionType(compiler.functionClass, type)); 142 new FunctionType(compiler.functionClass, type));
143 if (!element.modifiers.isConst() && 143 if (!element.modifiers.isConst() &&
144 !element.modifiers.isFinal()) { 144 !element.modifiers.isFinal()) {
145 name = name.setter; 145 name = name.setter;
146 declaredMembers[name] = new DeclaredMember( 146 declaredMembers[name] = new DeclaredMember(
147 name, element, thisType, type, 147 name, element, thisType, type,
148 new FunctionType(compiler.functionClass, 148 new FunctionType(compiler.functionClass,
149 compiler.types.voidType, 149 compiler.types.voidType,
150 const Link<DartType>().prepend(type))); 150 [type]));
151 } 151 }
152 } else if (element.isGetter()) { 152 } else if (element.isGetter()) {
153 FunctionType functionType = element.computeType(compiler); 153 FunctionType functionType = element.computeType(compiler);
154 DartType type = functionType.returnType; 154 DartType type = functionType.returnType;
155 declaredMembers[name] = 155 declaredMembers[name] =
156 new DeclaredMember(name, element, thisType, type, functionType); 156 new DeclaredMember(name, element, thisType, type, functionType);
157 } else if (element.isSetter()) { 157 } else if (element.isSetter()) {
158 FunctionType functionType = element.computeType(compiler); 158 FunctionType functionType = element.computeType(compiler);
159 DartType type; 159 DartType type;
160 if (!functionType.parameterTypes.isEmpty) { 160 if (!functionType.parameterTypes.isEmpty) {
161 type = functionType.parameterTypes.head; 161 type = functionType.parameterTypes.first;
162 } else { 162 } else {
163 type = compiler.types.dynamicType; 163 type = compiler.types.dynamicType;
164 } 164 }
165 name = name.setter; 165 name = name.setter;
166 declaredMembers[name] = new DeclaredMember( 166 declaredMembers[name] = new DeclaredMember(
167 name, element, thisType, type, functionType); 167 name, element, thisType, type, functionType);
168 } else { 168 } else {
169 assert(invariant(element, element.isFunction())); 169 assert(invariant(element, element.isFunction()));
170 FunctionType type = element.computeType(compiler); 170 FunctionType type = element.computeType(compiler);
171 declaredMembers[name] = new DeclaredMember( 171 declaredMembers[name] = new DeclaredMember(
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 int maxPositionalParameters; 288 int maxPositionalParameters;
289 Set<String> names = new Set<String>(); 289 Set<String> names = new Set<String>();
290 for (MemberSignature member in inheritedMembers) { 290 for (MemberSignature member in inheritedMembers) {
291 int requiredParameters = 0; 291 int requiredParameters = 0;
292 int optionalParameters = 0; 292 int optionalParameters = 0;
293 if (member.isSetter) { 293 if (member.isSetter) {
294 requiredParameters = 1; 294 requiredParameters = 1;
295 } 295 }
296 if (member.type.kind == TypeKind.FUNCTION) { 296 if (member.type.kind == TypeKind.FUNCTION) {
297 FunctionType type = member.type; 297 FunctionType type = member.type;
298 type.namedParameters.forEach( 298 type.namedParameters.forEach((String name) => names.add(name));
299 (String name) => names.add(name)); 299 requiredParameters = type.parameterTypes.length;
300 requiredParameters = type.parameterTypes.slowLength(); 300 optionalParameters = type.optionalParameterTypes.length;
301 optionalParameters = type.optionalParameterTypes.slowLength();
302 } 301 }
303 int positionalParameters = requiredParameters + optionalParameters; 302 int positionalParameters = requiredParameters + optionalParameters;
304 if (minRequiredParameters == null || 303 if (minRequiredParameters == null ||
305 minRequiredParameters > requiredParameters) { 304 minRequiredParameters > requiredParameters) {
306 minRequiredParameters = requiredParameters; 305 minRequiredParameters = requiredParameters;
307 } 306 }
308 if (maxPositionalParameters == null || 307 if (maxPositionalParameters == null ||
309 maxPositionalParameters < positionalParameters) { 308 maxPositionalParameters < positionalParameters) {
310 maxPositionalParameters = positionalParameters; 309 maxPositionalParameters = positionalParameters;
311 } 310 }
312 } 311 }
313 int optionalParameters = 312 int optionalParameters =
314 maxPositionalParameters - minRequiredParameters; 313 maxPositionalParameters - minRequiredParameters;
315 // TODO(johnniwinther): Support function types with both optional 314 // TODO(johnniwinther): Support function types with both optional
316 // and named parameters? 315 // and named parameters?
317 if (optionalParameters == 0 || names.isEmpty) { 316 if (optionalParameters == 0 || names.isEmpty) {
318 Link<DartType> requiredParameterTypes = const Link<DartType>(); 317 List<DartType> requiredParameterTypes = new List<DartType>.generate(
319 while (--minRequiredParameters >= 0) { 318 minRequiredParameters, (_) => compiler.types.dynamicType);
320 requiredParameterTypes = 319 List<DartType> optionalParameterTypes = new List<DartType>.generate(
321 requiredParameterTypes.prepend(compiler.types.dynamicType); 320 optionalParameters, (_) => compiler.types.dynamicType);
322 } 321 List<String> namedParameters = <String>[];
323 Link<DartType> optionalParameterTypes = const Link<DartType>(); 322 List<DartType> namedParameterTypes = <DartType>[];
324 while (--optionalParameters >= 0) { 323 for (String name in namedParameters) {
325 optionalParameterTypes = 324 namedParameters.add(name);
326 optionalParameterTypes.prepend(compiler.types.dynamicType); 325 namedParameterTypes.add(compiler.types.dynamicType);
327 }
328 Link<String> namedParameters = const Link<String>();
329 Link<DartType> namedParameterTypes = const Link<DartType>();
330 List<String> namesReversed =
331 names.toList()..sort((a, b) => -a.compareTo(b));
332 for (String name in namesReversed) {
333 namedParameters = namedParameters.prepend(name);
334 namedParameterTypes =
335 namedParameterTypes.prepend(compiler.types.dynamicType);
336 } 326 }
337 FunctionType memberType = new FunctionType( 327 FunctionType memberType = new FunctionType(
338 compiler.functionClass, 328 compiler.functionClass,
339 compiler.types.dynamicType, 329 compiler.types.dynamicType,
340 requiredParameterTypes, 330 requiredParameterTypes,
341 optionalParameterTypes, 331 optionalParameterTypes,
342 namedParameters, namedParameterTypes); 332 namedParameters, namedParameterTypes);
343 DartType type = memberType; 333 DartType type = memberType;
344 if (inheritedMembers.first.isGetter || 334 if (inheritedMembers.first.isGetter ||
345 inheritedMembers.first.isSetter) { 335 inheritedMembers.first.isSetter) {
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 } 550 }
561 551
562 static void computeClassMembers(Compiler compiler, BaseClassElementX cls) { 552 static void computeClassMembers(Compiler compiler, BaseClassElementX cls) {
563 if (cls.classMembers != null) return; 553 if (cls.classMembers != null) return;
564 MembersCreator creator = new MembersCreator(compiler, cls); 554 MembersCreator creator = new MembersCreator(compiler, cls);
565 creator.computeMembers(); 555 creator.computeMembers();
566 cls.classMembers = creator.classMembers; 556 cls.classMembers = creator.classMembers;
567 cls.interfaceMembers = creator.interfaceMembers; 557 cls.interfaceMembers = creator.interfaceMembers;
568 } 558 }
569 } 559 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698