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 // TODO(jmesserly): import from its own package | 5 // TODO(jmesserly): import from its own package |
6 import '../js_ast/js_ast.dart'; | 6 import '../js_ast/js_ast.dart'; |
7 import '../js_ast/precedence.dart'; | 7 import '../js_ast/precedence.dart'; |
8 | 8 |
9 import 'js_names.dart' show TemporaryId; | 9 import 'js_names.dart' show TemporaryId; |
10 | 10 |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 int get precedenceLevel => variables.isEmpty ? EXPRESSION : CALL; | 146 int get precedenceLevel => variables.isEmpty ? EXPRESSION : CALL; |
147 | 147 |
148 /// Patch to pretend [Template] supports visitMetaLet. | 148 /// Patch to pretend [Template] supports visitMetaLet. |
149 Instantiator _templateVisitMetaLet(InstantiatorGeneratorVisitor visitor) { | 149 Instantiator _templateVisitMetaLet(InstantiatorGeneratorVisitor visitor) { |
150 var valueInstantiators = variables.values.map(visitor.visit); | 150 var valueInstantiators = variables.values.map(visitor.visit); |
151 var bodyInstantiators = body.map(visitor.visit); | 151 var bodyInstantiators = body.map(visitor.visit); |
152 | 152 |
153 return (args) => new MetaLet( | 153 return (args) => new MetaLet( |
154 new Map.fromIterables( | 154 new Map.fromIterables( |
155 variables.keys, valueInstantiators.map((i) => i(args))), | 155 variables.keys, valueInstantiators.map((i) => i(args))), |
156 bodyInstantiators.map((i) => i(args)).toList(), | 156 bodyInstantiators.map((i) => i(args) as Expression).toList(), |
157 statelessResult: statelessResult); | 157 statelessResult: statelessResult); |
158 } | 158 } |
159 | 159 |
160 Expression _toInvokedFunction(Statement block) { | 160 Expression _toInvokedFunction(Statement block) { |
161 var finder = new _YieldFinder(); | 161 var finder = new _YieldFinder(); |
162 block.accept(finder); | 162 block.accept(finder); |
163 if (!finder.hasYield) { | 163 if (!finder.hasYield) { |
164 return new Call(new ArrowFun([], block), []); | 164 return new Call(new ArrowFun([], block), []); |
165 } | 165 } |
166 // If we have a yield, it's more tricky. We'll create a `function*`, which | 166 // If we have a yield, it's more tricky. We'll create a `function*`, which |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 if (isDeclaration) { | 248 if (isDeclaration) { |
249 // Technically, putting one of these in a comma expression is not | 249 // Technically, putting one of these in a comma expression is not |
250 // legal. However when isDeclaration is true, toStatement will be | 250 // legal. However when isDeclaration is true, toStatement will be |
251 // called immediately on the MetaLet, which results in legal JS. | 251 // called immediately on the MetaLet, which results in legal JS. |
252 assign = new VariableDeclarationList( | 252 assign = new VariableDeclarationList( |
253 'let', [new VariableInitialization(left, value)]); | 253 'let', [new VariableInitialization(left, value)]); |
254 } else { | 254 } else { |
255 assign = value.toAssignExpression(left); | 255 assign = value.toAssignExpression(left); |
256 } | 256 } |
257 | 257 |
258 var newBody = new Expression.binary([assign]..addAll(body), ','); | 258 assert(body.isNotEmpty); |
| 259 Binary newBody = new Expression.binary([assign]..addAll(body), ','); |
259 newBody = _substitute(newBody, {result: left}); | 260 newBody = _substitute(newBody, {result: left}); |
260 return new MetaLet(vars, newBody.commaToExpressionList(), | 261 return new MetaLet(vars, newBody.commaToExpressionList(), |
261 statelessResult: statelessResult); | 262 statelessResult: statelessResult); |
262 } | 263 } |
263 } | 264 } |
264 | 265 |
265 /// Similar to [Template.instantiate] but works with free variables. | 266 /// Similar to [Template.instantiate] but works with free variables. |
266 Node _substitute(Node tree, Map<MetaLetVariable, Expression> substitutions) { | 267 Node _substitute(Node tree, Map<MetaLetVariable, Expression> substitutions) { |
267 var generator = new InstantiatorGeneratorVisitor(/*forceCopy:*/ false); | 268 var generator = new InstantiatorGeneratorVisitor(/*forceCopy:*/ false); |
268 var instantiator = generator.compile(tree); | 269 var instantiator = generator.compile(tree); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 @override | 349 @override |
349 visitYield(Yield node) { | 350 visitYield(Yield node) { |
350 if (!_nestedFunction) hasYield = true; | 351 if (!_nestedFunction) hasYield = true; |
351 } | 352 } |
352 | 353 |
353 @override | 354 @override |
354 visitNode(Node node) { | 355 visitNode(Node node) { |
355 if (!hasYield) super.visitNode(node); | 356 if (!hasYield) super.visitNode(node); |
356 } | 357 } |
357 } | 358 } |
OLD | NEW |