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

Unified Diff: lib/src/codegen/js_codegen.dart

Issue 1252953003: Implement more of dart:mirrors (Closed) Base URL: https://github.com/dart-lang/dev_compiler.git@master
Patch Set: Created 5 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: lib/src/codegen/js_codegen.dart
diff --git a/lib/src/codegen/js_codegen.dart b/lib/src/codegen/js_codegen.dart
index 608628ea1af0dbea81b5dc626514f7ff42d5ebd1..d6aa7741403150b4fb84fcc60608ccb43fc35461 100644
--- a/lib/src/codegen/js_codegen.dart
+++ b/lib/src/codegen/js_codegen.dart
@@ -464,6 +464,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
_emitTypeName(type)
]));
+ if (isPublic(type.name)) _addExport(type.name);
return _statement(result);
}
@@ -717,7 +718,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
for (ConstructorDeclaration node in ctors) {
var memberName = _constructorName(node.element);
var element = node.element;
- var parts = _emitFunctionTypeParts(element.type);
+ var parts = _emitFunctionTypeParts(element.type, node.parameters);
var property =
new JS.Property(memberName, new JS.ArrayInitializer(parts));
tCtors.add(property);
@@ -1385,9 +1386,25 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
JS.TemporaryId _getTemp(Element key, String name) =>
_temps.putIfAbsent(key, () => new JS.TemporaryId(name));
- JS.ArrayInitializer _emitTypeNames(List<DartType> types) {
- return new JS.ArrayInitializer(
- new List<JS.Expression>.from(types.map(_emitTypeName)));
+ JS.ArrayInitializer _emitTypeNames(List<DartType> types,
Jennifer Messerly 2015/07/24 16:28:28 thought for future: should we only emit mirrors un
vsm 2015/08/07 17:07:32 Makes sense. Added a comment.
+ [List<FormalParameter> parameters]) {
+ var result = <JS.Expression>[];
+ for (int i = 0; i < types.length; ++i) {
+ var parameter = parameters != null ? parameters[i] : null;
Jennifer Messerly 2015/07/24 16:28:28 parameters[i] will never be null right? i'd be tem
vsm 2015/08/07 17:07:32 Done.
+ var metadata = parameter != null
+ ? parameter is NormalFormalParameter
+ ? parameter.metadata
+ : (parameter as DefaultFormalParameter).parameter.metadata
Jennifer Messerly 2015/07/24 16:28:28 hmm, this might be good feedback to analyzer. Woul
vsm 2015/08/07 17:07:32 Factored it out a bit to a helper here. A forward
+ : [];
+ var typeName = _emitTypeName(types[i]);
+ var value = typeName;
+ if (metadata.isNotEmpty) {
+ metadata = metadata.map(_instantiateAnnotation).toList();
+ value = new JS.ArrayInitializer([typeName]..addAll(metadata));
+ }
+ result.add(value);
+ }
+ return new JS.ArrayInitializer(result);
}
JS.ObjectInitializer _emitTypeProperties(Map<String, DartType> types) {
@@ -1402,21 +1419,27 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
/// Emit the pieces of a function type, as an array of return type,
/// regular args, and optional/named args.
- List<JS.Expression> _emitFunctionTypeParts(FunctionType type) {
+ List<JS.Expression> _emitFunctionTypeParts(FunctionType type,
+ [FormalParameterList parameterList]) {
+ List<FormalParameter> parameters =
Jennifer Messerly 2015/07/24 16:28:28 should this be: var parameters = parameterLis
vsm 2015/08/07 17:07:32 Done.
+ parameterList != null ? parameterList.parameters : null;
var returnType = type.returnType;
var parameterTypes = type.normalParameterTypes;
var optionalTypes = type.optionalParameterTypes;
var namedTypes = type.namedParameterTypes;
var rt = _emitTypeName(returnType);
- var ra = _emitTypeNames(parameterTypes);
+ var ra = _emitTypeNames(parameterTypes, parameters);
if (!namedTypes.isEmpty) {
assert(optionalTypes.isEmpty);
+ // TODO(vsm): Pass in annotations here as well.
var na = _emitTypeProperties(namedTypes);
return [rt, ra, na];
}
if (!optionalTypes.isEmpty) {
assert(namedTypes.isEmpty);
- var oa = _emitTypeNames(optionalTypes);
+ var oa = _emitTypeNames(optionalTypes, parameters != null
Jennifer Messerly 2015/07/24 16:28:28 ditto: parameters?.sublist(parameterTypes.len
vsm 2015/08/07 17:07:32 Done.
+ ? parameters.sublist(parameterTypes.length)
+ : null);
return [rt, ra, oa];
}
return [rt, ra];
@@ -1601,10 +1624,11 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
if (DynamicInvoke.get(target)) {
code = 'dart.$DSEND(#, #, #)';
} else if (DynamicInvoke.get(node.methodName)) {
- // This is a dynamic call to a statically know target. For example:
+ // This is a dynamic call to a statically known target. For example:
// class Foo { Function bar; }
// new Foo().bar(); // dynamic call
code = 'dart.$DCALL(#.#, #)';
+ // code = 'dart.$DSEND(#, #, #)';
Jennifer Messerly 2015/07/24 16:28:28 remove commented code?
vsm 2015/08/07 17:07:32 Done.
vsm 2015/08/07 17:07:32 Done.
} else if (_requiresStaticDispatch(target, name)) {
assert(rules.objectMembers[name] is FunctionType);
// Object methods require a helper for null checks.

Powered by Google App Engine
This is Rietveld 408576698