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

Side by Side Diff: lib/src/codegen/js_codegen.dart

Issue 1224083017: Add support for Enums (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 unified diff | Download patch
« no previous file with comments | « no previous file | test/codegen/expect/fieldtest.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library dev_compiler.src.codegen.js_codegen; 5 library dev_compiler.src.codegen.js_codegen;
6 6
7 import 'dart:collection' show HashSet, HashMap, SplayTreeSet; 7 import 'dart:collection' show HashSet, HashMap, SplayTreeSet;
8 8
9 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator; 9 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator;
10 import 'package:analyzer/src/generated/ast.dart' hide ConstantEvaluator; 10 import 'package:analyzer/src/generated/ast.dart' hide ConstantEvaluator;
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 'dart.registerExtension(dart.global.#, #);', [ 413 'dart.registerExtension(dart.global.#, #);', [
414 _propertyName(jsPeerName), 414 _propertyName(jsPeerName),
415 classElem.name 415 classElem.name
416 ]); 416 ]);
417 return _statement([result, copyMembers]); 417 return _statement([result, copyMembers]);
418 } 418 }
419 return result; 419 return result;
420 } 420 }
421 421
422 @override 422 @override
423 JS.Statement visitEnumDeclaration(EnumDeclaration node) => 423 JS.Statement visitEnumDeclaration(EnumDeclaration node) {
424 _unimplementedCall("Unimplemented enum: $node").toStatement(); 424 var element = node.element;
425 var type = element.type;
426 var name = js.string(type.name);
427
428 // Generate a class per section 13 of the spec.
429 // TODO(vsm): Generate any accompanying metadata
430
431 // Create constructor and initialize index
432 var constructor =
433 new JS.Method(name, js.call('function(index) { this.index = index; }'));
434 var fields = new List<ConstFieldElementImpl>.from(
435 element.fields.where((f) => f.type == type));
436
437 // Create toString() method
438 var properties = new List<JS.Property>();
439 for (var i = 0; i < fields.length; ++i) {
440 properties.add(new JS.Property(
441 js.number(i), js.string('${type.name}.${fields[i].name}')));
442 }
443 var nameMap = new JS.ObjectInitializer(properties, multiline: true);
444 var toStringF = new JS.Method(js.string('toString'),
445 js.call('function () { return #[this.index]; }', nameMap));
446
447 // Create enum class
448 var classExpr = new JS.ClassExpression(new JS.Identifier(type.name),
449 _classHeritage(element), [constructor, toStringF]);
450 var result = [js.statement('#', classExpr)];
451
452 // Create static fields for each enum value
453 for (var i = 0; i < fields.length; ++i) {
454 result.add(js.statement(
455 '${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.
456 }
457
458 // Create static values list
459 var values = new JS.ArrayInitializer(
460 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.
461 result.add(js.statement(
462 '${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.
463 values,
464 _emitTypeName(type)
465 ]));
466
467 return _statement(result);
468 }
425 469
426 /// Given a class element and body, complete the class declaration. 470 /// Given a class element and body, complete the class declaration.
427 /// This handles generic type parameters, laziness (in library-cycle cases), 471 /// This handles generic type parameters, laziness (in library-cycle cases),
428 /// and ensuring dependencies are loaded first. 472 /// and ensuring dependencies are loaded first.
429 JS.Statement _finishClassDef(ParameterizedType type, JS.Statement body) { 473 JS.Statement _finishClassDef(ParameterizedType type, JS.Statement body) {
430 var name = type.name; 474 var name = type.name;
431 var genericName = '$name\$'; 475 var genericName = '$name\$';
432 476
433 JS.Statement genericDef = null; 477 JS.Statement genericDef = null;
434 if (type.typeParameters.isNotEmpty) { 478 if (type.typeParameters.isNotEmpty) {
(...skipping 2388 matching lines...) Expand 10 before | Expand all | Expand 10 after
2823 2867
2824 class _JsThisFinder extends JS.BaseVisitor { 2868 class _JsThisFinder extends JS.BaseVisitor {
2825 bool found = false; 2869 bool found = false;
2826 visitThis(JS.This node) { 2870 visitThis(JS.This node) {
2827 found = true; 2871 found = true;
2828 } 2872 }
2829 visitNode(JS.Node node) { 2873 visitNode(JS.Node node) {
2830 if (!found) super.visitNode(node); 2874 if (!found) super.visitNode(node);
2831 } 2875 }
2832 } 2876 }
OLDNEW
« no previous file with comments | « no previous file | test/codegen/expect/fieldtest.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698