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

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

Issue 1207313002: initial sync*, part of #221 (Closed) Base URL: git@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 | « lib/src/codegen/js_codegen.dart ('k') | lib/src/js/nodes.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_metalet; 5 library dev_compiler.src.codegen.js_metalet;
6 6
7 // TODO(jmesserly): import from its own package 7 // TODO(jmesserly): import from its own package
8 import 'package:dev_compiler/src/js/js_ast.dart'; 8 import 'package:dev_compiler/src/js/js_ast.dart';
9 import 'package:dev_compiler/src/js/precedence.dart'; 9 import 'package:dev_compiler/src/js/precedence.dart';
10 10
11 import 'js_names.dart' show TemporaryId; 11 import 'js_names.dart' show TemporaryId;
12 12
13 /// A synthetic `let*` node, similar to that found in Scheme. 13 /// A synthetic `let*` node, similar to that found in Scheme.
14 /// 14 ///
15 /// For example, postfix increment can be desugared as: 15 /// For example, postfix increment can be desugared as:
16 /// 16 ///
17 /// // psuedocode mix of Scheme and JS: 17 /// // psuedocode mix of Scheme and JS:
18 /// (let* (x1=expr1, x2=expr2, t=x1[x2]) { x1[x2] = t + 1; t }) 18 /// (let* (x1=expr1, x2=expr2, t=x1[x2]) { x1[x2] = t + 1; t })
19 /// 19 ///
20 /// [MetaLet] will simplify itself automatically when [toExpression], 20 /// [MetaLet] will simplify itself automatically when [toExpression],
21 /// [toStatement], or [toReturn] is called. 21 /// [toStatement], [toReturn], or [toYieldStatement] is called.
22 /// 22 ///
23 /// * variables used once will be inlined. 23 /// * variables used once will be inlined.
24 /// * if used in a statement context they can emit as blocks. 24 /// * if used in a statement context they can emit as blocks.
25 /// * if return value is not used it can be eliminated, see [statelessResult]. 25 /// * if return value is not used it can be eliminated, see [statelessResult].
26 /// * if there are no variables, the codegen will be simplified. 26 /// * if there are no variables, the codegen will be simplified.
27 /// 27 ///
28 /// Because this deals with JS AST nodes, it is not aware of any Dart semantics 28 /// Because this deals with JS AST nodes, it is not aware of any Dart semantics
29 /// around statelessness (such as `final` variables). [variables] should not 29 /// around statelessness (such as `final` variables). [variables] should not
30 /// be created for these Dart expressions. 30 /// be created for these Dart expressions.
31 /// 31 ///
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 return _finishStatement(statements); 105 return _finishStatement(statements);
106 } 106 }
107 107
108 Block toReturn() { 108 Block toReturn() {
109 var statements = body 109 var statements = body
110 .map((e) => e == body.last ? e.toReturn() : e.toStatement()) 110 .map((e) => e == body.last ? e.toReturn() : e.toStatement())
111 .toList(); 111 .toList();
112 return _finishStatement(statements); 112 return _finishStatement(statements);
113 } 113 }
114 114
115 Block toYieldStatement({bool star: false}) {
116 var statements = body
117 .map((e) =>
118 e == body.last ? e.toYieldStatement(star: star) : e.toStatement())
119 .toList();
120 return _finishStatement(statements);
121 }
122
115 accept(NodeVisitor visitor) => toExpression().accept(visitor); 123 accept(NodeVisitor visitor) => toExpression().accept(visitor);
116 124
117 void visitChildren(NodeVisitor visitor) { 125 void visitChildren(NodeVisitor visitor) {
118 toExpression().visitChildren(visitor); 126 toExpression().visitChildren(visitor);
119 } 127 }
120 128
121 /// This generates as either a comma expression or a call. 129 /// This generates as either a comma expression or a call.
122 int get precedenceLevel => variables.isEmpty ? EXPRESSION : CALL; 130 int get precedenceLevel => variables.isEmpty ? EXPRESSION : CALL;
123 131
124 Block _finishStatement(List<Statement> statements) { 132 Block _finishStatement(List<Statement> statements) {
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 bool found = false; 241 bool found = false;
234 _IdentFinder(this.name); 242 _IdentFinder(this.name);
235 243
236 visitIdentifier(Identifier node) { 244 visitIdentifier(Identifier node) {
237 if (node.name == name) found = true; 245 if (node.name == name) found = true;
238 } 246 }
239 visitNode(Node node) { 247 visitNode(Node node) {
240 if (!found) super.visitNode(node); 248 if (!found) super.visitNode(node);
241 } 249 }
242 } 250 }
OLDNEW
« no previous file with comments | « lib/src/codegen/js_codegen.dart ('k') | lib/src/js/nodes.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698