| 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 class Unparser implements Visitor { | 5 class Unparser implements Visitor { |
| 6 final Renamer renamer; | 6 final Renamer renamer; |
| 7 StringBuffer sb; | 7 StringBuffer sb; |
| 8 | 8 |
| 9 Unparser([this.renamer = const Renamer()]); | 9 Unparser([this.renamer = const Renamer()]); |
| 10 | 10 |
| 11 String unparse(Node node) { | 11 String unparse(Node node) { |
| 12 sb = new StringBuffer(); | 12 sb = new StringBuffer(); |
| 13 visit(node); | 13 visit(node); |
| 14 return sb.toString(); | 14 return sb.toString(); |
| 15 } | 15 } |
| 16 | 16 |
| 17 void add(SourceString string) { | 17 void add(SourceString string) { |
| 18 string.printOn(sb); | 18 string.printOn(sb); |
| 19 } | 19 } |
| 20 | 20 |
| 21 void addToken(Token token) { |
| 22 if (token === null) return; |
| 23 add(token.value); |
| 24 if (token.kind === KEYWORD_TOKEN || token.kind === IDENTIFIER_TOKEN) { |
| 25 sb.add(' '); |
| 26 } |
| 27 } |
| 28 |
| 21 visit(Node node) { | 29 visit(Node node) { |
| 22 if (node !== null) node.accept(this); | 30 if (node !== null) node.accept(this); |
| 23 } | 31 } |
| 24 | 32 |
| 25 visitBlock(Block node) { | 33 visitBlock(Block node) { |
| 26 visit(node.statements); | 34 visit(node.statements); |
| 27 } | 35 } |
| 28 | 36 |
| 29 visitCascade(Cascade node) { | 37 visitCascade(Cascade node) { |
| 30 visit(node.expression); | 38 visit(node.expression); |
| 31 } | 39 } |
| 32 | 40 |
| 33 visitCascadeReceiver(CascadeReceiver node) { | 41 visitCascadeReceiver(CascadeReceiver node) { |
| 34 visit(node.expression); | 42 visit(node.expression); |
| 35 } | 43 } |
| 36 | 44 |
| 37 visitClassNode(ClassNode node) { | 45 visitClassNode(ClassNode node) { |
| 38 node.beginToken.value.printOn(sb); | 46 addToken(node.beginToken); |
| 39 sb.add(' '); | |
| 40 visit(node.name); | 47 visit(node.name); |
| 41 sb.add(' '); | 48 sb.add(' '); |
| 42 if (node.extendsKeyword !== null) { | 49 if (node.extendsKeyword !== null) { |
| 43 node.extendsKeyword.value.printOn(sb); | 50 addToken(node.extendsKeyword); |
| 44 sb.add(' '); | |
| 45 visit(node.superclass); | 51 visit(node.superclass); |
| 46 sb.add(' '); | 52 sb.add(' '); |
| 47 } | 53 } |
| 48 visit(node.interfaces); | 54 visit(node.interfaces); |
| 49 if (node.defaultClause !== null) { | 55 if (node.defaultClause !== null) { |
| 50 visit(node.defaultClause); | 56 visit(node.defaultClause); |
| 51 sb.add(' '); | 57 sb.add(' '); |
| 52 } | 58 } |
| 53 sb.add('{\n'); | 59 sb.add('{\n'); |
| 54 sb.add('}\n'); | 60 sb.add('}\n'); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 } else { | 130 } else { |
| 125 sb.add(newName); | 131 sb.add(newName); |
| 126 } | 132 } |
| 127 } | 133 } |
| 128 | 134 |
| 129 visitIf(If node) { | 135 visitIf(If node) { |
| 130 add(node.ifToken.value); | 136 add(node.ifToken.value); |
| 131 visit(node.condition); | 137 visit(node.condition); |
| 132 visit(node.thenPart); | 138 visit(node.thenPart); |
| 133 if (node.hasElsePart) { | 139 if (node.hasElsePart) { |
| 134 add(node.elseToken.value); | 140 addToken(node.elseToken); |
| 135 sb.add(' '); | |
| 136 visit(node.elsePart); | 141 visit(node.elsePart); |
| 137 } | 142 } |
| 138 } | 143 } |
| 139 | 144 |
| 140 visitLiteralBool(LiteralBool node) { | 145 visitLiteralBool(LiteralBool node) { |
| 141 add(node.token.value); | 146 add(node.token.value); |
| 142 } | 147 } |
| 143 | 148 |
| 144 visitLiteralDouble(LiteralDouble node) { | 149 visitLiteralDouble(LiteralDouble node) { |
| 145 add(node.token.value); | 150 add(node.token.value); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 161 visit(node.first); | 166 visit(node.first); |
| 162 sb.add(" "); | 167 sb.add(" "); |
| 163 visit(node.second); | 168 visit(node.second); |
| 164 } | 169 } |
| 165 | 170 |
| 166 visitLiteralNull(LiteralNull node) { | 171 visitLiteralNull(LiteralNull node) { |
| 167 add(node.token.value); | 172 add(node.token.value); |
| 168 } | 173 } |
| 169 | 174 |
| 170 visitNewExpression(NewExpression node) { | 175 visitNewExpression(NewExpression node) { |
| 171 // TODO(ahe): handle 'const'. | 176 addToken(node.newToken); |
| 172 add(node.newToken.value); | |
| 173 sb.add(' '); | |
| 174 visit(node.send); | 177 visit(node.send); |
| 175 } | 178 } |
| 176 | 179 |
| 177 visitLiteralList(LiteralList node) { | 180 visitLiteralList(LiteralList node) { |
| 178 if (node.constKeyword !== null) { | 181 addToken(node.constKeyword); |
| 179 add(node.constKeyword.value); | |
| 180 } | |
| 181 if (node.type !== null) { | 182 if (node.type !== null) { |
| 182 sb.add('<'); | 183 sb.add('<'); |
| 183 visit(node.type); | 184 visit(node.type); |
| 184 sb.add('>'); | 185 sb.add('>'); |
| 185 } | 186 } |
| 186 sb.add(' '); | |
| 187 visit(node.elements); | 187 visit(node.elements); |
| 188 } | 188 } |
| 189 | 189 |
| 190 visitModifiers(Modifiers node) => node.visitChildren(this); | 190 visitModifiers(Modifiers node) => node.visitChildren(this); |
| 191 | 191 |
| 192 /** | 192 /** |
| 193 * Unparses given NodeList starting from specific node. | 193 * Unparses given NodeList starting from specific node. |
| 194 */ | 194 */ |
| 195 unparseNodeListFrom(NodeList node, Link<Node> from) { | 195 unparseNodeListFrom(NodeList node, Link<Node> from) { |
| 196 if (from.isEmpty()) return; | 196 if (from.isEmpty()) return; |
| 197 String delimiter = (node.delimiter === null) ? " " : "${node.delimiter}"; | 197 String delimiter = (node.delimiter === null) ? " " : "${node.delimiter}"; |
| 198 visit(from.head); | 198 visit(from.head); |
| 199 for (Link link = from.tail; !link.isEmpty(); link = link.tail) { | 199 for (Link link = from.tail; !link.isEmpty(); link = link.tail) { |
| 200 sb.add(delimiter); | 200 sb.add(delimiter); |
| 201 visit(link.head); | 201 visit(link.head); |
| 202 } | 202 } |
| 203 } | 203 } |
| 204 | 204 |
| 205 visitNodeList(NodeList node) { | 205 visitNodeList(NodeList node) { |
| 206 if (node.beginToken !== null) add(node.beginToken.value); | 206 if (node.beginToken !== null) addToken(node.beginToken); |
| 207 if (node.nodes !== null) { | 207 if (node.nodes !== null) { |
| 208 unparseNodeListFrom(node, node.nodes); | 208 unparseNodeListFrom(node, node.nodes); |
| 209 } | 209 } |
| 210 if (node.endToken !== null) add(node.endToken.value); | 210 if (node.endToken !== null) add(node.endToken.value); |
| 211 } | 211 } |
| 212 | 212 |
| 213 visitOperator(Operator node) { | 213 visitOperator(Operator node) { |
| 214 visitIdentifier(node); | 214 visitIdentifier(node); |
| 215 } | 215 } |
| 216 | 216 |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 visit(node.type); | 339 visit(node.type); |
| 340 sb.add(' '); | 340 sb.add(' '); |
| 341 } | 341 } |
| 342 visit(node.definitions); | 342 visit(node.definitions); |
| 343 if (node.endToken.value == const SourceString(';')) { | 343 if (node.endToken.value == const SourceString(';')) { |
| 344 add(node.endToken.value); | 344 add(node.endToken.value); |
| 345 } | 345 } |
| 346 } | 346 } |
| 347 | 347 |
| 348 visitDoWhile(DoWhile node) { | 348 visitDoWhile(DoWhile node) { |
| 349 add(node.doKeyword.value); | 349 addToken(node.doKeyword); |
| 350 sb.add(' '); | |
| 351 visit(node.body); | 350 visit(node.body); |
| 352 sb.add(' '); | 351 sb.add(' '); |
| 353 add(node.whileKeyword.value); | 352 addToken(node.whileKeyword); |
| 354 sb.add(' '); | |
| 355 visit(node.condition); | 353 visit(node.condition); |
| 356 sb.add(node.endToken.value); | 354 sb.add(node.endToken.value); |
| 357 } | 355 } |
| 358 | 356 |
| 359 visitWhile(While node) { | 357 visitWhile(While node) { |
| 360 add(node.whileKeyword.value); | 358 addToken(node.whileKeyword); |
| 361 sb.add(' '); | |
| 362 visit(node.condition); | 359 visit(node.condition); |
| 363 sb.add(' '); | 360 sb.add(' '); |
| 364 visit(node.body); | 361 visit(node.body); |
| 365 } | 362 } |
| 366 | 363 |
| 367 visitParenthesizedExpression(ParenthesizedExpression node) { | 364 visitParenthesizedExpression(ParenthesizedExpression node) { |
| 368 add(node.getBeginToken().value); | 365 add(node.getBeginToken().value); |
| 369 visit(node.expression); | 366 visit(node.expression); |
| 370 add(node.getEndToken().value); | 367 add(node.getEndToken().value); |
| 371 } | 368 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 401 | 398 |
| 402 visitContinueStatement(ContinueStatement node) { | 399 visitContinueStatement(ContinueStatement node) { |
| 403 visitGotoStatement(node); | 400 visitGotoStatement(node); |
| 404 } | 401 } |
| 405 | 402 |
| 406 visitForIn(ForIn node) { | 403 visitForIn(ForIn node) { |
| 407 add(node.forToken.value); | 404 add(node.forToken.value); |
| 408 sb.add(' ('); | 405 sb.add(' ('); |
| 409 visit(node.declaredIdentifier); | 406 visit(node.declaredIdentifier); |
| 410 sb.add(' '); | 407 sb.add(' '); |
| 411 add(node.inToken.value); | 408 addToken(node.inToken); |
| 412 sb.add(' '); | |
| 413 visit(node.expression); | 409 visit(node.expression); |
| 414 sb.add(') '); | 410 sb.add(') '); |
| 415 visit(node.body); | 411 visit(node.body); |
| 416 } | 412 } |
| 417 | 413 |
| 418 visitLabel(Label node) { | 414 visitLabel(Label node) { |
| 419 visit(node.identifier); | 415 visit(node.identifier); |
| 420 add(node.colonToken.value); | 416 add(node.colonToken.value); |
| 421 } | 417 } |
| 422 | 418 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 441 } | 437 } |
| 442 | 438 |
| 443 visitNamedArgument(NamedArgument node) { | 439 visitNamedArgument(NamedArgument node) { |
| 444 visit(node.name); | 440 visit(node.name); |
| 445 add(node.colonToken.value); | 441 add(node.colonToken.value); |
| 446 sb.add(' '); | 442 sb.add(' '); |
| 447 visit(node.expression); | 443 visit(node.expression); |
| 448 } | 444 } |
| 449 | 445 |
| 450 visitSwitchStatement(SwitchStatement node) { | 446 visitSwitchStatement(SwitchStatement node) { |
| 451 add(node.switchKeyword.value); | 447 addToken(node.switchKeyword); |
| 452 sb.add(' '); | |
| 453 visit(node.parenthesizedExpression); | 448 visit(node.parenthesizedExpression); |
| 454 sb.add(' '); | 449 sb.add(' '); |
| 455 visit(node.cases); | 450 visit(node.cases); |
| 456 } | 451 } |
| 457 | 452 |
| 458 visitSwitchCase(SwitchCase node) { | 453 visitSwitchCase(SwitchCase node) { |
| 459 visit(node.labelsAndCases); | 454 visit(node.labelsAndCases); |
| 460 if (node.isDefaultCase) { | 455 if (node.isDefaultCase) { |
| 461 sb.add('default:'); | 456 sb.add('default:'); |
| 462 } | 457 } |
| 463 visit(node.statements); | 458 visit(node.statements); |
| 464 } | 459 } |
| 465 | 460 |
| 466 visitScriptTag(ScriptTag node) { | 461 visitScriptTag(ScriptTag node) { |
| 467 add(node.beginToken.value); | 462 add(node.beginToken.value); |
| 468 visit(node.tag); | 463 visit(node.tag); |
| 469 sb.add('('); | 464 sb.add('('); |
| 470 visit(node.argument); | 465 visit(node.argument); |
| 471 if (node.prefixIdentifier !== null) { | 466 if (node.prefixIdentifier !== null) { |
| 472 visit(node.prefixIdentifier); | 467 visit(node.prefixIdentifier); |
| 473 sb.add(': '); | 468 sb.add(': '); |
| 474 visit(node.prefix); | 469 visit(node.prefix); |
| 475 } | 470 } |
| 476 sb.add(')'); | 471 sb.add(')'); |
| 477 add(node.endToken.value); | 472 add(node.endToken.value); |
| 478 } | 473 } |
| 479 | 474 |
| 480 visitTryStatement(TryStatement node) { | 475 visitTryStatement(TryStatement node) { |
| 481 add(node.tryKeyword.value); | 476 addToken(node.tryKeyword); |
| 482 sb.add(' '); | |
| 483 visit(node.tryBlock); | 477 visit(node.tryBlock); |
| 484 visit(node.catchBlocks); | 478 visit(node.catchBlocks); |
| 485 if (node.finallyKeyword !== null) { | 479 if (node.finallyKeyword !== null) { |
| 486 sb.add(' '); | 480 sb.add(' '); |
| 487 add(node.finallyKeyword.value); | 481 addToken(node.finallyKeyword); |
| 488 sb.add(' '); | |
| 489 visit(node.finallyBlock); | 482 visit(node.finallyBlock); |
| 490 } | 483 } |
| 491 } | 484 } |
| 492 | 485 |
| 493 visitCaseMatch(CaseMatch node) { | 486 visitCaseMatch(CaseMatch node) { |
| 494 add(node.caseKeyword.value); | 487 add(node.caseKeyword.value); |
| 495 sb.add(" "); | 488 sb.add(" "); |
| 496 visit(node.expression); | 489 visit(node.expression); |
| 497 add(node.colonToken.value); | 490 add(node.colonToken.value); |
| 498 } | 491 } |
| 499 | 492 |
| 500 visitCatchBlock(CatchBlock node) { | 493 visitCatchBlock(CatchBlock node) { |
| 501 add(node.catchKeyword.value); | 494 addToken(node.catchKeyword); |
| 502 sb.add(' '); | |
| 503 visit(node.formals); | 495 visit(node.formals); |
| 504 sb.add(' '); | 496 sb.add(' '); |
| 505 visit(node.block); | 497 visit(node.block); |
| 506 } | 498 } |
| 507 | 499 |
| 508 visitTypedef(Typedef node) { | 500 visitTypedef(Typedef node) { |
| 509 add(node.typedefKeyword.value); | 501 addToken(node.typedefKeyword); |
| 510 sb.add(' '); | |
| 511 if (node.returnType !== null) { | 502 if (node.returnType !== null) { |
| 512 visit(node.returnType); | 503 visit(node.returnType); |
| 513 sb.add(' '); | 504 sb.add(' '); |
| 514 } | 505 } |
| 515 visit(node.name); | 506 visit(node.name); |
| 516 if (node.typeParameters !== null) { | 507 if (node.typeParameters !== null) { |
| 517 visit(node.typeParameters); | 508 visit(node.typeParameters); |
| 518 } | 509 } |
| 519 visit(node.formals); | 510 visit(node.formals); |
| 520 add(node.endToken.value); | 511 add(node.endToken.value); |
| 521 } | 512 } |
| 522 } | 513 } |
| OLD | NEW |