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

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

Issue 1263593003: restore arrow function bind this workaround (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 5 years, 4 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 | « lib/runtime/dart/isolate.js ('k') | lib/src/codegen/js_printer.dart » ('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 1271 matching lines...) Expand 10 before | Expand all | Expand 10 after
1282 1282
1283 @override 1283 @override
1284 JS.Statement visitFunctionDeclarationStatement( 1284 JS.Statement visitFunctionDeclarationStatement(
1285 FunctionDeclarationStatement node) { 1285 FunctionDeclarationStatement node) {
1286 var func = node.functionDeclaration; 1286 var func = node.functionDeclaration;
1287 if (func.isGetter || func.isSetter) { 1287 if (func.isGetter || func.isSetter) {
1288 return js.comment('Unimplemented function get/set statement: $node'); 1288 return js.comment('Unimplemented function get/set statement: $node');
1289 } 1289 }
1290 1290
1291 var fn = _visit(func.functionExpression); 1291 var fn = _visit(func.functionExpression);
1292 var jsThis = new _JsThisFinder();
1293 fn.accept(jsThis);
1294 1292
1295 var name = new JS.Identifier(func.name.name); 1293 var name = new JS.Identifier(func.name.name);
1296 JS.Statement declareFn; 1294 JS.Statement declareFn;
1297 if (jsThis.found) { 1295 if (JS.This.foundIn(fn)) {
1298 declareFn = js.statement('let # = #.bind(this);', [name, fn]); 1296 declareFn = js.statement('let # = #.bind(this);', [name, fn]);
1299 } else { 1297 } else {
1300 declareFn = new JS.FunctionDeclaration(name, fn); 1298 declareFn = new JS.FunctionDeclaration(name, fn);
1301 } 1299 }
1302 1300
1303 return new JS.Block([ 1301 return new JS.Block([
1304 declareFn, 1302 declareFn,
1305 _emitFunctionTagged(name, func.element.type).toStatement() 1303 _emitFunctionTagged(name, func.element.type).toStatement()
1306 ]); 1304 ]);
1307 } 1305 }
(...skipping 1509 matching lines...) Expand 10 before | Expand all | Expand 10 after
2817 2815
2818 String generateLibrary(LibraryUnit unit) { 2816 String generateLibrary(LibraryUnit unit) {
2819 // Clone the AST first, so we can mutate it. 2817 // Clone the AST first, so we can mutate it.
2820 unit = unit.clone(); 2818 unit = unit.clone();
2821 var library = unit.library.element.library; 2819 var library = unit.library.element.library;
2822 var fields = findFieldsNeedingStorage(unit); 2820 var fields = findFieldsNeedingStorage(unit);
2823 var codegen = 2821 var codegen =
2824 new JSCodegenVisitor(compiler, library, _extensionTypes, fields); 2822 new JSCodegenVisitor(compiler, library, _extensionTypes, fields);
2825 var module = codegen.emitLibrary(unit); 2823 var module = codegen.emitLibrary(unit);
2826 var out = compiler.getOutputPath(library.source.uri); 2824 var out = compiler.getOutputPath(library.source.uri);
2827 return writeJsLibrary(module, out, emitSourceMaps: options.emitSourceMaps); 2825 return writeJsLibrary(module, out,
2826 emitSourceMaps: options.emitSourceMaps,
2827 arrowFnBindThisWorkaround: options.arrowFnBindThisWorkaround);
2828 } 2828 }
2829 } 2829 }
2830 2830
2831 /// Choose a canonical name from the library element. 2831 /// Choose a canonical name from the library element.
2832 /// This never uses the library's name (the identifier in the `library` 2832 /// This never uses the library's name (the identifier in the `library`
2833 /// declaration) as it doesn't have any meaningful rules enforced. 2833 /// declaration) as it doesn't have any meaningful rules enforced.
2834 String jsLibraryName(LibraryElement library) => canonicalLibraryName(library); 2834 String jsLibraryName(LibraryElement library) => canonicalLibraryName(library);
2835 2835
2836 /// Shorthand for identifier-like property names. 2836 /// Shorthand for identifier-like property names.
2837 /// For now, we emit them as strings and the printer restores them to 2837 /// For now, we emit them as strings and the printer restores them to
(...skipping 14 matching lines...) Expand all
2852 2852
2853 /// A special kind of element created by the compiler, signifying a temporary 2853 /// A special kind of element created by the compiler, signifying a temporary
2854 /// variable. These objects use instance equality, and should be shared 2854 /// variable. These objects use instance equality, and should be shared
2855 /// everywhere in the tree where they are treated as the same variable. 2855 /// everywhere in the tree where they are treated as the same variable.
2856 class TemporaryVariableElement extends LocalVariableElementImpl { 2856 class TemporaryVariableElement extends LocalVariableElementImpl {
2857 TemporaryVariableElement.forNode(Identifier name) : super.forNode(name); 2857 TemporaryVariableElement.forNode(Identifier name) : super.forNode(name);
2858 2858
2859 int get hashCode => identityHashCode(this); 2859 int get hashCode => identityHashCode(this);
2860 bool operator ==(Object other) => identical(this, other); 2860 bool operator ==(Object other) => identical(this, other);
2861 } 2861 }
2862
2863 class _JsThisFinder extends JS.BaseVisitor {
2864 bool found = false;
2865 visitThis(JS.This node) {
2866 found = true;
2867 }
2868 visitNode(JS.Node node) {
2869 if (!found) super.visitNode(node);
2870 }
2871 }
OLDNEW
« no previous file with comments | « lib/runtime/dart/isolate.js ('k') | lib/src/codegen/js_printer.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698