| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 part of js_ast; | 5 part of js_ast; |
| 6 | 6 |
| 7 class TemplateManager { | 7 class TemplateManager { |
| 8 Map<String, Template> expressionTemplates = new Map<String, Template>(); | 8 Map<String, Template> expressionTemplates = new Map<String, Template>(); |
| 9 Map<String, Template> statementTemplates = new Map<String, Template>(); | 9 Map<String, Template> statementTemplates = new Map<String, Template>(); |
| 10 | 10 |
| 11 TemplateManager(); | 11 TemplateManager(); |
| 12 | 12 |
| 13 | |
| 14 Template lookupExpressionTemplate(String source) { | 13 Template lookupExpressionTemplate(String source) { |
| 15 return expressionTemplates[source]; | 14 return expressionTemplates[source]; |
| 16 } | 15 } |
| 17 | 16 |
| 18 Template defineExpressionTemplate(String source, Node ast) { | 17 Template defineExpressionTemplate(String source, Node ast) { |
| 19 Template template = | 18 Template template = |
| 20 new Template(source, ast, isExpression: true, forceCopy: false); | 19 new Template(source, ast, isExpression: true, forceCopy: false); |
| 21 expressionTemplates[source] = template; | 20 expressionTemplates[source] = template; |
| 22 return template; | 21 return template; |
| 23 } | 22 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 48 | 47 |
| 49 Instantiator instantiator; | 48 Instantiator instantiator; |
| 50 | 49 |
| 51 int positionalArgumentCount = -1; | 50 int positionalArgumentCount = -1; |
| 52 | 51 |
| 53 // Null, unless there are named holes. | 52 // Null, unless there are named holes. |
| 54 List<String> holeNames; | 53 List<String> holeNames; |
| 55 bool get isPositional => holeNames == null; | 54 bool get isPositional => holeNames == null; |
| 56 | 55 |
| 57 Template(this.source, this.ast, | 56 Template(this.source, this.ast, |
| 58 {this.isExpression: true, this.forceCopy: false}) { | 57 {this.isExpression: true, this.forceCopy: false}) { |
| 59 assert(this.isExpression ? ast is Expression : ast is Statement); | 58 assert(this.isExpression ? ast is Expression : ast is Statement); |
| 60 _compile(); | 59 _compile(); |
| 61 } | 60 } |
| 62 | 61 |
| 63 Template.withExpressionResult(this.ast) | 62 Template.withExpressionResult(this.ast) |
| 64 : source = null, isExpression = true, forceCopy = false { | 63 : source = null, |
| 64 isExpression = true, |
| 65 forceCopy = false { |
| 65 assert(ast is Expression); | 66 assert(ast is Expression); |
| 66 assert(_checkNoPlaceholders()); | 67 assert(_checkNoPlaceholders()); |
| 67 positionalArgumentCount = 0; | 68 positionalArgumentCount = 0; |
| 68 instantiator = (arguments) => ast; | 69 instantiator = (arguments) => ast; |
| 69 } | 70 } |
| 70 | 71 |
| 71 Template.withStatementResult(this.ast) | 72 Template.withStatementResult(this.ast) |
| 72 : source = null, isExpression = false, forceCopy = false { | 73 : source = null, |
| 74 isExpression = false, |
| 75 forceCopy = false { |
| 73 assert(ast is Statement); | 76 assert(ast is Statement); |
| 74 assert(_checkNoPlaceholders()); | 77 assert(_checkNoPlaceholders()); |
| 75 positionalArgumentCount = 0; | 78 positionalArgumentCount = 0; |
| 76 instantiator = (arguments) => ast; | 79 instantiator = (arguments) => ast; |
| 77 } | 80 } |
| 78 | 81 |
| 79 bool _checkNoPlaceholders() { | 82 bool _checkNoPlaceholders() { |
| 80 InstantiatorGeneratorVisitor generator = | 83 InstantiatorGeneratorVisitor generator = |
| 81 new InstantiatorGeneratorVisitor(false); | 84 new InstantiatorGeneratorVisitor(false); |
| 82 generator.compile(ast); | 85 generator.compile(ast); |
| 83 return generator.analysis.count == 0; | 86 return generator.analysis.count == 0; |
| 84 } | 87 } |
| 85 | 88 |
| 86 void _compile() { | 89 void _compile() { |
| 87 InstantiatorGeneratorVisitor generator = | 90 InstantiatorGeneratorVisitor generator = |
| 88 new InstantiatorGeneratorVisitor(forceCopy); | 91 new InstantiatorGeneratorVisitor(forceCopy); |
| 89 instantiator = generator.compile(ast); | 92 instantiator = generator.compile(ast); |
| 90 positionalArgumentCount = generator.analysis.count; | 93 positionalArgumentCount = generator.analysis.count; |
| 91 Set<String> names = generator.analysis.holeNames; | 94 Set<String> names = generator.analysis.holeNames; |
| 92 holeNames = names.toList(growable:false); | 95 holeNames = names.toList(growable: false); |
| 93 } | 96 } |
| 94 | 97 |
| 95 /// Instantiates the template with the given [arguments]. | 98 /// Instantiates the template with the given [arguments]. |
| 96 /// | 99 /// |
| 97 /// This method fills in the holes with the given arguments. The [arguments] | 100 /// This method fills in the holes with the given arguments. The [arguments] |
| 98 /// must be either a [List] or a [Map]. | 101 /// must be either a [List] or a [Map]. |
| 99 Node instantiate(var arguments) { | 102 Node instantiate(var arguments) { |
| 100 if (arguments is List) { | 103 if (arguments is List) { |
| 101 if (arguments.length != positionalArgumentCount) { | 104 if (arguments.length != positionalArgumentCount) { |
| 102 throw 'Wrong number of template arguments, given ${arguments.length}, ' | 105 throw 'Wrong number of template arguments, given ${arguments.length}, ' |
| (...skipping 18 matching lines...) Expand all Loading... |
| 121 } | 124 } |
| 122 } | 125 } |
| 123 | 126 |
| 124 /** | 127 /** |
| 125 * An Instantiator is a Function that generates a JS AST tree or List of | 128 * An Instantiator is a Function that generates a JS AST tree or List of |
| 126 * trees. [arguments] is a List for positional templates, or Map for | 129 * trees. [arguments] is a List for positional templates, or Map for |
| 127 * named templates. | 130 * named templates. |
| 128 */ | 131 */ |
| 129 typedef Node Instantiator(var arguments); | 132 typedef Node Instantiator(var arguments); |
| 130 | 133 |
| 131 | |
| 132 /** | 134 /** |
| 133 * InstantiatorGeneratorVisitor compiles a template. This class compiles a tree | 135 * InstantiatorGeneratorVisitor compiles a template. This class compiles a tree |
| 134 * containing [InterpolatedNode]s into a function that will create a copy of the | 136 * containing [InterpolatedNode]s into a function that will create a copy of the |
| 135 * tree with the interpolated nodes substituted with provided values. | 137 * tree with the interpolated nodes substituted with provided values. |
| 136 */ | 138 */ |
| 137 class InstantiatorGeneratorVisitor implements NodeVisitor<Instantiator> { | 139 class InstantiatorGeneratorVisitor implements NodeVisitor<Instantiator> { |
| 138 | |
| 139 final bool forceCopy; | 140 final bool forceCopy; |
| 140 | 141 |
| 141 InterpolatedNodeAnalysis analysis = new InterpolatedNodeAnalysis(); | 142 InterpolatedNodeAnalysis analysis = new InterpolatedNodeAnalysis(); |
| 142 | 143 |
| 143 /** | 144 /** |
| 144 * The entire tree is cloned if [forceCopy] is true. | 145 * The entire tree is cloned if [forceCopy] is true. |
| 145 */ | 146 */ |
| 146 InstantiatorGeneratorVisitor(this.forceCopy); | 147 InstantiatorGeneratorVisitor(this.forceCopy); |
| 147 | 148 |
| 148 Instantiator compile(Node node) { | 149 Instantiator compile(Node node) { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 if (node is InterpolatedExpression) { | 216 if (node is InterpolatedExpression) { |
| 216 var nameOrPosition = node.nameOrPosition; | 217 var nameOrPosition = node.nameOrPosition; |
| 217 return (arguments) { | 218 return (arguments) { |
| 218 var value = arguments[nameOrPosition]; | 219 var value = arguments[nameOrPosition]; |
| 219 Expression toExpression(item) { | 220 Expression toExpression(item) { |
| 220 if (item is Expression) return item; | 221 if (item is Expression) return item; |
| 221 if (item is String) return convertStringToVariableUse(item); | 222 if (item is String) return convertStringToVariableUse(item); |
| 222 return error('Interpolated value #$nameOrPosition is not ' | 223 return error('Interpolated value #$nameOrPosition is not ' |
| 223 'an Expression or List of Expressions: $value'); | 224 'an Expression or List of Expressions: $value'); |
| 224 } | 225 } |
| 226 |
| 225 if (value is Iterable) return value.map(toExpression); | 227 if (value is Iterable) return value.map(toExpression); |
| 226 return toExpression(value); | 228 return toExpression(value); |
| 227 }; | 229 }; |
| 228 } | 230 } |
| 229 return visit(node); | 231 return visit(node); |
| 230 } | 232 } |
| 231 | 233 |
| 232 Instantiator visitInterpolatedLiteral(InterpolatedLiteral node) { | 234 Instantiator visitInterpolatedLiteral(InterpolatedLiteral node) { |
| 233 var nameOrPosition = node.nameOrPosition; | 235 var nameOrPosition = node.nameOrPosition; |
| 234 return (arguments) { | 236 return (arguments) { |
| 235 var value = arguments[nameOrPosition]; | 237 var value = arguments[nameOrPosition]; |
| 236 if (value is Literal) return value; | 238 if (value is Literal) return value; |
| 237 error('Interpolated value #$nameOrPosition is not a Literal: $value'); | 239 error('Interpolated value #$nameOrPosition is not a Literal: $value'); |
| 238 }; | 240 }; |
| 239 } | 241 } |
| 240 | 242 |
| 241 Instantiator visitInterpolatedParameter(InterpolatedParameter node) { | 243 Instantiator visitInterpolatedParameter(InterpolatedParameter node) { |
| 242 var nameOrPosition = node.nameOrPosition; | 244 var nameOrPosition = node.nameOrPosition; |
| 243 return (arguments) { | 245 return (arguments) { |
| 244 var value = arguments[nameOrPosition]; | 246 var value = arguments[nameOrPosition]; |
| 245 | 247 |
| 246 Parameter toParameter(item) { | 248 Parameter toParameter(item) { |
| 247 if (item is Parameter) return item; | 249 if (item is Parameter) return item; |
| 248 if (item is String) return new Parameter(item); | 250 if (item is String) return new Parameter(item); |
| 249 return error('Interpolated value #$nameOrPosition is not a Parameter or' | 251 return error('Interpolated value #$nameOrPosition is not a Parameter or' |
| 250 ' List of Parameters: $value'); | 252 ' List of Parameters: $value'); |
| 251 } | 253 } |
| 254 |
| 252 if (value is Iterable) return value.map(toParameter); | 255 if (value is Iterable) return value.map(toParameter); |
| 253 return toParameter(value); | 256 return toParameter(value); |
| 254 }; | 257 }; |
| 255 } | 258 } |
| 256 | 259 |
| 257 Instantiator visitInterpolatedSelector(InterpolatedSelector node) { | 260 Instantiator visitInterpolatedSelector(InterpolatedSelector node) { |
| 258 // A selector is an expression, as in `a[selector]`. | 261 // A selector is an expression, as in `a[selector]`. |
| 259 // A String argument converted into a LiteralString, so `a.#` with argument | 262 // A String argument converted into a LiteralString, so `a.#` with argument |
| 260 // 'foo' generates `a["foo"]` which prints as `a.foo`. | 263 // 'foo' generates `a["foo"]` which prints as `a.foo`. |
| 261 var nameOrPosition = node.nameOrPosition; | 264 var nameOrPosition = node.nameOrPosition; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 276 }; | 279 }; |
| 277 } | 280 } |
| 278 | 281 |
| 279 Instantiator visitSplayableStatement(Node node) { | 282 Instantiator visitSplayableStatement(Node node) { |
| 280 if (node is InterpolatedStatement) { | 283 if (node is InterpolatedStatement) { |
| 281 var nameOrPosition = node.nameOrPosition; | 284 var nameOrPosition = node.nameOrPosition; |
| 282 return (arguments) { | 285 return (arguments) { |
| 283 var value = arguments[nameOrPosition]; | 286 var value = arguments[nameOrPosition]; |
| 284 Statement toStatement(item) { | 287 Statement toStatement(item) { |
| 285 if (item is Statement) return item; | 288 if (item is Statement) return item; |
| 286 if (item is Expression) return item.toStatement();; | 289 if (item is Expression) return item.toStatement(); |
| 290 ; |
| 287 return error('Interpolated value #$nameOrPosition is not ' | 291 return error('Interpolated value #$nameOrPosition is not ' |
| 288 'a Statement or List of Statements: $value'); | 292 'a Statement or List of Statements: $value'); |
| 289 } | 293 } |
| 294 |
| 290 if (value is Iterable) return value.map(toStatement); | 295 if (value is Iterable) return value.map(toStatement); |
| 291 return toStatement(value); | 296 return toStatement(value); |
| 292 }; | 297 }; |
| 293 } | 298 } |
| 294 return visit(node); | 299 return visit(node); |
| 295 } | 300 } |
| 296 | 301 |
| 297 Instantiator visitProgram(Program node) { | 302 Instantiator visitProgram(Program node) { |
| 298 List instantiators = node.body.map(visitSplayableStatement).toList(); | 303 List instantiators = node.body.map(visitSplayableStatement).toList(); |
| 299 return (arguments) { | 304 return (arguments) { |
| 300 List<Statement> statements = <Statement>[]; | 305 List<Statement> statements = <Statement>[]; |
| 301 void add(node) { | 306 void add(node) { |
| 302 if (node is EmptyStatement) return; | 307 if (node is EmptyStatement) return; |
| 303 if (node is Iterable) { | 308 if (node is Iterable) { |
| 304 statements.addAll(node); | 309 statements.addAll(node); |
| 305 } else { | 310 } else { |
| 306 statements.add(node.toStatement()); | 311 statements.add(node.toStatement()); |
| 307 } | 312 } |
| 308 } | 313 } |
| 314 |
| 309 for (Instantiator instantiator in instantiators) { | 315 for (Instantiator instantiator in instantiators) { |
| 310 add(instantiator(arguments)); | 316 add(instantiator(arguments)); |
| 311 } | 317 } |
| 312 return new Program(statements); | 318 return new Program(statements); |
| 313 }; | 319 }; |
| 314 } | 320 } |
| 315 | 321 |
| 316 Instantiator visitBlock(Block node) { | 322 Instantiator visitBlock(Block node) { |
| 317 List instantiators = node.statements.map(visitSplayableStatement).toList(); | 323 List instantiators = node.statements.map(visitSplayableStatement).toList(); |
| 318 return (arguments) { | 324 return (arguments) { |
| 319 List<Statement> statements = <Statement>[]; | 325 List<Statement> statements = <Statement>[]; |
| 320 void add(node) { | 326 void add(node) { |
| 321 if (node is EmptyStatement) return; | 327 if (node is EmptyStatement) return; |
| 322 if (node is Iterable) { | 328 if (node is Iterable) { |
| 323 statements.addAll(node); | 329 statements.addAll(node); |
| 324 } else if (node is Block) { | 330 } else if (node is Block) { |
| 325 statements.addAll(node.statements); | 331 statements.addAll(node.statements); |
| 326 } else { | 332 } else { |
| 327 statements.add(node.toStatement()); | 333 statements.add(node.toStatement()); |
| 328 } | 334 } |
| 329 } | 335 } |
| 336 |
| 330 for (Instantiator instantiator in instantiators) { | 337 for (Instantiator instantiator in instantiators) { |
| 331 add(instantiator(arguments)); | 338 add(instantiator(arguments)); |
| 332 } | 339 } |
| 333 return new Block(statements); | 340 return new Block(statements); |
| 334 }; | 341 }; |
| 335 } | 342 } |
| 336 | 343 |
| 337 Instantiator visitExpressionStatement(ExpressionStatement node) { | 344 Instantiator visitExpressionStatement(ExpressionStatement node) { |
| 338 Instantiator buildExpression = visit(node.expression); | 345 Instantiator buildExpression = visit(node.expression); |
| 339 return (arguments) { | 346 return (arguments) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 353 } | 360 } |
| 354 | 361 |
| 355 Instantiator visitIfConditionalCompilation(If node) { | 362 Instantiator visitIfConditionalCompilation(If node) { |
| 356 // Special version of visitInterpolatedExpression that permits bools. | 363 // Special version of visitInterpolatedExpression that permits bools. |
| 357 compileCondition(InterpolatedExpression node) { | 364 compileCondition(InterpolatedExpression node) { |
| 358 var nameOrPosition = node.nameOrPosition; | 365 var nameOrPosition = node.nameOrPosition; |
| 359 return (arguments) { | 366 return (arguments) { |
| 360 var value = arguments[nameOrPosition]; | 367 var value = arguments[nameOrPosition]; |
| 361 if (value is bool) return value; | 368 if (value is bool) return value; |
| 362 if (value is Expression) return value; | 369 if (value is Expression) return value; |
| 363 if (value is String) return convertStringToVariableUse(value);; | 370 if (value is String) return convertStringToVariableUse(value); |
| 371 ; |
| 364 error('Interpolated value #$nameOrPosition ' | 372 error('Interpolated value #$nameOrPosition ' |
| 365 'is not an Expression: $value'); | 373 'is not an Expression: $value'); |
| 366 }; | 374 }; |
| 367 } | 375 } |
| 376 |
| 368 var makeCondition = compileCondition(node.condition); | 377 var makeCondition = compileCondition(node.condition); |
| 369 Instantiator makeThen = visit(node.then); | 378 Instantiator makeThen = visit(node.then); |
| 370 Instantiator makeOtherwise = visit(node.otherwise); | 379 Instantiator makeOtherwise = visit(node.otherwise); |
| 371 return (arguments) { | 380 return (arguments) { |
| 372 var condition = makeCondition(arguments); | 381 var condition = makeCondition(arguments); |
| 373 if (condition is bool) { | 382 if (condition is bool) { |
| 374 if (condition == true) { | 383 if (condition == true) { |
| 375 return makeThen(arguments); | 384 return makeThen(arguments); |
| 376 } else { | 385 } else { |
| 377 return makeOtherwise(arguments); | 386 return makeOtherwise(arguments); |
| 378 } | 387 } |
| 379 } | 388 } |
| 380 return new If( | 389 return new If(condition, makeThen(arguments), makeOtherwise(arguments)); |
| 381 condition, | |
| 382 makeThen(arguments), | |
| 383 makeOtherwise(arguments)); | |
| 384 }; | 390 }; |
| 385 } | 391 } |
| 386 | 392 |
| 387 Instantiator visitIfNormal(If node) { | 393 Instantiator visitIfNormal(If node) { |
| 388 Instantiator makeCondition = visit(node.condition); | 394 Instantiator makeCondition = visit(node.condition); |
| 389 Instantiator makeThen = visit(node.then); | 395 Instantiator makeThen = visit(node.then); |
| 390 Instantiator makeOtherwise = visit(node.otherwise); | 396 Instantiator makeOtherwise = visit(node.otherwise); |
| 391 return (arguments) { | 397 return (arguments) { |
| 392 return new If( | 398 return new If(makeCondition(arguments), makeThen(arguments), |
| 393 makeCondition(arguments), | |
| 394 makeThen(arguments), | |
| 395 makeOtherwise(arguments)); | 399 makeOtherwise(arguments)); |
| 396 }; | 400 }; |
| 397 } | 401 } |
| 398 | 402 |
| 399 Instantiator visitFor(For node) { | 403 Instantiator visitFor(For node) { |
| 400 Instantiator makeInit = visitNullable(node.init); | 404 Instantiator makeInit = visitNullable(node.init); |
| 401 Instantiator makeCondition = visitNullable(node.condition); | 405 Instantiator makeCondition = visitNullable(node.condition); |
| 402 Instantiator makeUpdate = visitNullable(node.update); | 406 Instantiator makeUpdate = visitNullable(node.update); |
| 403 Instantiator makeBody = visit(node.body); | 407 Instantiator makeBody = visit(node.body); |
| 404 return (arguments) { | 408 return (arguments) { |
| 405 return new For( | 409 return new For(makeInit(arguments), makeCondition(arguments), |
| 406 makeInit(arguments), makeCondition(arguments), makeUpdate(arguments), | 410 makeUpdate(arguments), makeBody(arguments)); |
| 407 makeBody(arguments)); | |
| 408 }; | 411 }; |
| 409 } | 412 } |
| 410 | 413 |
| 411 Instantiator visitForIn(ForIn node) { | 414 Instantiator visitForIn(ForIn node) { |
| 412 Instantiator makeLeftHandSide = visit(node.leftHandSide); | 415 Instantiator makeLeftHandSide = visit(node.leftHandSide); |
| 413 Instantiator makeObject = visit(node.object); | 416 Instantiator makeObject = visit(node.object); |
| 414 Instantiator makeBody = visit(node.body); | 417 Instantiator makeBody = visit(node.body); |
| 415 return (arguments) { | 418 return (arguments) { |
| 416 return new ForIn( | 419 return new ForIn(makeLeftHandSide(arguments), makeObject(arguments), |
| 417 makeLeftHandSide(arguments), | |
| 418 makeObject(arguments), | |
| 419 makeBody(arguments)); | 420 makeBody(arguments)); |
| 420 }; | 421 }; |
| 421 } | 422 } |
| 422 | 423 |
| 423 TODO(String name) { | 424 TODO(String name) { |
| 424 throw new UnimplementedError('$this.$name'); | 425 throw new UnimplementedError('$this.$name'); |
| 425 } | 426 } |
| 426 | 427 |
| 427 Instantiator visitWhile(While node) { | 428 Instantiator visitWhile(While node) { |
| 428 Instantiator makeCondition = visit(node.condition); | 429 Instantiator makeCondition = visit(node.condition); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 446 Instantiator visitBreak(Break node) => | 447 Instantiator visitBreak(Break node) => |
| 447 (arguments) => new Break(node.targetLabel); | 448 (arguments) => new Break(node.targetLabel); |
| 448 | 449 |
| 449 Instantiator visitReturn(Return node) { | 450 Instantiator visitReturn(Return node) { |
| 450 Instantiator makeExpression = visitNullable(node.value); | 451 Instantiator makeExpression = visitNullable(node.value); |
| 451 return (arguments) => new Return(makeExpression(arguments)); | 452 return (arguments) => new Return(makeExpression(arguments)); |
| 452 } | 453 } |
| 453 | 454 |
| 454 Instantiator visitDartYield(DartYield node) { | 455 Instantiator visitDartYield(DartYield node) { |
| 455 Instantiator makeExpression = visit(node.expression); | 456 Instantiator makeExpression = visit(node.expression); |
| 456 return (arguments) => new DartYield(makeExpression(arguments), node.hasStar)
; | 457 return (arguments) => |
| 458 new DartYield(makeExpression(arguments), node.hasStar); |
| 457 } | 459 } |
| 458 | 460 |
| 459 Instantiator visitThrow(Throw node) { | 461 Instantiator visitThrow(Throw node) { |
| 460 Instantiator makeExpression = visit(node.expression); | 462 Instantiator makeExpression = visit(node.expression); |
| 461 return (arguments) => new Throw(makeExpression(arguments)); | 463 return (arguments) => new Throw(makeExpression(arguments)); |
| 462 } | 464 } |
| 463 | 465 |
| 464 Instantiator visitTry(Try node) { | 466 Instantiator visitTry(Try node) { |
| 465 Instantiator makeBody = visit(node.body); | 467 Instantiator makeBody = visit(node.body); |
| 466 Instantiator makeCatch = visitNullable(node.catchPart); | 468 Instantiator makeCatch = visitNullable(node.catchPart); |
| 467 Instantiator makeFinally = visitNullable(node.finallyPart); | 469 Instantiator makeFinally = visitNullable(node.finallyPart); |
| 468 return (arguments) => new Try( | 470 return (arguments) => new Try( |
| 469 makeBody(arguments), makeCatch(arguments), makeFinally(arguments)); | 471 makeBody(arguments), makeCatch(arguments), makeFinally(arguments)); |
| 470 } | 472 } |
| 471 | 473 |
| 472 Instantiator visitCatch(Catch node) { | 474 Instantiator visitCatch(Catch node) { |
| 473 Instantiator makeDeclaration = visit(node.declaration); | 475 Instantiator makeDeclaration = visit(node.declaration); |
| 474 Instantiator makeBody = visit(node.body); | 476 Instantiator makeBody = visit(node.body); |
| 475 return (arguments) => new Catch( | 477 return (arguments) => |
| 476 makeDeclaration(arguments), makeBody(arguments)); | 478 new Catch(makeDeclaration(arguments), makeBody(arguments)); |
| 477 } | 479 } |
| 478 | 480 |
| 479 Instantiator visitSwitch(Switch node) { | 481 Instantiator visitSwitch(Switch node) { |
| 480 Instantiator makeKey = visit(node.key); | 482 Instantiator makeKey = visit(node.key); |
| 481 Iterable<Instantiator> makeCases = node.cases.map(visit); | 483 Iterable<Instantiator> makeCases = node.cases.map(visit); |
| 482 return (arguments) { | 484 return (arguments) { |
| 483 return new Switch(makeKey(arguments), | 485 return new Switch( |
| 484 makeCases.map((Instantiator makeCase) => makeCase(arguments)) | 486 makeKey(arguments), |
| 485 .toList()); | 487 makeCases |
| 488 .map((Instantiator makeCase) => makeCase(arguments)) |
| 489 .toList()); |
| 486 }; | 490 }; |
| 487 } | 491 } |
| 488 | 492 |
| 489 Instantiator visitCase(Case node) { | 493 Instantiator visitCase(Case node) { |
| 490 Instantiator makeExpression = visit(node.expression); | 494 Instantiator makeExpression = visit(node.expression); |
| 491 Instantiator makeBody = visit(node.body); | 495 Instantiator makeBody = visit(node.body); |
| 492 return (arguments) { | 496 return (arguments) { |
| 493 return new Case(makeExpression(arguments), makeBody(arguments)); | 497 return new Case(makeExpression(arguments), makeBody(arguments)); |
| 494 }; | 498 }; |
| 495 } | 499 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 530 return new VariableDeclarationList(declarations); | 534 return new VariableDeclarationList(declarations); |
| 531 }; | 535 }; |
| 532 } | 536 } |
| 533 | 537 |
| 534 Instantiator visitAssignment(Assignment node) { | 538 Instantiator visitAssignment(Assignment node) { |
| 535 Instantiator makeLeftHandSide = visit(node.leftHandSide); | 539 Instantiator makeLeftHandSide = visit(node.leftHandSide); |
| 536 String op = node.op; | 540 String op = node.op; |
| 537 Instantiator makeValue = visitNullable(node.value); | 541 Instantiator makeValue = visitNullable(node.value); |
| 538 return (arguments) { | 542 return (arguments) { |
| 539 return new Assignment.compound( | 543 return new Assignment.compound( |
| 540 makeLeftHandSide(arguments), | 544 makeLeftHandSide(arguments), op, makeValue(arguments)); |
| 541 op, | |
| 542 makeValue(arguments)); | |
| 543 }; | 545 }; |
| 544 } | 546 } |
| 545 | 547 |
| 546 Instantiator visitVariableInitialization(VariableInitialization node) { | 548 Instantiator visitVariableInitialization(VariableInitialization node) { |
| 547 Instantiator makeDeclaration = visit(node.declaration); | 549 Instantiator makeDeclaration = visit(node.declaration); |
| 548 Instantiator makeValue = visitNullable(node.value); | 550 Instantiator makeValue = visitNullable(node.value); |
| 549 return (arguments) { | 551 return (arguments) { |
| 550 return new VariableInitialization( | 552 return new VariableInitialization( |
| 551 makeDeclaration(arguments), makeValue(arguments)); | 553 makeDeclaration(arguments), makeValue(arguments)); |
| 552 }; | 554 }; |
| 553 } | 555 } |
| 554 | 556 |
| 555 Instantiator visitConditional(Conditional cond) { | 557 Instantiator visitConditional(Conditional cond) { |
| 556 Instantiator makeCondition = visit(cond.condition); | 558 Instantiator makeCondition = visit(cond.condition); |
| 557 Instantiator makeThen = visit(cond.then); | 559 Instantiator makeThen = visit(cond.then); |
| 558 Instantiator makeOtherwise = visit(cond.otherwise); | 560 Instantiator makeOtherwise = visit(cond.otherwise); |
| 559 return (arguments) => new Conditional( | 561 return (arguments) => new Conditional(makeCondition(arguments), |
| 560 makeCondition(arguments), | 562 makeThen(arguments), makeOtherwise(arguments)); |
| 561 makeThen(arguments), | |
| 562 makeOtherwise(arguments)); | |
| 563 } | 563 } |
| 564 | 564 |
| 565 Instantiator visitNew(New node) => | 565 Instantiator visitNew(New node) => |
| 566 handleCallOrNew(node, (target, arguments) => new New(target, arguments)); | 566 handleCallOrNew(node, (target, arguments) => new New(target, arguments)); |
| 567 | 567 |
| 568 Instantiator visitCall(Call node) => | 568 Instantiator visitCall(Call node) => |
| 569 handleCallOrNew(node, (target, arguments) => new Call(target, arguments)); | 569 handleCallOrNew(node, (target, arguments) => new Call(target, arguments)); |
| 570 | 570 |
| 571 Instantiator handleCallOrNew(Call node, finish(target, arguments)) { | 571 Instantiator handleCallOrNew(Call node, finish(target, arguments)) { |
| 572 Instantiator makeTarget = visit(node.target); | 572 Instantiator makeTarget = visit(node.target); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 651 } | 651 } |
| 652 Statement body = makeBody(arguments); | 652 Statement body = makeBody(arguments); |
| 653 return new Fun(params, body); | 653 return new Fun(params, body); |
| 654 }; | 654 }; |
| 655 } | 655 } |
| 656 | 656 |
| 657 Instantiator visitDeferredExpression(DeferredExpression node) => same(node); | 657 Instantiator visitDeferredExpression(DeferredExpression node) => same(node); |
| 658 | 658 |
| 659 Instantiator visitDeferredNumber(DeferredNumber node) => same(node); | 659 Instantiator visitDeferredNumber(DeferredNumber node) => same(node); |
| 660 | 660 |
| 661 Instantiator visitDeferredString(DeferredString node) => | 661 Instantiator visitDeferredString(DeferredString node) => (arguments) => node; |
| 662 (arguments) => node; | |
| 663 | 662 |
| 664 Instantiator visitLiteralBool(LiteralBool node) => | 663 Instantiator visitLiteralBool(LiteralBool node) => |
| 665 (arguments) => new LiteralBool(node.value); | 664 (arguments) => new LiteralBool(node.value); |
| 666 | 665 |
| 667 Instantiator visitLiteralString(LiteralString node) => | 666 Instantiator visitLiteralString(LiteralString node) => |
| 668 (arguments) => new LiteralString(node.value); | 667 (arguments) => new LiteralString(node.value); |
| 669 | 668 |
| 670 Instantiator visitLiteralNumber(LiteralNumber node) => | 669 Instantiator visitLiteralNumber(LiteralNumber node) => |
| 671 (arguments) => new LiteralNumber(node.value); | 670 (arguments) => new LiteralNumber(node.value); |
| 672 | 671 |
| 673 Instantiator visitLiteralNull(LiteralNull node) => | 672 Instantiator visitLiteralNull(LiteralNull node) => |
| 674 (arguments) => new LiteralNull(); | 673 (arguments) => new LiteralNull(); |
| 675 | 674 |
| 676 Instantiator visitStringConcatenation(StringConcatenation node) { | 675 Instantiator visitStringConcatenation(StringConcatenation node) { |
| 677 List<Instantiator> partMakers = node.parts | 676 List<Instantiator> partMakers = |
| 678 .map(visit) | 677 node.parts.map(visit).toList(growable: false); |
| 679 .toList(growable: false); | |
| 680 return (arguments) { | 678 return (arguments) { |
| 681 List<Literal> parts = partMakers | 679 List<Literal> parts = partMakers |
| 682 .map((Instantiator instantiator) => instantiator(arguments)) | 680 .map((Instantiator instantiator) => instantiator(arguments)) |
| 683 .toList(growable: false); | 681 .toList(growable: false); |
| 684 return new StringConcatenation(parts); | 682 return new StringConcatenation(parts); |
| 685 }; | 683 }; |
| 686 } | 684 } |
| 687 | 685 |
| 688 Instantiator visitName(Name node) => same(node); | 686 Instantiator visitName(Name node) => same(node); |
| 689 | 687 |
| 690 Instantiator visitArrayInitializer(ArrayInitializer node) { | 688 Instantiator visitArrayInitializer(ArrayInitializer node) { |
| 691 // TODO(sra): Implement splicing? | 689 // TODO(sra): Implement splicing? |
| 692 List<Instantiator> elementMakers = node.elements | 690 List<Instantiator> elementMakers = |
| 693 .map(visit) | 691 node.elements.map(visit).toList(growable: false); |
| 694 .toList(growable: false); | |
| 695 return (arguments) { | 692 return (arguments) { |
| 696 List<Expression> elements = elementMakers | 693 List<Expression> elements = elementMakers |
| 697 .map((Instantiator instantiator) => instantiator(arguments)) | 694 .map((Instantiator instantiator) => instantiator(arguments)) |
| 698 .toList(growable: false); | 695 .toList(growable: false); |
| 699 return new ArrayInitializer(elements); | 696 return new ArrayInitializer(elements); |
| 700 }; | 697 }; |
| 701 } | 698 } |
| 702 | 699 |
| 703 Instantiator visitArrayHole(ArrayHole node) { | 700 Instantiator visitArrayHole(ArrayHole node) { |
| 704 return (arguments) => new ArrayHole(); | 701 return (arguments) => new ArrayHole(); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 766 node.visitChildren(this); | 763 node.visitChildren(this); |
| 767 if (count != before) containsInterpolatedNode.add(node); | 764 if (count != before) containsInterpolatedNode.add(node); |
| 768 } | 765 } |
| 769 | 766 |
| 770 visitInterpolatedNode(InterpolatedNode node) { | 767 visitInterpolatedNode(InterpolatedNode node) { |
| 771 containsInterpolatedNode.add(node); | 768 containsInterpolatedNode.add(node); |
| 772 if (node.isNamed) holeNames.add(node.nameOrPosition); | 769 if (node.isNamed) holeNames.add(node.nameOrPosition); |
| 773 ++count; | 770 ++count; |
| 774 } | 771 } |
| 775 } | 772 } |
| OLD | NEW |