| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |