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

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: Remove dangling TODO Created 5 years, 4 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
« no previous file with comments | « lib/runtime/dart_utils.js ('k') | test/codegen/expect/fieldtest.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/src/codegen/js_codegen.dart
diff --git a/lib/src/codegen/js_codegen.dart b/lib/src/codegen/js_codegen.dart
index ddae19b24c3543d687b667429682bfb141f4fe3f..bb73a3cb104db8624875837fc86061c2952b312c 100644
--- a/lib/src/codegen/js_codegen.dart
+++ b/lib/src/codegen/js_codegen.dart
@@ -509,6 +509,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
result.add(js.statement('#.values = dart.const(dart.list(#, #));',
[id, values, _emitTypeName(type)]));
+ if (isPublic(type.name)) _addExport(type.name);
return _statement(result);
}
@@ -751,7 +752,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);
@@ -794,6 +795,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
]));
}
+ // TODO(vsm): Make this optional per #268.
// Metadata
if (metadata.isNotEmpty) {
body.add(js.statement('#[dart.metadata] = () => #;', [
@@ -1479,9 +1481,27 @@ 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)));
+ List<Annotation> _parameterMetadata(FormalParameter p) =>
+ (p is NormalFormalParameter)
+ ? p.metadata
+ : (p as DefaultFormalParameter).parameter.metadata;
+
+ JS.ArrayInitializer _emitTypeNames(List<DartType> types,
+ [List<FormalParameter> parameters]) {
+ var result = <JS.Expression>[];
+ for (int i = 0; i < types.length; ++i) {
+ var metadata =
+ parameters != null ? _parameterMetadata(parameters[i]) : [];
+ var typeName = _emitTypeName(types[i]);
+ var value = typeName;
+ // TODO(vsm): Make this optional per #268.
+ 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) {
@@ -1496,21 +1516,25 @@ 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]) {
+ var parameters = parameterList?.parameters;
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?.sublist(parameterTypes.length));
return [rt, ra, oa];
}
return [rt, ra];
@@ -1694,7 +1718,7 @@ 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(#.#, #)';
« no previous file with comments | « lib/runtime/dart_utils.js ('k') | test/codegen/expect/fieldtest.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698