Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(343)

Side by Side Diff: lib/compiler/implementation/tree/unparser.dart

Issue 10836128: A visitor that builds a map from node to "Usage". (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « lib/compiler/implementation/tree/tree.dart ('k') | tests/language/language.status » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « lib/compiler/implementation/tree/tree.dart ('k') | tests/language/language.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698