Chromium Code Reviews| 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 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 113 visit(node.name); | 119 visit(node.name); |
| 114 } | 120 } |
| 115 visit(node.parameters); | 121 visit(node.parameters); |
| 116 visit(node.initializers); | 122 visit(node.initializers); |
| 117 visit(node.body); | 123 visit(node.body); |
| 118 } | 124 } |
| 119 | 125 |
| 120 visitIdentifier(Identifier node) { | 126 visitIdentifier(Identifier node) { |
| 121 String newName = renamer.renameIdentifier(node); | 127 String newName = renamer.renameIdentifier(node); |
| 122 if (newName == null) { | 128 if (newName == null) { |
| 123 add(node.token.value); | 129 add(node.token.value); |
|
ahe
2012/08/03 06:46:43
Long term, consider if this is simpler using addTo
| |
| 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 // TODO(ahe): handle 'const'. |
|
ahe
2012/08/03 06:46:43
Is this TODO obsolete?
Roman
2012/08/03 08:02:19
I guess so. Removed.
| |
| 172 add(node.newToken.value); | 177 addToken(node.newToken); |
| 173 sb.add(' '); | |
| 174 visit(node.send); | 178 visit(node.send); |
| 175 } | 179 } |
| 176 | 180 |
| 177 visitLiteralList(LiteralList node) { | 181 visitLiteralList(LiteralList node) { |
| 178 if (node.constKeyword !== null) { | 182 addToken(node.constKeyword); |
| 179 add(node.constKeyword.value); | |
| 180 } | |
| 181 if (node.type !== null) { | 183 if (node.type !== null) { |
| 182 sb.add('<'); | 184 sb.add('<'); |
| 183 visit(node.type); | 185 visit(node.type); |
| 184 sb.add('>'); | 186 sb.add('>'); |
| 185 } | 187 } |
| 186 sb.add(' '); | |
| 187 visit(node.elements); | 188 visit(node.elements); |
| 188 } | 189 } |
| 189 | 190 |
| 190 visitModifiers(Modifiers node) => node.visitChildren(this); | 191 visitModifiers(Modifiers node) => node.visitChildren(this); |
| 191 | 192 |
| 192 /** | 193 /** |
| 193 * Unparses given NodeList starting from specific node. | 194 * Unparses given NodeList starting from specific node. |
| 194 */ | 195 */ |
| 195 unparseNodeListFrom(NodeList node, Link<Node> from) { | 196 unparseNodeListFrom(NodeList node, Link<Node> from) { |
| 196 if (from.isEmpty()) return; | 197 if (from.isEmpty()) return; |
| 197 String delimiter = (node.delimiter === null) ? " " : "${node.delimiter}"; | 198 String delimiter = (node.delimiter === null) ? " " : "${node.delimiter}"; |
| 198 visit(from.head); | 199 visit(from.head); |
| 199 for (Link link = from.tail; !link.isEmpty(); link = link.tail) { | 200 for (Link link = from.tail; !link.isEmpty(); link = link.tail) { |
| 200 sb.add(delimiter); | 201 sb.add(delimiter); |
| 201 visit(link.head); | 202 visit(link.head); |
| 202 } | 203 } |
| 203 } | 204 } |
| 204 | 205 |
| 205 visitNodeList(NodeList node) { | 206 visitNodeList(NodeList node) { |
| 206 if (node.beginToken !== null) add(node.beginToken.value); | 207 if (node.beginToken !== null) addToken(node.beginToken); |
| 207 if (node.nodes !== null) { | 208 if (node.nodes !== null) { |
| 208 unparseNodeListFrom(node, node.nodes); | 209 unparseNodeListFrom(node, node.nodes); |
| 209 } | 210 } |
| 210 if (node.endToken !== null) add(node.endToken.value); | 211 if (node.endToken !== null) add(node.endToken.value); |
| 211 } | 212 } |
| 212 | 213 |
| 213 visitOperator(Operator node) { | 214 visitOperator(Operator node) { |
| 214 visitIdentifier(node); | 215 visitIdentifier(node); |
| 215 } | 216 } |
| 216 | 217 |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 339 visit(node.type); | 340 visit(node.type); |
| 340 sb.add(' '); | 341 sb.add(' '); |
| 341 } | 342 } |
| 342 visit(node.definitions); | 343 visit(node.definitions); |
| 343 if (node.endToken.value == const SourceString(';')) { | 344 if (node.endToken.value == const SourceString(';')) { |
| 344 add(node.endToken.value); | 345 add(node.endToken.value); |
| 345 } | 346 } |
| 346 } | 347 } |
| 347 | 348 |
| 348 visitDoWhile(DoWhile node) { | 349 visitDoWhile(DoWhile node) { |
| 349 add(node.doKeyword.value); | 350 addToken(node.doKeyword); |
| 350 sb.add(' '); | |
| 351 visit(node.body); | 351 visit(node.body); |
| 352 sb.add(' '); | 352 sb.add(' '); |
| 353 add(node.whileKeyword.value); | 353 addToken(node.whileKeyword); |
| 354 sb.add(' '); | |
| 355 visit(node.condition); | 354 visit(node.condition); |
| 356 sb.add(node.endToken.value); | 355 sb.add(node.endToken.value); |
| 357 } | 356 } |
| 358 | 357 |
| 359 visitWhile(While node) { | 358 visitWhile(While node) { |
| 360 add(node.whileKeyword.value); | 359 addToken(node.whileKeyword); |
| 361 sb.add(' '); | |
| 362 visit(node.condition); | 360 visit(node.condition); |
| 363 sb.add(' '); | 361 sb.add(' '); |
| 364 visit(node.body); | 362 visit(node.body); |
| 365 } | 363 } |
| 366 | 364 |
| 367 visitParenthesizedExpression(ParenthesizedExpression node) { | 365 visitParenthesizedExpression(ParenthesizedExpression node) { |
| 368 add(node.getBeginToken().value); | 366 add(node.getBeginToken().value); |
| 369 visit(node.expression); | 367 visit(node.expression); |
| 370 add(node.getEndToken().value); | 368 add(node.getEndToken().value); |
| 371 } | 369 } |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 401 | 399 |
| 402 visitContinueStatement(ContinueStatement node) { | 400 visitContinueStatement(ContinueStatement node) { |
| 403 visitGotoStatement(node); | 401 visitGotoStatement(node); |
| 404 } | 402 } |
| 405 | 403 |
| 406 visitForIn(ForIn node) { | 404 visitForIn(ForIn node) { |
| 407 add(node.forToken.value); | 405 add(node.forToken.value); |
| 408 sb.add(' ('); | 406 sb.add(' ('); |
| 409 visit(node.declaredIdentifier); | 407 visit(node.declaredIdentifier); |
| 410 sb.add(' '); | 408 sb.add(' '); |
| 411 add(node.inToken.value); | 409 addToken(node.inToken); |
| 412 sb.add(' '); | |
| 413 visit(node.expression); | 410 visit(node.expression); |
| 414 sb.add(') '); | 411 sb.add(') '); |
| 415 visit(node.body); | 412 visit(node.body); |
| 416 } | 413 } |
| 417 | 414 |
| 418 visitLabel(Label node) { | 415 visitLabel(Label node) { |
| 419 visit(node.identifier); | 416 visit(node.identifier); |
| 420 add(node.colonToken.value); | 417 add(node.colonToken.value); |
| 421 } | 418 } |
| 422 | 419 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 441 } | 438 } |
| 442 | 439 |
| 443 visitNamedArgument(NamedArgument node) { | 440 visitNamedArgument(NamedArgument node) { |
| 444 visit(node.name); | 441 visit(node.name); |
| 445 add(node.colonToken.value); | 442 add(node.colonToken.value); |
| 446 sb.add(' '); | 443 sb.add(' '); |
| 447 visit(node.expression); | 444 visit(node.expression); |
| 448 } | 445 } |
| 449 | 446 |
| 450 visitSwitchStatement(SwitchStatement node) { | 447 visitSwitchStatement(SwitchStatement node) { |
| 451 add(node.switchKeyword.value); | 448 addToken(node.switchKeyword); |
| 452 sb.add(' '); | |
| 453 visit(node.parenthesizedExpression); | 449 visit(node.parenthesizedExpression); |
| 454 sb.add(' '); | 450 sb.add(' '); |
| 455 visit(node.cases); | 451 visit(node.cases); |
| 456 } | 452 } |
| 457 | 453 |
| 458 visitSwitchCase(SwitchCase node) { | 454 visitSwitchCase(SwitchCase node) { |
| 459 visit(node.labelsAndCases); | 455 visit(node.labelsAndCases); |
| 460 if (node.isDefaultCase) { | 456 if (node.isDefaultCase) { |
| 461 sb.add('default:'); | 457 sb.add('default:'); |
| 462 } | 458 } |
| 463 visit(node.statements); | 459 visit(node.statements); |
| 464 } | 460 } |
| 465 | 461 |
| 466 visitScriptTag(ScriptTag node) { | 462 visitScriptTag(ScriptTag node) { |
| 467 add(node.beginToken.value); | 463 add(node.beginToken.value); |
| 468 visit(node.tag); | 464 visit(node.tag); |
| 469 sb.add('('); | 465 sb.add('('); |
| 470 visit(node.argument); | 466 visit(node.argument); |
| 471 if (node.prefixIdentifier !== null) { | 467 if (node.prefixIdentifier !== null) { |
| 472 visit(node.prefixIdentifier); | 468 visit(node.prefixIdentifier); |
| 473 sb.add(': '); | 469 sb.add(': '); |
| 474 visit(node.prefix); | 470 visit(node.prefix); |
| 475 } | 471 } |
| 476 sb.add(')'); | 472 sb.add(')'); |
| 477 add(node.endToken.value); | 473 add(node.endToken.value); |
| 478 } | 474 } |
| 479 | 475 |
| 480 visitTryStatement(TryStatement node) { | 476 visitTryStatement(TryStatement node) { |
| 481 add(node.tryKeyword.value); | 477 addToken(node.tryKeyword); |
| 482 sb.add(' '); | |
| 483 visit(node.tryBlock); | 478 visit(node.tryBlock); |
| 484 visit(node.catchBlocks); | 479 visit(node.catchBlocks); |
| 485 if (node.finallyKeyword !== null) { | 480 if (node.finallyKeyword !== null) { |
| 486 sb.add(' '); | 481 sb.add(' '); |
| 487 add(node.finallyKeyword.value); | 482 addToken(node.finallyKeyword); |
| 488 sb.add(' '); | |
| 489 visit(node.finallyBlock); | 483 visit(node.finallyBlock); |
| 490 } | 484 } |
| 491 } | 485 } |
| 492 | 486 |
| 493 visitCaseMatch(CaseMatch node) { | 487 visitCaseMatch(CaseMatch node) { |
| 494 add(node.caseKeyword.value); | 488 add(node.caseKeyword.value); |
| 495 sb.add(" "); | 489 sb.add(" "); |
| 496 visit(node.expression); | 490 visit(node.expression); |
| 497 add(node.colonToken.value); | 491 add(node.colonToken.value); |
| 498 } | 492 } |
| 499 | 493 |
| 500 visitCatchBlock(CatchBlock node) { | 494 visitCatchBlock(CatchBlock node) { |
| 501 add(node.catchKeyword.value); | 495 addToken(node.catchKeyword); |
| 502 sb.add(' '); | |
| 503 visit(node.formals); | 496 visit(node.formals); |
| 504 sb.add(' '); | 497 sb.add(' '); |
| 505 visit(node.block); | 498 visit(node.block); |
| 506 } | 499 } |
| 507 | 500 |
| 508 visitTypedef(Typedef node) { | 501 visitTypedef(Typedef node) { |
| 509 add(node.typedefKeyword.value); | 502 addToken(node.typedefKeyword); |
| 510 sb.add(' '); | |
| 511 if (node.returnType !== null) { | 503 if (node.returnType !== null) { |
| 512 visit(node.returnType); | 504 visit(node.returnType); |
| 513 sb.add(' '); | 505 sb.add(' '); |
| 514 } | 506 } |
| 515 visit(node.name); | 507 visit(node.name); |
| 516 if (node.typeParameters !== null) { | 508 if (node.typeParameters !== null) { |
| 517 visit(node.typeParameters); | 509 visit(node.typeParameters); |
| 518 } | 510 } |
| 519 visit(node.formals); | 511 visit(node.formals); |
| 520 add(node.endToken.value); | 512 add(node.endToken.value); |
| 521 } | 513 } |
| 522 } | 514 } |
| OLD | NEW |