| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 // Returns null if no need to rename a node. | 5 // Returns null if no need to rename a node. |
| 6 typedef String Renamer(Node node); | 6 typedef String Renamer(Node node); |
| 7 | 7 |
| 8 class Unparser implements Visitor { | 8 class Unparser implements Visitor { |
| 9 Renamer rename; | 9 Renamer rename; |
| 10 StringBuffer sb; | 10 StringBuffer sb; |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 | 161 |
| 162 visitIdentifier(Identifier node) { | 162 visitIdentifier(Identifier node) { |
| 163 add(node.token.value); | 163 add(node.token.value); |
| 164 } | 164 } |
| 165 | 165 |
| 166 visitIf(If node) { | 166 visitIf(If node) { |
| 167 add(node.ifToken.value); | 167 add(node.ifToken.value); |
| 168 visit(node.condition); | 168 visit(node.condition); |
| 169 visit(node.thenPart); | 169 visit(node.thenPart); |
| 170 if (node.hasElsePart) { | 170 if (node.hasElsePart) { |
| 171 addToken(node.elseToken); | 171 add(node.elseToken.value); |
| 172 if (node.elsePart is !Block) sb.add(' '); |
| 172 visit(node.elsePart); | 173 visit(node.elsePart); |
| 173 } | 174 } |
| 174 } | 175 } |
| 175 | 176 |
| 176 visitLiteralBool(LiteralBool node) { | 177 visitLiteralBool(LiteralBool node) { |
| 177 add(node.token.value); | 178 add(node.token.value); |
| 178 } | 179 } |
| 179 | 180 |
| 180 visitLiteralDouble(LiteralDouble node) { | 181 visitLiteralDouble(LiteralDouble node) { |
| 181 add(node.token.value); | 182 add(node.token.value); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 202 visitLiteralNull(LiteralNull node) { | 203 visitLiteralNull(LiteralNull node) { |
| 203 add(node.token.value); | 204 add(node.token.value); |
| 204 } | 205 } |
| 205 | 206 |
| 206 visitNewExpression(NewExpression node) { | 207 visitNewExpression(NewExpression node) { |
| 207 addToken(node.newToken); | 208 addToken(node.newToken); |
| 208 visit(node.send); | 209 visit(node.send); |
| 209 } | 210 } |
| 210 | 211 |
| 211 visitLiteralList(LiteralList node) { | 212 visitLiteralList(LiteralList node) { |
| 212 addToken(node.constKeyword); | 213 if (node.constKeyword !== null) add(node.constKeyword.value); |
| 213 visit(node.typeArguments); | 214 visit(node.typeArguments); |
| 214 visit(node.elements); | 215 visit(node.elements); |
| 215 } | 216 } |
| 216 | 217 |
| 217 visitModifiers(Modifiers node) => node.visitChildren(this); | 218 visitModifiers(Modifiers node) => node.visitChildren(this); |
| 218 | 219 |
| 219 /** | 220 /** |
| 220 * Unparses given NodeList starting from specific node. | 221 * Unparses given NodeList starting from specific node. |
| 221 */ | 222 */ |
| 222 unparseNodeListFrom(NodeList node, Link<Node> from) { | 223 unparseNodeListFrom(NodeList node, Link<Node> from) { |
| 223 if (from.isEmpty()) return; | 224 if (from.isEmpty()) return; |
| 224 String delimiter = (node.delimiter === null) ? " " : "${node.delimiter}"; | 225 String delimiter = (node.delimiter === null) ? "" : "${node.delimiter}"; |
| 225 visit(from.head); | 226 visit(from.head); |
| 226 for (Link link = from.tail; !link.isEmpty(); link = link.tail) { | 227 for (Link link = from.tail; !link.isEmpty(); link = link.tail) { |
| 227 sb.add(delimiter); | 228 sb.add(delimiter); |
| 228 visit(link.head); | 229 visit(link.head); |
| 229 } | 230 } |
| 230 } | 231 } |
| 231 | 232 |
| 232 visitNodeList(NodeList node) { | 233 visitNodeList(NodeList node) { |
| 233 if (node.beginToken !== null) addToken(node.beginToken); | 234 addToken(node.beginToken); |
| 234 if (node.nodes !== null) { | 235 if (node.nodes !== null) { |
| 235 unparseNodeListFrom(node, node.nodes); | 236 unparseNodeListFrom(node, node.nodes); |
| 236 } | 237 } |
| 237 if (node.endToken !== null) add(node.endToken.value); | 238 if (node.endToken !== null) add(node.endToken.value); |
| 238 } | 239 } |
| 239 | 240 |
| 240 visitOperator(Operator node) { | 241 visitOperator(Operator node) { |
| 241 visitIdentifier(node); | 242 visitIdentifier(node); |
| 242 } | 243 } |
| 243 | 244 |
| 244 visitReturn(Return node) { | 245 visitReturn(Return node) { |
| 245 add(node.beginToken.value); | 246 add(node.beginToken.value); |
| 246 if (node.hasExpression) { | 247 if (node.hasExpression && node.beginToken.stringValue != '=>') { |
| 247 sb.add(' '); | 248 sb.add(' '); |
| 248 visit(node.expression); | |
| 249 } | 249 } |
| 250 visit(node.expression); |
| 250 if (node.endToken !== null) add(node.endToken.value); | 251 if (node.endToken !== null) add(node.endToken.value); |
| 251 } | 252 } |
| 252 | 253 |
| 253 unparseSendReceiver(Send node, [bool spacesNeeded=false]) { | 254 unparseSendReceiver(Send node, [bool spacesNeeded=false]) { |
| 254 // TODO(smok): Remove ugly hack for library preferences. | 255 // TODO(smok): Remove ugly hack for library preferences. |
| 255 // Check that renamer does not want to omit receiver at all, | 256 // Check that renamer does not want to omit receiver at all, |
| 256 // in that case we don't need spaces or dot. | 257 // in that case we don't need spaces or dot. |
| 257 if (node.receiver !== null && rename(node.receiver) != '') { | 258 if (node.receiver !== null && rename(node.receiver) != '') { |
| 258 visit(node.receiver); | 259 visit(node.receiver); |
| 259 CascadeReceiver asCascadeReceiver = node.receiver.asCascadeReceiver(); | 260 CascadeReceiver asCascadeReceiver = node.receiver.asCascadeReceiver(); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 visit(node.type); | 333 visit(node.type); |
| 333 sb.add(' '); | 334 sb.add(' '); |
| 334 } | 335 } |
| 335 visit(node.definitions); | 336 visit(node.definitions); |
| 336 if (node.endToken.value == const SourceString(';')) { | 337 if (node.endToken.value == const SourceString(';')) { |
| 337 add(node.endToken.value); | 338 add(node.endToken.value); |
| 338 } | 339 } |
| 339 } | 340 } |
| 340 | 341 |
| 341 visitDoWhile(DoWhile node) { | 342 visitDoWhile(DoWhile node) { |
| 342 addToken(node.doKeyword); | 343 add(node.doKeyword.value); |
| 344 if (node.body is !Block) sb.add(' '); |
| 343 visit(node.body); | 345 visit(node.body); |
| 344 sb.add(' '); | 346 add(node.whileKeyword.value); |
| 345 addToken(node.whileKeyword); | |
| 346 visit(node.condition); | 347 visit(node.condition); |
| 347 sb.add(node.endToken.value); | 348 sb.add(node.endToken.value); |
| 348 } | 349 } |
| 349 | 350 |
| 350 visitWhile(While node) { | 351 visitWhile(While node) { |
| 351 addToken(node.whileKeyword); | 352 addToken(node.whileKeyword); |
| 352 visit(node.condition); | 353 visit(node.condition); |
| 353 sb.add(' '); | |
| 354 visit(node.body); | 354 visit(node.body); |
| 355 } | 355 } |
| 356 | 356 |
| 357 visitParenthesizedExpression(ParenthesizedExpression node) { | 357 visitParenthesizedExpression(ParenthesizedExpression node) { |
| 358 add(node.getBeginToken().value); | 358 add(node.getBeginToken().value); |
| 359 visit(node.expression); | 359 visit(node.expression); |
| 360 add(node.getEndToken().value); | 360 add(node.getEndToken().value); |
| 361 } | 361 } |
| 362 | 362 |
| 363 visitStringInterpolation(StringInterpolation node) { | 363 visitStringInterpolation(StringInterpolation node) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 388 visitBreakStatement(BreakStatement node) { | 388 visitBreakStatement(BreakStatement node) { |
| 389 visitGotoStatement(node); | 389 visitGotoStatement(node); |
| 390 } | 390 } |
| 391 | 391 |
| 392 visitContinueStatement(ContinueStatement node) { | 392 visitContinueStatement(ContinueStatement node) { |
| 393 visitGotoStatement(node); | 393 visitGotoStatement(node); |
| 394 } | 394 } |
| 395 | 395 |
| 396 visitForIn(ForIn node) { | 396 visitForIn(ForIn node) { |
| 397 add(node.forToken.value); | 397 add(node.forToken.value); |
| 398 sb.add(' ('); | 398 sb.add('('); |
| 399 visit(node.declaredIdentifier); | 399 visit(node.declaredIdentifier); |
| 400 sb.add(' '); | 400 sb.add(' '); |
| 401 addToken(node.inToken); | 401 addToken(node.inToken); |
| 402 visit(node.expression); | 402 visit(node.expression); |
| 403 sb.add(') '); | 403 sb.add(')'); |
| 404 visit(node.body); | 404 visit(node.body); |
| 405 } | 405 } |
| 406 | 406 |
| 407 visitLabel(Label node) { | 407 visitLabel(Label node) { |
| 408 visit(node.identifier); | 408 visit(node.identifier); |
| 409 add(node.colonToken.value); | 409 add(node.colonToken.value); |
| 410 } | 410 } |
| 411 | 411 |
| 412 visitLabeledStatement(LabeledStatement node) { | 412 visitLabeledStatement(LabeledStatement node) { |
| 413 visit(node.labels); | 413 visit(node.labels); |
| 414 visit(node.statement); | 414 visit(node.statement); |
| 415 } | 415 } |
| 416 | 416 |
| 417 visitLiteralMap(LiteralMap node) { | 417 visitLiteralMap(LiteralMap node) { |
| 418 if (node.constKeyword !== null) { | 418 if (node.constKeyword !== null) add(node.constKeyword.value); |
| 419 add(node.constKeyword.value); | |
| 420 } | |
| 421 if (node.typeArguments !== null) visit(node.typeArguments); | 419 if (node.typeArguments !== null) visit(node.typeArguments); |
| 422 visit(node.entries); | 420 visit(node.entries); |
| 423 } | 421 } |
| 424 | 422 |
| 425 visitLiteralMapEntry(LiteralMapEntry node) { | 423 visitLiteralMapEntry(LiteralMapEntry node) { |
| 426 visit(node.key); | 424 visit(node.key); |
| 427 add(node.colonToken.value); | 425 add(node.colonToken.value); |
| 428 sb.add(' '); | |
| 429 visit(node.value); | 426 visit(node.value); |
| 430 } | 427 } |
| 431 | 428 |
| 432 visitNamedArgument(NamedArgument node) { | 429 visitNamedArgument(NamedArgument node) { |
| 433 visit(node.name); | 430 visit(node.name); |
| 434 add(node.colonToken.value); | 431 add(node.colonToken.value); |
| 435 sb.add(' '); | |
| 436 visit(node.expression); | 432 visit(node.expression); |
| 437 } | 433 } |
| 438 | 434 |
| 439 visitSwitchStatement(SwitchStatement node) { | 435 visitSwitchStatement(SwitchStatement node) { |
| 440 addToken(node.switchKeyword); | 436 addToken(node.switchKeyword); |
| 441 visit(node.parenthesizedExpression); | 437 visit(node.parenthesizedExpression); |
| 442 sb.add(' '); | |
| 443 visit(node.cases); | 438 visit(node.cases); |
| 444 } | 439 } |
| 445 | 440 |
| 446 visitSwitchCase(SwitchCase node) { | 441 visitSwitchCase(SwitchCase node) { |
| 447 visit(node.labelsAndCases); | 442 visit(node.labelsAndCases); |
| 448 if (node.isDefaultCase) { | 443 if (node.isDefaultCase) { |
| 449 sb.add('default:'); | 444 sb.add('default:'); |
| 450 } | 445 } |
| 451 visit(node.statements); | 446 visit(node.statements); |
| 452 } | 447 } |
| 453 | 448 |
| 454 visitScriptTag(ScriptTag node) { | 449 visitScriptTag(ScriptTag node) { |
| 455 add(node.beginToken.value); | 450 add(node.beginToken.value); |
| 456 visit(node.tag); | 451 visit(node.tag); |
| 457 sb.add('('); | 452 sb.add('('); |
| 458 visit(node.argument); | 453 visit(node.argument); |
| 459 if (node.prefixIdentifier !== null) { | 454 if (node.prefixIdentifier !== null) { |
| 460 visit(node.prefixIdentifier); | 455 visit(node.prefixIdentifier); |
| 461 sb.add(': '); | 456 sb.add(':'); |
| 462 visit(node.prefix); | 457 visit(node.prefix); |
| 463 } | 458 } |
| 464 sb.add(')'); | 459 sb.add(')'); |
| 465 add(node.endToken.value); | 460 add(node.endToken.value); |
| 466 } | 461 } |
| 467 | 462 |
| 468 visitTryStatement(TryStatement node) { | 463 visitTryStatement(TryStatement node) { |
| 469 addToken(node.tryKeyword); | 464 add(node.tryKeyword.value); |
| 470 visit(node.tryBlock); | 465 visit(node.tryBlock); |
| 471 visit(node.catchBlocks); | 466 visit(node.catchBlocks); |
| 472 if (node.finallyKeyword !== null) { | 467 if (node.finallyKeyword !== null) { |
| 473 sb.add(' '); | |
| 474 addToken(node.finallyKeyword); | 468 addToken(node.finallyKeyword); |
| 475 visit(node.finallyBlock); | 469 visit(node.finallyBlock); |
| 476 } | 470 } |
| 477 } | 471 } |
| 478 | 472 |
| 479 visitCaseMatch(CaseMatch node) { | 473 visitCaseMatch(CaseMatch node) { |
| 480 add(node.caseKeyword.value); | 474 add(node.caseKeyword.value); |
| 481 sb.add(" "); | 475 sb.add(" "); |
| 482 visit(node.expression); | 476 visit(node.expression); |
| 483 add(node.colonToken.value); | 477 add(node.colonToken.value); |
| 484 } | 478 } |
| 485 | 479 |
| 486 visitCatchBlock(CatchBlock node) { | 480 visitCatchBlock(CatchBlock node) { |
| 487 addToken(node.onKeyword); | 481 addToken(node.onKeyword); |
| 488 visit(node.type); | 482 if (node.type !== null) { |
| 489 sb.add(' '); | 483 visit(node.type); |
| 490 addToken(node.catchKeyword); | 484 sb.add(' '); |
| 485 } |
| 486 add(node.catchKeyword.value); |
| 491 visit(node.formals); | 487 visit(node.formals); |
| 492 sb.add(' '); | |
| 493 visit(node.block); | 488 visit(node.block); |
| 494 } | 489 } |
| 495 | 490 |
| 496 visitTypedef(Typedef node) { | 491 visitTypedef(Typedef node) { |
| 497 addToken(node.typedefKeyword); | 492 addToken(node.typedefKeyword); |
| 498 if (node.returnType !== null) { | 493 if (node.returnType !== null) { |
| 499 visit(node.returnType); | 494 visit(node.returnType); |
| 500 sb.add(' '); | 495 sb.add(' '); |
| 501 } | 496 } |
| 502 visit(node.name); | 497 visit(node.name); |
| 503 if (node.typeParameters !== null) { | 498 if (node.typeParameters !== null) { |
| 504 visit(node.typeParameters); | 499 visit(node.typeParameters); |
| 505 } | 500 } |
| 506 visit(node.formals); | 501 visit(node.formals); |
| 507 add(node.endToken.value); | 502 add(node.endToken.value); |
| 508 } | 503 } |
| 509 } | 504 } |
| OLD | NEW |