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

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

Issue 10832129: Get back recording 'implements' and 'extends' keyword on NodeList (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
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 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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « lib/compiler/implementation/scanner/listener.dart ('k') | tests/compiler/dart2js/unparser_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698