Chromium Code Reviews| 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 |