Chromium Code Reviews| 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('universe'); | 5 #library('universe'); |
| 6 | 6 |
| 7 #import('../closure.dart'); | 7 #import('../closure.dart'); |
| 8 #import('../elements/elements.dart'); | 8 #import('../elements/elements.dart'); |
| 9 #import('../leg.dart'); | 9 #import('../leg.dart'); |
| 10 #import('../scanner/scannerlib.dart'); | 10 #import('../scanner/scannerlib.dart'); |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 208 if (element.isField()) return isGetter() || isSetter() || isCall(); | 208 if (element.isField()) return isGetter() || isSetter() || isCall(); |
| 209 if (isGetter()) return true; | 209 if (isGetter()) return true; |
| 210 | 210 |
| 211 FunctionElement function = element; | 211 FunctionElement function = element; |
| 212 FunctionSignature parameters = function.computeSignature(compiler); | 212 FunctionSignature parameters = function.computeSignature(compiler); |
| 213 if (argumentCount > parameters.parameterCount) return false; | 213 if (argumentCount > parameters.parameterCount) return false; |
| 214 int requiredParameterCount = parameters.requiredParameterCount; | 214 int requiredParameterCount = parameters.requiredParameterCount; |
| 215 int optionalParameterCount = parameters.optionalParameterCount; | 215 int optionalParameterCount = parameters.optionalParameterCount; |
| 216 if (positionalArgumentCount < requiredParameterCount) return false; | 216 if (positionalArgumentCount < requiredParameterCount) return false; |
| 217 | 217 |
| 218 if (!parameters.optionalParametersAreNamed) { | |
| 219 if (!Compiler.REJECT_NAMED_ARGUMENT_AS_POSITIONAL) { | |
| 220 return optionalParametersAppliesDEPRECATED(element, compiler); | |
| 221 } else { | |
| 222 return namedArguments.isEmpty(); | |
|
kasperl
2012/09/12 08:23:13
Somehow this case looks too simple. If the optiona
ngeoffray
2012/09/12 09:14:35
It is that simple :) As discussed, I added a comme
| |
| 223 } | |
| 224 } else { | |
| 225 if (positionalArgumentCount > requiredParameterCount) return false; | |
| 226 if (namedArgumentCount > optionalParameterCount) return false; | |
|
kasperl
2012/09/12 08:23:13
Where do we weed out passing the same name more th
ngeoffray
2012/09/12 09:14:35
The check must be done in the resolver, but we're
| |
| 227 Set<SourceString> nameSet = new Set<SourceString>(); | |
| 228 parameters.optionalParameters.forEach((Element element) { | |
| 229 nameSet.add(element.name); | |
| 230 }); | |
| 231 for (SourceString name in namedArguments) { | |
| 232 if (!nameSet.contains(name)) return false; | |
| 233 nameSet.remove(name); | |
| 234 } | |
| 235 return true; | |
| 236 } | |
| 237 } | |
| 238 | |
| 239 // TODO(5074): Remove this method once we don't accept the | |
| 240 // deprecated parameter specification. | |
| 241 bool optionalParametersAppliesDEPRECATED(FunctionElement function, | |
| 242 Compiler compiler) { | |
| 243 FunctionSignature parameters = function.computeSignature(compiler); | |
| 244 int requiredParameterCount = parameters.requiredParameterCount; | |
| 245 int optionalParameterCount = parameters.optionalParameterCount; | |
| 246 | |
| 218 bool hasOptionalParameters = !parameters.optionalParameters.isEmpty(); | 247 bool hasOptionalParameters = !parameters.optionalParameters.isEmpty(); |
| 219 if (namedArguments.isEmpty()) { | 248 if (namedArguments.isEmpty()) { |
| 220 if (!hasOptionalParameters) { | 249 if (!hasOptionalParameters) { |
| 221 return requiredParameterCount == argumentCount; | 250 return requiredParameterCount == argumentCount; |
| 222 } else { | 251 } else { |
| 223 return argumentCount >= requiredParameterCount && | 252 return argumentCount >= requiredParameterCount && |
| 224 argumentCount <= requiredParameterCount + optionalParameterCount; | 253 argumentCount <= requiredParameterCount + optionalParameterCount; |
| 225 } | 254 } |
| 226 } else { | 255 } else { |
| 227 if (!hasOptionalParameters) return false; | 256 if (!hasOptionalParameters) return false; |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 239 for (SourceString name in namedArguments) { | 268 for (SourceString name in namedArguments) { |
| 240 if (!nameSet.contains(name)) { | 269 if (!nameSet.contains(name)) { |
| 241 return false; | 270 return false; |
| 242 } | 271 } |
| 243 nameSet.remove(name); | 272 nameSet.remove(name); |
| 244 } | 273 } |
| 245 return true; | 274 return true; |
| 246 } | 275 } |
| 247 } | 276 } |
| 248 | 277 |
| 249 /** | 278 // TODO(5074): Remove this method once we don't accept the |
| 250 * Returns [:true:] if the selector and the [element] match; [:false:] | 279 // deprecated parameter specification. |
| 251 * otherwise. | 280 bool addOptionalArgumentsToListDEPRECATED(Link<Node> arguments, |
| 252 */ | 281 List list, |
| 253 bool addArgumentsToList(Link<Node> arguments, | 282 FunctionElement element, |
| 254 List list, | 283 compileArgument(Node argument), |
| 255 FunctionElement element, | 284 compileConstant(Element element), |
| 256 compileArgument(Node argument), | 285 Compiler compiler) { |
| 257 compileConstant(Element element), | |
| 258 Compiler compiler) { | |
| 259 if (!this.applies(element, compiler)) return false; | |
| 260 | |
| 261 void addMatchingArgumentsToList(Link<Node> link) {} | |
| 262 | |
| 263 FunctionSignature parameters = element.computeSignature(compiler); | |
| 264 if (this.positionalArgumentCount == parameters.parameterCount) { | |
| 265 for (Link<Node> link = arguments; !link.isEmpty(); link = link.tail) { | |
| 266 list.add(compileArgument(link.head)); | |
| 267 } | |
| 268 return true; | |
| 269 } | |
| 270 | |
| 271 // If there are named arguments, provide them in the order | 286 // If there are named arguments, provide them in the order |
| 272 // expected by the called function, which is the source order. | 287 // expected by the called function, which is the source order. |
| 288 FunctionSignature parameters = element.computeSignature(compiler); | |
| 273 | 289 |
| 274 // Visit positional arguments and add them to the list. | 290 // Visit positional arguments and add them to the list. |
| 275 int positionalArgumentCount = this.positionalArgumentCount; | 291 for (int i = parameters.requiredParameterCount; |
| 276 for (int i = 0; | |
| 277 i < positionalArgumentCount; | 292 i < positionalArgumentCount; |
| 278 arguments = arguments.tail, i++) { | 293 arguments = arguments.tail, i++) { |
| 279 list.add(compileArgument(arguments.head)); | 294 list.add(compileArgument(arguments.head)); |
| 280 } | 295 } |
| 281 | 296 |
| 282 // Visit named arguments and add them into a temporary list. | 297 // Visit named arguments and add them into a temporary list. |
| 283 List compiledNamedArguments = []; | 298 List compiledNamedArguments = []; |
| 284 for (; !arguments.isEmpty(); arguments = arguments.tail) { | 299 for (; !arguments.isEmpty(); arguments = arguments.tail) { |
| 285 NamedArgument namedArgument = arguments.head; | 300 NamedArgument namedArgument = arguments.head; |
| 286 compiledNamedArguments.add(compileArgument(namedArgument.expression)); | 301 compiledNamedArguments.add(compileArgument(namedArgument.expression)); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 309 foundIndex = i; | 324 foundIndex = i; |
| 310 break; | 325 break; |
| 311 } | 326 } |
| 312 } | 327 } |
| 313 if (foundIndex != -1) { | 328 if (foundIndex != -1) { |
| 314 list.add(compiledNamedArguments[foundIndex]); | 329 list.add(compiledNamedArguments[foundIndex]); |
| 315 } else { | 330 } else { |
| 316 list.add(compileConstant(parameter)); | 331 list.add(compileConstant(parameter)); |
| 317 } | 332 } |
| 318 } | 333 } |
| 334 } | |
| 335 | |
| 336 | |
| 337 /** | |
| 338 * Returns [:true:] if the selector and the [element] match; [:false:] | |
| 339 * otherwise. | |
| 340 */ | |
| 341 bool addArgumentsToList(Link<Node> arguments, | |
| 342 List list, | |
| 343 FunctionElement element, | |
| 344 compileArgument(Node argument), | |
| 345 compileConstant(Element element), | |
| 346 Compiler compiler) { | |
| 347 if (!this.applies(element, compiler)) return false; | |
| 348 | |
| 349 FunctionSignature parameters = element.computeSignature(compiler); | |
| 350 parameters.forEachRequiredParameter((element) { | |
| 351 list.add(compileArgument(arguments.head)); | |
| 352 arguments = arguments.tail; | |
| 353 }); | |
| 354 | |
| 355 if (!parameters.optionalParametersAreNamed) { | |
| 356 if (!Compiler.REJECT_NAMED_ARGUMENT_AS_POSITIONAL) { | |
| 357 addOptionalArgumentsToListDEPRECATED( | |
| 358 arguments, list, element, compileArgument, compileConstant, | |
| 359 compiler); | |
| 360 } else { | |
| 361 parameters.forEachOptionalParameter((element) { | |
| 362 if (!arguments.isEmpty()) { | |
| 363 list.add(compileArgument(arguments.head)); | |
| 364 arguments = arguments.tail; | |
| 365 } else { | |
| 366 list.add(compileConstant(element)); | |
| 367 } | |
| 368 }); | |
| 369 } | |
| 370 } else { | |
| 371 // Visit named arguments and add them into a temporary list. | |
| 372 List compiledNamedArguments = []; | |
| 373 for (; !arguments.isEmpty(); arguments = arguments.tail) { | |
| 374 NamedArgument namedArgument = arguments.head; | |
| 375 compiledNamedArguments.add(compileArgument(namedArgument.expression)); | |
| 376 } | |
| 377 // Iterate over the optional parameters of the signature, and try to | |
| 378 // find them in [compiledNamedArguments]. If found, we use the | |
| 379 // value in the temporary list, otherwise the default value. | |
| 380 parameters.forEachOptionalParameter((element) { | |
| 381 int foundIndex = -1; | |
|
kasperl
2012/09/12 08:23:13
namedArguments.indexOf(element.name)?
ngeoffray
2012/09/12 09:14:35
Done.
| |
| 382 for (int i = 0; i < namedArguments.length; i++) { | |
| 383 SourceString name = namedArguments[i]; | |
| 384 if (name == element.name) { | |
| 385 foundIndex = i; | |
| 386 break; | |
| 387 } | |
| 388 } | |
| 389 if (foundIndex != -1) { | |
| 390 list.add(compiledNamedArguments[foundIndex]); | |
| 391 } else { | |
| 392 list.add(compileConstant(element)); | |
| 393 } | |
| 394 }); | |
| 395 } | |
| 319 return true; | 396 return true; |
| 320 } | 397 } |
| 321 | 398 |
| 322 static bool sameNames(List<SourceString> first, List<SourceString> second) { | 399 static bool sameNames(List<SourceString> first, List<SourceString> second) { |
| 323 for (int i = 0; i < first.length; i++) { | 400 for (int i = 0; i < first.length; i++) { |
| 324 if (first[i] != second[i]) return false; | 401 if (first[i] != second[i]) return false; |
| 325 } | 402 } |
| 326 return true; | 403 return true; |
| 327 } | 404 } |
| 328 | 405 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 429 | 506 |
| 430 if (!self.isInterface() && self.isSubclassOf(other)) { | 507 if (!self.isInterface() && self.isSubclassOf(other)) { |
| 431 // Resolve an invocation of [element.name] on [self]. If it | 508 // Resolve an invocation of [element.name] on [self]. If it |
| 432 // is found, this selector is a candidate. | 509 // is found, this selector is a candidate. |
| 433 return hasElementIn(self, element) && appliesUntyped(element, compiler); | 510 return hasElementIn(self, element) && appliesUntyped(element, compiler); |
| 434 } | 511 } |
| 435 | 512 |
| 436 return false; | 513 return false; |
| 437 } | 514 } |
| 438 } | 515 } |
| OLD | NEW |