| 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. |
| 6 typedef String Renamer(Node node); |
| 7 |
| 5 class Unparser implements Visitor { | 8 class Unparser implements Visitor { |
| 6 final Renamer renamer; | 9 final Renamer rename; |
| 7 StringBuffer sb; | 10 StringBuffer sb; |
| 8 | 11 |
| 9 Unparser([this.renamer = const Renamer()]); | 12 Unparser() : this.withRenamer((Node) => null); |
| 13 Unparser.withRenamer(this.rename); |
| 10 | 14 |
| 11 String unparse(Node node) { | 15 String unparse(Node node) { |
| 12 sb = new StringBuffer(); | 16 sb = new StringBuffer(); |
| 13 visit(node); | 17 visit(node); |
| 14 return sb.toString(); | 18 return sb.toString(); |
| 15 } | 19 } |
| 16 | 20 |
| 17 void add(SourceString string) { | 21 void add(SourceString string) { |
| 18 string.printOn(sb); | 22 string.printOn(sb); |
| 19 } | 23 } |
| 20 | 24 |
| 21 void addToken(Token token) { | 25 void addToken(Token token) { |
| 22 if (token === null) return; | 26 if (token === null) return; |
| 23 add(token.value); | 27 add(token.value); |
| 24 if (token.kind === KEYWORD_TOKEN || token.kind === IDENTIFIER_TOKEN) { | 28 if (token.kind === KEYWORD_TOKEN || token.kind === IDENTIFIER_TOKEN) { |
| 25 sb.add(' '); | 29 sb.add(' '); |
| 26 } | 30 } |
| 27 } | 31 } |
| 28 | 32 |
| 29 visit(Node node) { | 33 visit(Node node) { |
| 30 if (node !== null) node.accept(this); | 34 if (node === null) return; |
| 35 String renamed = rename(node); |
| 36 if (renamed !== null) { |
| 37 sb.add(renamed); |
| 38 } else { |
| 39 // Fallback. |
| 40 node.accept(this); |
| 41 } |
| 31 } | 42 } |
| 32 | 43 |
| 33 visitBlock(Block node) { | 44 visitBlock(Block node) { |
| 34 visit(node.statements); | 45 visit(node.statements); |
| 35 } | 46 } |
| 36 | 47 |
| 37 visitCascade(Cascade node) { | 48 visitCascade(Cascade node) { |
| 38 visit(node.expression); | 49 visit(node.expression); |
| 39 } | 50 } |
| 40 | 51 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 visit(send.selector); | 131 visit(send.selector); |
| 121 } else { | 132 } else { |
| 122 visit(node.name); | 133 visit(node.name); |
| 123 } | 134 } |
| 124 visit(node.parameters); | 135 visit(node.parameters); |
| 125 visit(node.initializers); | 136 visit(node.initializers); |
| 126 visit(node.body); | 137 visit(node.body); |
| 127 } | 138 } |
| 128 | 139 |
| 129 visitIdentifier(Identifier node) { | 140 visitIdentifier(Identifier node) { |
| 130 String newName = renamer.renameIdentifier(node); | 141 add(node.token.value); |
| 131 if (newName === null) { | |
| 132 add(node.token.value); | |
| 133 } else { | |
| 134 sb.add(newName); | |
| 135 } | |
| 136 } | 142 } |
| 137 | 143 |
| 138 visitIf(If node) { | 144 visitIf(If node) { |
| 139 add(node.ifToken.value); | 145 add(node.ifToken.value); |
| 140 visit(node.condition); | 146 visit(node.condition); |
| 141 visit(node.thenPart); | 147 visit(node.thenPart); |
| 142 if (node.hasElsePart) { | 148 if (node.hasElsePart) { |
| 143 addToken(node.elseToken); | 149 addToken(node.elseToken); |
| 144 visit(node.elsePart); | 150 visit(node.elsePart); |
| 145 } | 151 } |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 } | 233 } |
| 228 | 234 |
| 229 unparseSendPart(Send node) { | 235 unparseSendPart(Send node) { |
| 230 Operator op = node.selector.asOperator(); | 236 Operator op = node.selector.asOperator(); |
| 231 bool spacesNeeded = op !== null && | 237 bool spacesNeeded = op !== null && |
| 232 (op.source.stringValue === 'is' || op.source.stringValue == 'as'); | 238 (op.source.stringValue === 'is' || op.source.stringValue == 'as'); |
| 233 | 239 |
| 234 if (node.isPrefix) { | 240 if (node.isPrefix) { |
| 235 visit(node.selector); | 241 visit(node.selector); |
| 236 } | 242 } |
| 237 if (node.receiver !== null) { | 243 // TODO(smok): Remove ugly hack for library preferences. |
| 244 // Check that renamer does not want to omit receiver at all, |
| 245 // in that case we don't need spaces or dot. |
| 246 if (node.receiver !== null && rename(node.receiver) != '') { |
| 238 visit(node.receiver); | 247 visit(node.receiver); |
| 239 CascadeReceiver asCascadeReceiver = node.receiver.asCascadeReceiver(); | 248 CascadeReceiver asCascadeReceiver = node.receiver.asCascadeReceiver(); |
| 240 if (asCascadeReceiver !== null) { | 249 if (asCascadeReceiver !== null) { |
| 241 add(asCascadeReceiver.cascadeOperator.value); | 250 add(asCascadeReceiver.cascadeOperator.value); |
| 242 } else if (op === null) { | 251 } else if (op === null) { |
| 243 sb.add('.'); | 252 sb.add('.'); |
| 244 } else if (spacesNeeded) { | 253 } else if (spacesNeeded) { |
| 245 sb.add(' '); | 254 sb.add(' '); |
| 246 } | 255 } |
| 247 } | 256 } |
| 248 if (!node.isPrefix && !node.isIndex) { | 257 if (!node.isPrefix && !node.isIndex) { |
| 249 visit(node.selector); | 258 visit(node.selector); |
| 250 } | 259 } |
| 251 if (spacesNeeded) { | 260 if (spacesNeeded) { |
| 252 sb.add(' '); | 261 sb.add(' '); |
| 253 } | 262 } |
| 254 } | 263 } |
| 255 | 264 |
| 256 unparseSend(Send node) { | 265 unparseSend(Send node) { |
| 257 unparseSendPart(node); | 266 unparseSendPart(node); |
| 258 visit(node.argumentsNode); | 267 visit(node.argumentsNode); |
| 259 } | 268 } |
| 260 | 269 |
| 261 visitSend(Send node) { | 270 visitSend(Send node) { |
| 262 String newMethodName = renamer.renameSendMethod(node); | 271 unparseSendPart(node); |
| 263 if (newMethodName !== null) { | 272 visit(node.argumentsNode); |
| 264 sb.add(newMethodName); | |
| 265 visit(node.argumentsNode); | |
| 266 } else { | |
| 267 unparseSendPart(node); | |
| 268 visit(node.argumentsNode); | |
| 269 } | |
| 270 } | 273 } |
| 271 | 274 |
| 272 /** | 275 /** |
| 273 * Special case for assignments like "list[0] = 1". | 276 * Special case for assignments like "list[0] = 1". |
| 274 */ | 277 */ |
| 275 unparseIndexedSet(SendSet node) { | 278 unparseIndexedSet(SendSet node) { |
| 276 if (node.isPrefix) { | 279 if (node.isPrefix) { |
| 277 add(node.assignmentOperator.token.value); | 280 add(node.assignmentOperator.token.value); |
| 278 } | 281 } |
| 279 visit(node.receiver); | 282 visit(node.receiver); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 308 visitThrow(Throw node) { | 311 visitThrow(Throw node) { |
| 309 add(node.throwToken.value); | 312 add(node.throwToken.value); |
| 310 if (node.expression !== null) { | 313 if (node.expression !== null) { |
| 311 sb.add(' '); | 314 sb.add(' '); |
| 312 visit(node.expression); | 315 visit(node.expression); |
| 313 } | 316 } |
| 314 node.endToken.value.printOn(sb); | 317 node.endToken.value.printOn(sb); |
| 315 } | 318 } |
| 316 | 319 |
| 317 visitTypeAnnotation(TypeAnnotation node) { | 320 visitTypeAnnotation(TypeAnnotation node) { |
| 318 String newName = renamer.renameTypeName(node); | 321 visit(node.typeName); |
| 319 if (newName !== null) { | 322 visit(node.typeArguments); |
| 320 sb.add(newName); | |
| 321 visit(node.typeArguments); | |
| 322 } else { | |
| 323 // Fallback to default unparse without renaming. | |
| 324 node.visitChildren(this); | |
| 325 } | |
| 326 } | 323 } |
| 327 | 324 |
| 328 visitTypeVariable(TypeVariable node) { | 325 visitTypeVariable(TypeVariable node) { |
| 329 visit(node.name); | 326 visit(node.name); |
| 330 if (node.bound !== null) { | 327 if (node.bound !== null) { |
| 331 sb.add(' extends '); | 328 sb.add(' extends '); |
| 332 visit(node.bound); | 329 visit(node.bound); |
| 333 } | 330 } |
| 334 } | 331 } |
| 335 | 332 |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 507 sb.add(' '); | 504 sb.add(' '); |
| 508 } | 505 } |
| 509 visit(node.name); | 506 visit(node.name); |
| 510 if (node.typeParameters !== null) { | 507 if (node.typeParameters !== null) { |
| 511 visit(node.typeParameters); | 508 visit(node.typeParameters); |
| 512 } | 509 } |
| 513 visit(node.formals); | 510 visit(node.formals); |
| 514 add(node.endToken.value); | 511 add(node.endToken.value); |
| 515 } | 512 } |
| 516 } | 513 } |
| OLD | NEW |