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..4560a8c7d7117a54dced15e847afd3cc888223b4 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,41 @@ class ProgramBuilder { |
} |
} |
+ bool isFunctionLike = false; |
sra1
2015/10/30 20:54:59
Explain (comment) that this is generating stubs fo
Jacob
2015/10/30 22:31:53
Done.
|
+ FunctionType functionType; |
sra1
2015/10/30 20:54:59
I like to add = null if it is not set one some pat
Jacob
2015/10/30 22:31:53
Done.
|
+ |
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) || |
+ returnType.treatAsDynamic) { |
sra1
2015/10/30 20:54:59
Horrible indentation. If it is the formatter, can
Jacob
2015/10/30 22:31:53
done. shame line length isn't 100.
|
+ 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 = 32767; |
+ } |
var selectors = |
_compiler.codegenWorld.invocationsByName(member.name); |
FunctionElement fn = member; |
sra1
2015/10/30 20:54:59
'fn' unused below. Will fail if you TODO handle f
Jacob
2015/10/30 22:31:53
done. forgot to remove this.
|
@@ -418,15 +455,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'); |
Siggi Cherem (dart-lang)
2015/10/30 19:54:17
you could also keep the old naming scheme to optim
Jacob
2015/10/30 22:31:53
not needed. these names will be minified anyway so
|
interceptorClass.callStubs.add(_buildStubMethod( |
stubName, |
sra1
2015/10/30 20:54:59
Do you get duplicate stubs?
Jacob
2015/10/30 22:31:53
no because of
if (!stubNames.add(stubName.key)) b
|