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..aab09c46bfbd2152d1d406624e52e24e56a6e9ec 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,39 @@ class ProgramBuilder { |
} |
} |
+ bool isFunctionLike = false; |
+ FunctionType functionType; |
+ |
if (member.isFunction) { |
+ FunctionElement fn = member; |
+ functionType = fn.type; |
+ } else if (member.isGetter) { |
+ GetterElement getter = member; |
+ DartType returnType = getter.type.returnType; |
+ if (returnType.isFunctionType) { |
+ functionType = returnType; |
+ } else if (_compiler.types.isSubtype(returnType, backend.coreTypes.functionType)) { |
Siggi Cherem (dart-lang)
2015/10/30 16:59:57
Like we chatted in person, let's do 2 small change
Siggi Cherem (dart-lang)
2015/10/30 17:00:49
Another idea here would be to ask users to annotat
Jacob
2015/10/30 19:47:17
NOOOO. 1. this means the analyzer can't do error
|
+ if (returnType.isTypedef) { |
+ TypedefType typedef = returnType; |
+ functionType = typedef.element.functionSignature.type; |
+ } else { |
+ // Other misc function type such as coreTypes.Function. |
+ // Allow any number of arguments. |
+ 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 = 1000; |
Siggi Cherem (dart-lang)
2015/10/30 16:59:57
what if I want 1001!? ;-)
Jacob
2015/10/30 19:47:17
discussed offline. switched to 32767
also cleaned
|
+ } |
var selectors = |
_compiler.codegenWorld.invocationsByName(member.name); |
FunctionElement fn = member; |
@@ -418,9 +453,10 @@ 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 = |