Chromium Code Reviews| Index: lib/src/codegen/js_codegen.dart |
| diff --git a/lib/src/codegen/js_codegen.dart b/lib/src/codegen/js_codegen.dart |
| index 1eab31a1d0a5ac6acd9e24d86159018afcde097b..41d48cc08023a463b9219aca730e7b3367c57b76 100644 |
| --- a/lib/src/codegen/js_codegen.dart |
| +++ b/lib/src/codegen/js_codegen.dart |
| @@ -420,8 +420,52 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
| } |
| @override |
| - JS.Statement visitEnumDeclaration(EnumDeclaration node) => |
| - _unimplementedCall("Unimplemented enum: $node").toStatement(); |
| + JS.Statement visitEnumDeclaration(EnumDeclaration node) { |
| + var element = node.element; |
| + var type = element.type; |
| + var name = js.string(type.name); |
| + |
| + // Generate a class per section 13 of the spec. |
| + // TODO(vsm): Generate any accompanying metadata |
| + |
| + // Create constructor and initialize index |
| + var constructor = |
| + new JS.Method(name, js.call('function(index) { this.index = index; }')); |
| + var fields = new List<ConstFieldElementImpl>.from( |
| + element.fields.where((f) => f.type == type)); |
| + |
| + // Create toString() method |
| + var properties = new List<JS.Property>(); |
| + for (var i = 0; i < fields.length; ++i) { |
| + properties.add(new JS.Property( |
| + js.number(i), js.string('${type.name}.${fields[i].name}'))); |
| + } |
| + var nameMap = new JS.ObjectInitializer(properties, multiline: true); |
| + var toStringF = new JS.Method(js.string('toString'), |
| + js.call('function () { return #[this.index]; }', nameMap)); |
| + |
| + // Create enum class |
| + var classExpr = new JS.ClassExpression(new JS.Identifier(type.name), |
| + _classHeritage(element), [constructor, toStringF]); |
| + var result = [js.statement('#', classExpr)]; |
| + |
| + // Create static fields for each enum value |
| + for (var i = 0; i < fields.length; ++i) { |
| + result.add(js.statement( |
| + '${type.name}.${fields[i].name} = dart.const(new ${type.name}($i));')); |
|
Jennifer Messerly
2015/07/14 23:57:02
long line ... I think long strings confuse dartfmt
vsm
2015/07/15 00:34:03
Done.
|
| + } |
| + |
| + // Create static values list |
| + var values = new JS.ArrayInitializer( |
| + fields.map((f) => js.call('${type.name}.${f.name}')).toList()); |
|
Jennifer Messerly
2015/07/14 23:57:02
here too: js.call('#.#', type.name, js.string(f.na
vsm
2015/07/15 00:34:03
Done.
|
| + result.add(js.statement( |
| + '${type.name}.values = dart.const(dart.list(#, #));', [ |
|
Jennifer Messerly
2015/07/14 23:57:02
here too. Use #
vsm
2015/07/15 00:34:03
Done.
|
| + values, |
| + _emitTypeName(type) |
| + ])); |
| + |
| + return _statement(result); |
| + } |
| /// Given a class element and body, complete the class declaration. |
| /// This handles generic type parameters, laziness (in library-cycle cases), |