| 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 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 ModuleItemLoadOrder _loader; | 98 ModuleItemLoadOrder _loader; |
| 99 | 99 |
| 100 /// _interceptors.JSArray<E>, used for List literals. | 100 /// _interceptors.JSArray<E>, used for List literals. |
| 101 ClassElement _jsArray; | 101 ClassElement _jsArray; |
| 102 | 102 |
| 103 /// The default value of the module object. See [visitLibraryDirective]. | 103 /// The default value of the module object. See [visitLibraryDirective]. |
| 104 String _jsModuleValue; | 104 String _jsModuleValue; |
| 105 | 105 |
| 106 Map<String, DartType> _objectMembers; | 106 Map<String, DartType> _objectMembers; |
| 107 | 107 |
| 108 JSCodegenVisitor(AbstractCompiler compiler, this.currentLibrary, | 108 JSCodegenVisitor(AbstractCompiler compiler, this.rules, this.currentLibrary, |
| 109 this._extensionTypes, this._fieldsNeedingStorage) | 109 this._extensionTypes, this._fieldsNeedingStorage) |
| 110 : compiler = compiler, | 110 : compiler = compiler, |
| 111 options = compiler.options.codegenOptions, | 111 options = compiler.options.codegenOptions, |
| 112 rules = compiler.rules, | |
| 113 _types = compiler.context.typeProvider { | 112 _types = compiler.context.typeProvider { |
| 114 _loader = new ModuleItemLoadOrder(_emitModuleItem); | 113 _loader = new ModuleItemLoadOrder(_emitModuleItem); |
| 115 | 114 |
| 116 var context = compiler.context; | 115 var context = compiler.context; |
| 117 var src = context.sourceFactory.forUri('dart:_interceptors'); | 116 var src = context.sourceFactory.forUri('dart:_interceptors'); |
| 118 var interceptors = context.computeLibraryElement(src); | 117 var interceptors = context.computeLibraryElement(src); |
| 119 _jsArray = interceptors.getType('JSArray'); | 118 _jsArray = interceptors.getType('JSArray'); |
| 120 | 119 |
| 121 _objectMembers = getObjectMemberMap(types); | 120 _objectMembers = getObjectMemberMap(types); |
| 122 } | 121 } |
| 123 | 122 |
| 124 TypeProvider get types => rules.provider; | 123 TypeProvider get types => rules.provider; |
| 125 | 124 |
| 126 JS.Program emitLibrary(LibraryUnit library) { | 125 JS.Program emitLibrary(LibraryUnit library) { |
| 127 // Modify the AST to make coercions explicit. | 126 // Modify the AST to make coercions explicit. |
| 128 new CoercionReifier(library, compiler).reify(); | 127 new CoercionReifier(library, rules).reify(); |
| 129 | 128 |
| 130 // Build the public namespace for this library. This allows us to do | 129 // Build the public namespace for this library. This allows us to do |
| 131 // constant time lookups (contrast with `Element.getChild(name)`). | 130 // constant time lookups (contrast with `Element.getChild(name)`). |
| 132 if (currentLibrary.publicNamespace == null) { | 131 if (currentLibrary.publicNamespace == null) { |
| 133 (currentLibrary as LibraryElementImpl).publicNamespace = | 132 (currentLibrary as LibraryElementImpl).publicNamespace = |
| 134 new PublicNamespaceBuilder().build(currentLibrary); | 133 new PublicNamespaceBuilder().build(currentLibrary); |
| 135 } | 134 } |
| 136 | 135 |
| 137 library.library.directives.forEach(_visit); | 136 library.library.directives.forEach(_visit); |
| 138 | 137 |
| (...skipping 3134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3273 t.mixins.forEach(_addExtensionType); | 3272 t.mixins.forEach(_addExtensionType); |
| 3274 _addExtensionType(t.superclass); | 3273 _addExtensionType(t.superclass); |
| 3275 } | 3274 } |
| 3276 | 3275 |
| 3277 String generateLibrary(LibraryUnit unit) { | 3276 String generateLibrary(LibraryUnit unit) { |
| 3278 // Clone the AST first, so we can mutate it. | 3277 // Clone the AST first, so we can mutate it. |
| 3279 unit = unit.clone(); | 3278 unit = unit.clone(); |
| 3280 var library = unit.library.element.library; | 3279 var library = unit.library.element.library; |
| 3281 var fields = findFieldsNeedingStorage(unit); | 3280 var fields = findFieldsNeedingStorage(unit); |
| 3282 var codegen = | 3281 var codegen = |
| 3283 new JSCodegenVisitor(compiler, library, _extensionTypes, fields); | 3282 new JSCodegenVisitor(compiler, rules, library, _extensionTypes, fields); |
| 3284 var module = codegen.emitLibrary(unit); | 3283 var module = codegen.emitLibrary(unit); |
| 3285 var out = compiler.getOutputPath(library.source.uri); | 3284 var out = compiler.getOutputPath(library.source.uri); |
| 3286 return writeJsLibrary(module, out, | 3285 return writeJsLibrary(module, out, |
| 3287 emitSourceMaps: options.emitSourceMaps, | 3286 emitSourceMaps: options.emitSourceMaps, |
| 3288 arrowFnBindThisWorkaround: options.arrowFnBindThisWorkaround); | 3287 arrowFnBindThisWorkaround: options.arrowFnBindThisWorkaround); |
| 3289 } | 3288 } |
| 3290 } | 3289 } |
| 3291 | 3290 |
| 3292 /// Choose a canonical name from the library element. | 3291 /// Choose a canonical name from the library element. |
| 3293 /// This never uses the library's name (the identifier in the `library` | 3292 /// This never uses the library's name (the identifier in the `library` |
| (...skipping 19 matching lines...) Expand all Loading... |
| 3313 | 3312 |
| 3314 /// A special kind of element created by the compiler, signifying a temporary | 3313 /// A special kind of element created by the compiler, signifying a temporary |
| 3315 /// variable. These objects use instance equality, and should be shared | 3314 /// variable. These objects use instance equality, and should be shared |
| 3316 /// everywhere in the tree where they are treated as the same variable. | 3315 /// everywhere in the tree where they are treated as the same variable. |
| 3317 class TemporaryVariableElement extends LocalVariableElementImpl { | 3316 class TemporaryVariableElement extends LocalVariableElementImpl { |
| 3318 TemporaryVariableElement.forNode(Identifier name) : super.forNode(name); | 3317 TemporaryVariableElement.forNode(Identifier name) : super.forNode(name); |
| 3319 | 3318 |
| 3320 int get hashCode => identityHashCode(this); | 3319 int get hashCode => identityHashCode(this); |
| 3321 bool operator ==(Object other) => identical(this, other); | 3320 bool operator ==(Object other) => identical(this, other); |
| 3322 } | 3321 } |
| OLD | NEW |