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 '../dart2jslib.dart'; | 9 import '../dart2jslib.dart'; |
10 import '../runtime_types.dart'; | 10 import '../runtime_types.dart'; |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 | 129 |
130 Selector( | 130 Selector( |
131 this.kind, | 131 this.kind, |
132 SourceString name, | 132 SourceString name, |
133 LibraryElement library, | 133 LibraryElement library, |
134 this.argumentCount, | 134 this.argumentCount, |
135 [List<SourceString> namedArguments = const <SourceString>[]]) | 135 [List<SourceString> namedArguments = const <SourceString>[]]) |
136 : this.name = name, | 136 : this.name = name, |
137 this.library = name.isPrivate() ? library : null, | 137 this.library = name.isPrivate() ? library : null, |
138 this.namedArguments = namedArguments, | 138 this.namedArguments = namedArguments, |
139 this.orderedNamedArguments = namedArguments.isEmpty() | 139 this.orderedNamedArguments = namedArguments.isEmpty |
140 ? namedArguments | 140 ? namedArguments |
141 : <SourceString>[] { | 141 : <SourceString>[] { |
142 assert(!name.isPrivate() || library != null); | 142 assert(!name.isPrivate() || library != null); |
143 } | 143 } |
144 | 144 |
145 Selector.getter(SourceString name, LibraryElement library) | 145 Selector.getter(SourceString name, LibraryElement library) |
146 : this(SelectorKind.GETTER, name, library, 0); | 146 : this(SelectorKind.GETTER, name, library, 0); |
147 | 147 |
148 Selector.getterFrom(Selector selector) | 148 Selector.getterFrom(Selector selector) |
149 : this(SelectorKind.GETTER, selector.name, selector.library, 0); | 149 : this(SelectorKind.GETTER, selector.name, selector.library, 0); |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
239 // TODO(5074): Remove this check once we don't accept the | 239 // TODO(5074): Remove this check once we don't accept the |
240 // deprecated parameter specification. | 240 // deprecated parameter specification. |
241 if (!Compiler.REJECT_NAMED_ARGUMENT_AS_POSITIONAL) { | 241 if (!Compiler.REJECT_NAMED_ARGUMENT_AS_POSITIONAL) { |
242 return optionalParametersAppliesDEPRECATED(element, compiler); | 242 return optionalParametersAppliesDEPRECATED(element, compiler); |
243 } else { | 243 } else { |
244 // We have already checked that the number of arguments are | 244 // We have already checked that the number of arguments are |
245 // not greater than the number of parameters. Therefore the | 245 // not greater than the number of parameters. Therefore the |
246 // number of positional arguments are not greater than the | 246 // number of positional arguments are not greater than the |
247 // number of parameters. | 247 // number of parameters. |
248 assert(positionalArgumentCount <= parameters.parameterCount); | 248 assert(positionalArgumentCount <= parameters.parameterCount); |
249 return namedArguments.isEmpty(); | 249 return namedArguments.isEmpty; |
250 } | 250 } |
251 } else { | 251 } else { |
252 if (positionalArgumentCount > requiredParameterCount) return false; | 252 if (positionalArgumentCount > requiredParameterCount) return false; |
253 assert(positionalArgumentCount == requiredParameterCount); | 253 assert(positionalArgumentCount == requiredParameterCount); |
254 if (namedArgumentCount > optionalParameterCount) return false; | 254 if (namedArgumentCount > optionalParameterCount) return false; |
255 Set<SourceString> nameSet = new Set<SourceString>(); | 255 Set<SourceString> nameSet = new Set<SourceString>(); |
256 parameters.optionalParameters.forEach((Element element) { | 256 parameters.optionalParameters.forEach((Element element) { |
257 nameSet.add(element.name); | 257 nameSet.add(element.name); |
258 }); | 258 }); |
259 for (SourceString name in namedArguments) { | 259 for (SourceString name in namedArguments) { |
260 if (!nameSet.contains(name)) return false; | 260 if (!nameSet.contains(name)) return false; |
261 // TODO(5213): By removing from the set we are checking | 261 // TODO(5213): By removing from the set we are checking |
262 // that we are not passing the name twice. We should have this | 262 // that we are not passing the name twice. We should have this |
263 // check in the resolver also. | 263 // check in the resolver also. |
264 nameSet.remove(name); | 264 nameSet.remove(name); |
265 } | 265 } |
266 return true; | 266 return true; |
267 } | 267 } |
268 } | 268 } |
269 | 269 |
270 // TODO(5074): Remove this method once we don't accept the | 270 // TODO(5074): Remove this method once we don't accept the |
271 // deprecated parameter specification. | 271 // deprecated parameter specification. |
272 bool optionalParametersAppliesDEPRECATED(FunctionElement function, | 272 bool optionalParametersAppliesDEPRECATED(FunctionElement function, |
273 Compiler compiler) { | 273 Compiler compiler) { |
274 FunctionSignature parameters = function.computeSignature(compiler); | 274 FunctionSignature parameters = function.computeSignature(compiler); |
275 int requiredParameterCount = parameters.requiredParameterCount; | 275 int requiredParameterCount = parameters.requiredParameterCount; |
276 int optionalParameterCount = parameters.optionalParameterCount; | 276 int optionalParameterCount = parameters.optionalParameterCount; |
277 | 277 |
278 bool hasOptionalParameters = !parameters.optionalParameters.isEmpty(); | 278 bool hasOptionalParameters = !parameters.optionalParameters.isEmpty; |
279 if (namedArguments.isEmpty()) { | 279 if (namedArguments.isEmpty) { |
280 if (!hasOptionalParameters) { | 280 if (!hasOptionalParameters) { |
281 return requiredParameterCount == argumentCount; | 281 return requiredParameterCount == argumentCount; |
282 } else { | 282 } else { |
283 return argumentCount >= requiredParameterCount && | 283 return argumentCount >= requiredParameterCount && |
284 argumentCount <= requiredParameterCount + optionalParameterCount; | 284 argumentCount <= requiredParameterCount + optionalParameterCount; |
285 } | 285 } |
286 } else { | 286 } else { |
287 if (!hasOptionalParameters) return false; | 287 if (!hasOptionalParameters) return false; |
288 Link<Element> remainingNamedParameters = parameters.optionalParameters; | 288 Link<Element> remainingNamedParameters = parameters.optionalParameters; |
289 for (int i = requiredParameterCount; i < positionalArgumentCount; i++) { | 289 for (int i = requiredParameterCount; i < positionalArgumentCount; i++) { |
290 remainingNamedParameters = remainingNamedParameters.tail; | 290 remainingNamedParameters = remainingNamedParameters.tail; |
291 } | 291 } |
292 Set<SourceString> nameSet = new Set<SourceString>(); | 292 Set<SourceString> nameSet = new Set<SourceString>(); |
293 for (; | 293 for (; |
294 !remainingNamedParameters.isEmpty(); | 294 !remainingNamedParameters.isEmpty; |
295 remainingNamedParameters = remainingNamedParameters.tail) { | 295 remainingNamedParameters = remainingNamedParameters.tail) { |
296 nameSet.add(remainingNamedParameters.head.name); | 296 nameSet.add(remainingNamedParameters.head.name); |
297 } | 297 } |
298 | 298 |
299 for (SourceString name in namedArguments) { | 299 for (SourceString name in namedArguments) { |
300 if (!nameSet.contains(name)) { | 300 if (!nameSet.contains(name)) { |
301 return false; | 301 return false; |
302 } | 302 } |
303 nameSet.remove(name); | 303 nameSet.remove(name); |
304 } | 304 } |
(...skipping 16 matching lines...) Expand all Loading... |
321 | 321 |
322 // Visit positional arguments and add them to the list. | 322 // Visit positional arguments and add them to the list. |
323 for (int i = parameters.requiredParameterCount; | 323 for (int i = parameters.requiredParameterCount; |
324 i < positionalArgumentCount; | 324 i < positionalArgumentCount; |
325 arguments = arguments.tail, i++) { | 325 arguments = arguments.tail, i++) { |
326 list.add(compileArgument(arguments.head)); | 326 list.add(compileArgument(arguments.head)); |
327 } | 327 } |
328 | 328 |
329 // Visit named arguments and add them into a temporary list. | 329 // Visit named arguments and add them into a temporary list. |
330 List compiledNamedArguments = []; | 330 List compiledNamedArguments = []; |
331 for (; !arguments.isEmpty(); arguments = arguments.tail) { | 331 for (; !arguments.isEmpty; arguments = arguments.tail) { |
332 NamedArgument namedArgument = arguments.head; | 332 NamedArgument namedArgument = arguments.head; |
333 compiledNamedArguments.add(compileArgument(namedArgument.expression)); | 333 compiledNamedArguments.add(compileArgument(namedArgument.expression)); |
334 } | 334 } |
335 | 335 |
336 Link<Element> remainingNamedParameters = parameters.optionalParameters; | 336 Link<Element> remainingNamedParameters = parameters.optionalParameters; |
337 // Skip the optional parameters that have been given in the | 337 // Skip the optional parameters that have been given in the |
338 // positional arguments. | 338 // positional arguments. |
339 for (int i = parameters.requiredParameterCount; | 339 for (int i = parameters.requiredParameterCount; |
340 i < positionalArgumentCount; | 340 i < positionalArgumentCount; |
341 i++) { | 341 i++) { |
342 remainingNamedParameters = remainingNamedParameters.tail; | 342 remainingNamedParameters = remainingNamedParameters.tail; |
343 } | 343 } |
344 | 344 |
345 // Loop over the remaining named parameters, and try to find | 345 // Loop over the remaining named parameters, and try to find |
346 // their values: either in the temporary list or using the | 346 // their values: either in the temporary list or using the |
347 // default value. | 347 // default value. |
348 for (; | 348 for (; |
349 !remainingNamedParameters.isEmpty(); | 349 !remainingNamedParameters.isEmpty; |
350 remainingNamedParameters = remainingNamedParameters.tail) { | 350 remainingNamedParameters = remainingNamedParameters.tail) { |
351 Element parameter = remainingNamedParameters.head; | 351 Element parameter = remainingNamedParameters.head; |
352 int foundIndex = namedArguments.indexOf(parameter.name); | 352 int foundIndex = namedArguments.indexOf(parameter.name); |
353 if (foundIndex != -1) { | 353 if (foundIndex != -1) { |
354 list.add(compiledNamedArguments[foundIndex]); | 354 list.add(compiledNamedArguments[foundIndex]); |
355 } else { | 355 } else { |
356 list.add(compileConstant(parameter)); | 356 list.add(compileConstant(parameter)); |
357 } | 357 } |
358 } | 358 } |
359 } | 359 } |
(...skipping 22 matching lines...) Expand all Loading... |
382 | 382 |
383 if (!parameters.optionalParametersAreNamed) { | 383 if (!parameters.optionalParametersAreNamed) { |
384 // TODO(5074): Remove this check once we don't accept the | 384 // TODO(5074): Remove this check once we don't accept the |
385 // deprecated parameter specification. | 385 // deprecated parameter specification. |
386 if (!Compiler.REJECT_NAMED_ARGUMENT_AS_POSITIONAL) { | 386 if (!Compiler.REJECT_NAMED_ARGUMENT_AS_POSITIONAL) { |
387 addOptionalArgumentsToListDEPRECATED( | 387 addOptionalArgumentsToListDEPRECATED( |
388 arguments, list, element, compileArgument, compileConstant, | 388 arguments, list, element, compileArgument, compileConstant, |
389 compiler); | 389 compiler); |
390 } else { | 390 } else { |
391 parameters.forEachOptionalParameter((element) { | 391 parameters.forEachOptionalParameter((element) { |
392 if (!arguments.isEmpty()) { | 392 if (!arguments.isEmpty) { |
393 list.add(compileArgument(arguments.head)); | 393 list.add(compileArgument(arguments.head)); |
394 arguments = arguments.tail; | 394 arguments = arguments.tail; |
395 } else { | 395 } else { |
396 list.add(compileConstant(element)); | 396 list.add(compileConstant(element)); |
397 } | 397 } |
398 }); | 398 }); |
399 } | 399 } |
400 } else { | 400 } else { |
401 // Visit named arguments and add them into a temporary list. | 401 // Visit named arguments and add them into a temporary list. |
402 List compiledNamedArguments = []; | 402 List compiledNamedArguments = []; |
403 for (; !arguments.isEmpty(); arguments = arguments.tail) { | 403 for (; !arguments.isEmpty; arguments = arguments.tail) { |
404 NamedArgument namedArgument = arguments.head; | 404 NamedArgument namedArgument = arguments.head; |
405 compiledNamedArguments.add(compileArgument(namedArgument.expression)); | 405 compiledNamedArguments.add(compileArgument(namedArgument.expression)); |
406 } | 406 } |
407 // Iterate over the optional parameters of the signature, and try to | 407 // Iterate over the optional parameters of the signature, and try to |
408 // find them in [compiledNamedArguments]. If found, we use the | 408 // find them in [compiledNamedArguments]. If found, we use the |
409 // value in the temporary list, otherwise the default value. | 409 // value in the temporary list, otherwise the default value. |
410 parameters.orderedOptionalParameters.forEach((element) { | 410 parameters.orderedOptionalParameters.forEach((element) { |
411 int foundIndex = namedArguments.indexOf(element.name); | 411 int foundIndex = namedArguments.indexOf(element.name); |
412 if (foundIndex != -1) { | 412 if (foundIndex != -1) { |
413 list.add(compiledNamedArguments[foundIndex]); | 413 list.add(compiledNamedArguments[foundIndex]); |
(...skipping 20 matching lines...) Expand all Loading... |
434 | 434 |
435 bool equalsUntyped(Selector other) { | 435 bool equalsUntyped(Selector other) { |
436 return name == other.name | 436 return name == other.name |
437 && identical(library, other.library) | 437 && identical(library, other.library) |
438 && argumentCount == other.argumentCount | 438 && argumentCount == other.argumentCount |
439 && namedArguments.length == other.namedArguments.length | 439 && namedArguments.length == other.namedArguments.length |
440 && sameNames(namedArguments, other.namedArguments); | 440 && sameNames(namedArguments, other.namedArguments); |
441 } | 441 } |
442 | 442 |
443 List<SourceString> getOrderedNamedArguments() { | 443 List<SourceString> getOrderedNamedArguments() { |
444 if (namedArguments.isEmpty()) return namedArguments; | 444 if (namedArguments.isEmpty) return namedArguments; |
445 if (!orderedNamedArguments.isEmpty()) return orderedNamedArguments; | 445 if (!orderedNamedArguments.isEmpty) return orderedNamedArguments; |
446 | 446 |
447 orderedNamedArguments.addAll(namedArguments); | 447 orderedNamedArguments.addAll(namedArguments); |
448 orderedNamedArguments.sort((SourceString first, SourceString second) { | 448 orderedNamedArguments.sort((SourceString first, SourceString second) { |
449 return first.slowToString().compareTo(second.slowToString()); | 449 return first.slowToString().compareTo(second.slowToString()); |
450 }); | 450 }); |
451 return orderedNamedArguments; | 451 return orderedNamedArguments; |
452 } | 452 } |
453 | 453 |
454 String namedArgumentsToString() { | 454 String namedArgumentsToString() { |
455 if (namedArgumentCount > 0) { | 455 if (namedArgumentCount > 0) { |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 | 529 |
530 if (!self.isInterface() && self.isSubclassOf(other)) { | 530 if (!self.isInterface() && self.isSubclassOf(other)) { |
531 // Resolve an invocation of [element.name] on [self]. If it | 531 // Resolve an invocation of [element.name] on [self]. If it |
532 // is found, this selector is a candidate. | 532 // is found, this selector is a candidate. |
533 return hasElementIn(self, element) && appliesUntyped(element, compiler); | 533 return hasElementIn(self, element) && appliesUntyped(element, compiler); |
534 } | 534 } |
535 | 535 |
536 return false; | 536 return false; |
537 } | 537 } |
538 } | 538 } |
OLD | NEW |