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; | |
|
ahe
2012/10/01 11:27:27
I'm not really comfortable with this addition. The
Anton Muhin
2012/10/01 13:10:08
I agree with you, Peter, see https://chromiumcoder
ahe
2012/10/01 13:22:42
Thank you, good that we agree on the long term dir
| |
| 6 StringBuffer sb; | 7 StringBuffer sb; |
| 7 | 8 |
| 8 Unparser(); | 9 Unparser([this.renamer = const Renamer()]); |
| 9 | 10 |
| 10 String unparse(Node node) { | 11 String unparse(Node node) { |
| 11 sb = new StringBuffer(); | 12 sb = new StringBuffer(); |
| 12 visit(node); | 13 visit(node); |
| 13 return sb.toString(); | 14 return sb.toString(); |
| 14 } | 15 } |
| 15 | 16 |
| 16 void add(SourceString string) { | 17 void add(SourceString string) { |
| 17 string.printOn(sb); | 18 string.printOn(sb); |
| 18 } | 19 } |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 110 visit(send.selector); | 111 visit(send.selector); |
| 111 } else { | 112 } else { |
| 112 visit(node.name); | 113 visit(node.name); |
| 113 } | 114 } |
| 114 visit(node.parameters); | 115 visit(node.parameters); |
| 115 visit(node.initializers); | 116 visit(node.initializers); |
| 116 visit(node.body); | 117 visit(node.body); |
| 117 } | 118 } |
| 118 | 119 |
| 119 visitIdentifier(Identifier node) { | 120 visitIdentifier(Identifier node) { |
| 120 add(node.token.value); | 121 String newName = renamer.renameIdentifier(node); |
| 122 if (newName == null) { | |
| 123 add(node.token.value); | |
| 124 } else { | |
| 125 sb.add(newName); | |
| 126 } | |
| 121 } | 127 } |
| 122 | 128 |
| 123 visitIf(If node) { | 129 visitIf(If node) { |
| 124 add(node.ifToken.value); | 130 add(node.ifToken.value); |
| 125 visit(node.condition); | 131 visit(node.condition); |
| 126 visit(node.thenPart); | 132 visit(node.thenPart); |
| 127 if (node.hasElsePart) { | 133 if (node.hasElsePart) { |
| 128 add(node.elseToken.value); | 134 add(node.elseToken.value); |
| 129 sb.add(' '); | 135 sb.add(' '); |
| 130 visit(node.elsePart); | 136 visit(node.elsePart); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 176 sb.add(' '); | 182 sb.add(' '); |
| 177 visit(node.elements); | 183 visit(node.elements); |
| 178 } | 184 } |
| 179 | 185 |
| 180 visitModifiers(Modifiers node) => node.visitChildren(this); | 186 visitModifiers(Modifiers node) => node.visitChildren(this); |
| 181 | 187 |
| 182 /** | 188 /** |
| 183 * Unparses given NodeList starting from specific node. | 189 * Unparses given NodeList starting from specific node. |
| 184 */ | 190 */ |
| 185 unparseNodeListFrom(NodeList node, Link<Node> from) { | 191 unparseNodeListFrom(NodeList node, Link<Node> from) { |
| 192 if (from.isEmpty()) return; | |
| 186 String delimiter = (node.delimiter === null) ? " " : "${node.delimiter} "; | 193 String delimiter = (node.delimiter === null) ? " " : "${node.delimiter} "; |
| 187 from.printOn(sb, delimiter); | 194 visit(from.head); |
| 195 for (Link link = from.tail; !link.isEmpty(); link = link.tail) { | |
| 196 sb.add(delimiter); | |
| 197 visit(link.head); | |
| 198 } | |
| 188 } | 199 } |
| 189 | 200 |
| 190 visitNodeList(NodeList node) { | 201 visitNodeList(NodeList node) { |
| 191 if (node.beginToken !== null) add(node.beginToken.value); | 202 if (node.beginToken !== null) add(node.beginToken.value); |
| 192 if (node.nodes !== null) { | 203 if (node.nodes !== null) { |
| 193 unparseNodeListFrom(node, node.nodes); | 204 unparseNodeListFrom(node, node.nodes); |
| 194 } | 205 } |
| 195 if (node.endToken !== null) add(node.endToken.value); | 206 if (node.endToken !== null) add(node.endToken.value); |
| 196 } | 207 } |
| 197 | 208 |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 224 } | 235 } |
| 225 } | 236 } |
| 226 if (!node.isPrefix && !node.isIndex) { | 237 if (!node.isPrefix && !node.isIndex) { |
| 227 visit(node.selector); | 238 visit(node.selector); |
| 228 } | 239 } |
| 229 if (isCheck) { | 240 if (isCheck) { |
| 230 sb.add(' '); | 241 sb.add(' '); |
| 231 } | 242 } |
| 232 } | 243 } |
| 233 | 244 |
| 234 visitSend(Send node) { | 245 unparseSend(Send node) { |
| 235 unparseSendPart(node); | 246 unparseSendPart(node); |
| 236 visit(node.argumentsNode); | 247 visit(node.argumentsNode); |
| 237 } | 248 } |
| 238 | 249 |
| 250 visitSend(Send node) { | |
| 251 String newMethodName = renamer.renameSendMethod(node); | |
| 252 if (newMethodName !== null) { | |
| 253 sb.add(newMethodName); | |
| 254 visit(node.argumentsNode); | |
| 255 } else { | |
| 256 unparseSendPart(node); | |
| 257 visit(node.argumentsNode); | |
| 258 } | |
| 259 } | |
| 260 | |
| 239 /** | 261 /** |
| 240 * Special case for assignments like "list[0] = 1". | 262 * Special case for assignments like "list[0] = 1". |
| 241 */ | 263 */ |
| 242 unparseIndexedSet(SendSet node) { | 264 unparseIndexedSet(SendSet node) { |
| 243 if (node.isPrefix) { | 265 if (node.isPrefix) { |
| 244 add(node.assignmentOperator.token.value); | 266 add(node.assignmentOperator.token.value); |
| 245 } | 267 } |
| 246 visit(node.receiver); | 268 visit(node.receiver); |
| 247 sb.add('['); | 269 sb.add('['); |
| 248 sb.add(node.arguments.head); | 270 sb.add(node.arguments.head); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 271 visitThrow(Throw node) { | 293 visitThrow(Throw node) { |
| 272 add(node.throwToken.value); | 294 add(node.throwToken.value); |
| 273 if (node.expression !== null) { | 295 if (node.expression !== null) { |
| 274 sb.add(' '); | 296 sb.add(' '); |
| 275 visit(node.expression); | 297 visit(node.expression); |
| 276 } | 298 } |
| 277 node.endToken.value.printOn(sb); | 299 node.endToken.value.printOn(sb); |
| 278 } | 300 } |
| 279 | 301 |
| 280 visitTypeAnnotation(TypeAnnotation node) { | 302 visitTypeAnnotation(TypeAnnotation node) { |
| 281 node.visitChildren(this); | 303 String newName = renamer.renameTypeName(node); |
| 304 if (newName !== null) { | |
| 305 sb.add(newName); | |
| 306 visit(node.typeArguments); | |
| 307 } else { | |
| 308 // Fallback to default unparse without renaming. | |
| 309 node.visitChildren(this); | |
| 310 } | |
| 282 } | 311 } |
| 283 | 312 |
| 284 visitTypeVariable(TypeVariable node) { | 313 visitTypeVariable(TypeVariable node) { |
| 285 visit(node.name); | 314 visit(node.name); |
| 286 if (node.bound !== null) { | 315 if (node.bound !== null) { |
| 287 sb.add(' extends '); | 316 sb.add(' extends '); |
| 288 visit(node.bound); | 317 visit(node.bound); |
| 289 } | 318 } |
| 290 } | 319 } |
| 291 | 320 |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 472 sb.add(' '); | 501 sb.add(' '); |
| 473 } | 502 } |
| 474 visit(node.name); | 503 visit(node.name); |
| 475 if (node.typeParameters !== null) { | 504 if (node.typeParameters !== null) { |
| 476 visit(node.typeParameters); | 505 visit(node.typeParameters); |
| 477 } | 506 } |
| 478 visit(node.formals); | 507 visit(node.formals); |
| 479 add(node.endToken.value); | 508 add(node.endToken.value); |
| 480 } | 509 } |
| 481 } | 510 } |
| OLD | NEW |