OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |