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

Side by Side Diff: pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart

Issue 1431523002: Fix behavior when typed JS interop getters are called as functions. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 1 month 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
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 dart2js.js_emitter.program_builder; 5 library dart2js.js_emitter.program_builder;
6 6
7 import '../js_emitter.dart' show 7 import '../js_emitter.dart' show
8 ClassStubGenerator, 8 ClassStubGenerator,
9 CodeEmitterTask, 9 CodeEmitterTask,
10 computeMixinClass, 10 computeMixinClass,
(...skipping 12 matching lines...) Expand all
23 Names, 23 Names,
24 Selectors; 24 Selectors;
25 import '../../compiler.dart' show 25 import '../../compiler.dart' show
26 Compiler; 26 Compiler;
27 import '../../constants/values.dart' show 27 import '../../constants/values.dart' show
28 ConstantValue, 28 ConstantValue,
29 InterceptorConstantValue; 29 InterceptorConstantValue;
30 import '../../core_types.dart' show 30 import '../../core_types.dart' show
31 CoreClasses; 31 CoreClasses;
32 import '../../dart_types.dart' show 32 import '../../dart_types.dart' show
33 DartType; 33 DartType,
34 FunctionType,
35 TypedefType;
34 import '../../elements/elements.dart' show 36 import '../../elements/elements.dart' show
35 ClassElement, 37 ClassElement,
36 Element, 38 Element,
37 Elements, 39 Elements,
38 FieldElement, 40 FieldElement,
39 FunctionElement, 41 FunctionElement,
40 FunctionSignature, 42 FunctionSignature,
43 GetterElement,
41 LibraryElement, 44 LibraryElement,
42 MethodElement, 45 MethodElement,
43 Name, 46 Name,
44 ParameterElement, 47 ParameterElement,
45 TypedefElement, 48 TypedefElement,
46 VariableElement; 49 VariableElement;
47 import '../../js/js.dart' as js; 50 import '../../js/js.dart' as js;
48 import '../../js_backend/backend_helpers.dart' show 51 import '../../js_backend/backend_helpers.dart' show
49 BackendHelpers; 52 BackendHelpers;
50 import '../../js_backend/js_backend.dart' show 53 import '../../js_backend/js_backend.dart' show
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 if (stubNames.add(stubName.key)) { 403 if (stubNames.add(stubName.key)) {
401 interceptorClass.callStubs.add(_buildStubMethod( 404 interceptorClass.callStubs.add(_buildStubMethod(
402 stubName, 405 stubName,
403 js.js('function(obj, v) { return obj.# = v }', 406 js.js('function(obj, v) { return obj.# = v }',
404 [member.name]), 407 [member.name]),
405 element: member)); 408 element: member));
406 } 409 }
407 } 410 }
408 } 411 }
409 412
413 bool isFunctionLike = false;
414 FunctionType functionType;
415
410 if (member.isFunction) { 416 if (member.isFunction) {
417 FunctionElement fn = member;
418 functionType = fn.type;
419 } else if (member.isGetter) {
Siggi Cherem (dart-lang) 2015/10/30 20:14:57 minor nit - up to you: if you only care about Gett
Jacob 2015/10/30 22:31:53 Acknowledged.
420 if (_compiler.trustTypeAnnotations) {
421 GetterElement getter = member;
422 DartType returnType = getter.type.returnType;
423 if (returnType.isFunctionType) {
424 functionType = returnType;
425 } else if (_compiler.types.isSubtype(returnType,
426 backend.coreTypes.functionType) ||
427 returnType.treatAsDynamic) {
428 if (returnType.isTypedef) {
429 TypedefType typedef = returnType;
430 functionType = typedef.element.functionSignature.type;
Siggi Cherem (dart-lang) 2015/10/30 20:14:57 actually, I think here you can do `typedef.unalias
431 } else {
432 // Other misc function type such as coreTypes.Function.
433 // Allow any number of arguments.
434 isFunctionLike = true;
435 }
436 }
437 } else {
438 isFunctionLike = true;
439 }
440 } // TODO(jacobr): handle field elements.
441
442 if (isFunctionLike || functionType != null) {
443 int minArgs;
444 int maxArgs;
445 if (functionType != null) {
446 minArgs = functionType.parameterTypes.length;
447 maxArgs = minArgs + functionType.optionalParameterTypes.length;
448 } else {
449 minArgs = 0;
450 maxArgs = 32767;
451 }
411 var selectors = 452 var selectors =
412 _compiler.codegenWorld.invocationsByName(member.name); 453 _compiler.codegenWorld.invocationsByName(member.name);
413 FunctionElement fn = member; 454 FunctionElement fn = member;
414 // Named arguments are not yet supported. In the future we 455 // Named arguments are not yet supported. In the future we
415 // may want to map named arguments to an object literal containing 456 // may want to map named arguments to an object literal containing
416 // all named arguments. 457 // all named arguments.
417 if (selectors != null && !selectors.isEmpty) { 458 if (selectors != null && !selectors.isEmpty) {
418 for (var selector in selectors.keys) { 459 for (var selector in selectors.keys) {
419 // Check whether the arity matches this member. 460 // Check whether the arity matches this member.
420 var argumentCount = selector.argumentCount; 461 var argumentCount = selector.argumentCount;
421 if (argumentCount > fn.parameters.length) break; 462 // JS interop does not support named arguments.
422 if (argumentCount < fn.parameters.length && 463 if (selector.namedArgumentCount > 0) break;
423 !fn.parameters[argumentCount].isOptional) break; 464 if (argumentCount < minArgs) break;
465 if (argumentCount > maxArgs) break;
424 var stubName = namer.invocationName(selector); 466 var stubName = namer.invocationName(selector);
425 if (!stubNames.add(stubName.key)) break; 467 if (!stubNames.add(stubName.key)) break;
426 var candidateParameterNames =
427 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMOPQRSTUVWXYZ';
428 var parameters = new List<String>.generate(argumentCount, 468 var parameters = new List<String>.generate(argumentCount,
429 (i) => candidateParameterNames[i]); 469 (i) => 'p$i');
430 470
431 interceptorClass.callStubs.add(_buildStubMethod( 471 interceptorClass.callStubs.add(_buildStubMethod(
432 stubName, 472 stubName,
433 js.js('function(receiver, #) { return receiver.#(#) }', 473 js.js('function(receiver, #) { return receiver.#(#) }',
434 [parameters, member.name, parameters]), 474 [parameters, member.name, parameters]),
435 element: member)); 475 element: member));
436 } 476 }
437 } 477 }
438 } 478 }
439 }); 479 });
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
964 Constant constant = new Constant(name, holder, constantValue); 1004 Constant constant = new Constant(name, holder, constantValue);
965 _constants[constantValue] = constant; 1005 _constants[constantValue] = constant;
966 } 1006 }
967 } 1007 }
968 1008
969 Holder _registerStaticStateHolder() { 1009 Holder _registerStaticStateHolder() {
970 return _registry.registerHolder( 1010 return _registry.registerHolder(
971 namer.staticStateHolder, isStaticStateHolder: true); 1011 namer.staticStateHolder, isStaticStateHolder: true);
972 } 1012 }
973 } 1013 }
OLDNEW
« no previous file with comments | « no previous file | tests/html/js_function_getter_test.dart » ('j') | tests/html/js_function_getter_test.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698