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

Side by Side Diff: lib/compiler/implementation/universe/universe.dart

Issue 10911211: Runtime support for the new parameter specification. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 3 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('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
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();
223 }
224 } else {
225 if (positionalArgumentCount > requiredParameterCount) return false;
226 if (namedArgumentCount > optionalParameterCount) return false;
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
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
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;
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698