Chromium Code Reviews| Index: pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart |
| diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart |
| index 5f5543926f33ac58d5bc4687c708fa304cfcba9e..ef7b8dafc4c6decbf0480ab9de8bf3d22f379873 100644 |
| --- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart |
| +++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart |
| @@ -30,7 +30,9 @@ import '../../constants/values.dart' show |
| import '../../core_types.dart' show |
| CoreClasses; |
| import '../../dart_types.dart' show |
| - DartType; |
| + DartType, |
| + FunctionType, |
| + TypedefType; |
| import '../../elements/elements.dart' show |
| ClassElement, |
| Element, |
| @@ -38,6 +40,7 @@ import '../../elements/elements.dart' show |
| FieldElement, |
| FunctionElement, |
| FunctionSignature, |
| + GetterElement, |
| LibraryElement, |
| MethodElement, |
| Name, |
| @@ -407,7 +410,45 @@ class ProgramBuilder { |
| } |
| } |
| + bool isFunctionLike = false; |
| + FunctionType functionType; |
| + |
| if (member.isFunction) { |
| + FunctionElement fn = member; |
| + functionType = fn.type; |
| + } 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.
|
| + if (_compiler.trustTypeAnnotations) { |
| + GetterElement getter = member; |
| + DartType returnType = getter.type.returnType; |
| + if (returnType.isFunctionType) { |
| + functionType = returnType; |
| + } else if (_compiler.types.isSubtype(returnType, |
| + backend.coreTypes.functionType) || |
| + returnType.treatAsDynamic) { |
| + if (returnType.isTypedef) { |
| + TypedefType typedef = returnType; |
| + functionType = typedef.element.functionSignature.type; |
|
Siggi Cherem (dart-lang)
2015/10/30 20:14:57
actually, I think here you can do `typedef.unalias
|
| + } else { |
| + // Other misc function type such as coreTypes.Function. |
| + // Allow any number of arguments. |
| + isFunctionLike = true; |
| + } |
| + } |
| + } else { |
| + isFunctionLike = true; |
| + } |
| + } // TODO(jacobr): handle field elements. |
| + |
| + if (isFunctionLike || functionType != null) { |
| + int minArgs; |
| + int maxArgs; |
| + if (functionType != null) { |
| + minArgs = functionType.parameterTypes.length; |
| + maxArgs = minArgs + functionType.optionalParameterTypes.length; |
| + } else { |
| + minArgs = 0; |
| + maxArgs = 32767; |
| + } |
| var selectors = |
| _compiler.codegenWorld.invocationsByName(member.name); |
| FunctionElement fn = member; |
| @@ -418,15 +459,14 @@ class ProgramBuilder { |
| for (var selector in selectors.keys) { |
| // Check whether the arity matches this member. |
| var argumentCount = selector.argumentCount; |
| - if (argumentCount > fn.parameters.length) break; |
| - if (argumentCount < fn.parameters.length && |
| - !fn.parameters[argumentCount].isOptional) break; |
| + // JS interop does not support named arguments. |
| + if (selector.namedArgumentCount > 0) break; |
| + if (argumentCount < minArgs) break; |
| + if (argumentCount > maxArgs) break; |
| var stubName = namer.invocationName(selector); |
| if (!stubNames.add(stubName.key)) break; |
| - var candidateParameterNames = |
| - 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMOPQRSTUVWXYZ'; |
| var parameters = new List<String>.generate(argumentCount, |
| - (i) => candidateParameterNames[i]); |
| + (i) => 'p$i'); |
| interceptorClass.callStubs.add(_buildStubMethod( |
| stubName, |