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

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

Issue 10854113: Refactor send and sendset unparsing. (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 | « no previous file | tests/compiler/dart2js/unparser_test.dart » ('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. 5 // Returns null if no need to rename a node.
6 typedef String Renamer(Node node); 6 typedef String Renamer(Node node);
7 7
8 class Unparser implements Visitor { 8 class Unparser implements Visitor {
9 Renamer rename; 9 Renamer rename;
10 StringBuffer sb; 10 StringBuffer sb;
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 227
228 visitReturn(Return node) { 228 visitReturn(Return node) {
229 add(node.beginToken.value); 229 add(node.beginToken.value);
230 if (node.hasExpression) { 230 if (node.hasExpression) {
231 sb.add(' '); 231 sb.add(' ');
232 visit(node.expression); 232 visit(node.expression);
233 } 233 }
234 if (node.endToken !== null) add(node.endToken.value); 234 if (node.endToken !== null) add(node.endToken.value);
235 } 235 }
236 236
237 unparseSendPart(Send node) { 237 unparseSendReceiver(Send node, [bool spacesNeeded=false]) {
238 Operator op = node.selector.asOperator();
239 bool spacesNeeded = op !== null &&
240 (op.source.stringValue === 'is' || op.source.stringValue == 'as');
241
242 if (node.isPrefix) {
243 visit(node.selector);
244 }
245 // TODO(smok): Remove ugly hack for library preferences. 238 // TODO(smok): Remove ugly hack for library preferences.
246 // Check that renamer does not want to omit receiver at all, 239 // Check that renamer does not want to omit receiver at all,
247 // in that case we don't need spaces or dot. 240 // in that case we don't need spaces or dot.
248 if (node.receiver !== null && rename(node.receiver) != '') { 241 if (node.receiver !== null && rename(node.receiver) != '') {
249 visit(node.receiver); 242 visit(node.receiver);
250 CascadeReceiver asCascadeReceiver = node.receiver.asCascadeReceiver(); 243 CascadeReceiver asCascadeReceiver = node.receiver.asCascadeReceiver();
251 if (asCascadeReceiver !== null) { 244 if (asCascadeReceiver !== null) {
252 add(asCascadeReceiver.cascadeOperator.value); 245 add(asCascadeReceiver.cascadeOperator.value);
253 } else if (op === null) { 246 } else if (node.selector.asOperator() === null) {
254 sb.add('.'); 247 sb.add('.');
255 } else if (spacesNeeded) { 248 } else if (spacesNeeded) {
256 sb.add(' '); 249 sb.add(' ');
257 } 250 }
258 } 251 }
259 if (!node.isPrefix && !node.isIndex) {
260 visit(node.selector);
261 }
262 if (spacesNeeded) {
263 sb.add(' ');
264 }
265 } 252 }
266 253
267 visitSend(Send node) { 254 visitSend(Send node) {
268 unparseSendPart(node); 255 Operator op = node.selector.asOperator();
256 bool spacesNeeded = op !== null &&
257 (op.source.stringValue === 'is' || op.source.stringValue == 'as');
258
259 if (node.isPrefix) visit(node.selector);
260 unparseSendReceiver(node, spacesNeeded: spacesNeeded);
261 if (!node.isPrefix && !node.isIndex) visit(node.selector);
262 if (spacesNeeded) sb.add(' ');
269 visit(node.argumentsNode); 263 visit(node.argumentsNode);
270 } 264 }
271 265
272 /** 266 visitSendSet(SendSet node) {
273 * Special case for assignments like "list[0] = 1".
274 */
275 unparseIndexedSet(SendSet node) {
276 if (node.isPrefix) { 267 if (node.isPrefix) {
277 add(node.assignmentOperator.token.value); 268 sb.add(' ');
269 visit(node.assignmentOperator);
278 } 270 }
279 visit(node.receiver); 271 unparseSendReceiver(node);
280 CascadeReceiver asCascadeReceiver = node.receiver.asCascadeReceiver();
281 if (asCascadeReceiver !== null) {
282 add(asCascadeReceiver.cascadeOperator.value);
283 }
284 sb.add('[');
285 sb.add(node.arguments.head);
286 sb.add(']');
287 if (!node.isPrefix) {
288 add(node.assignmentOperator.token.value);
289 }
290 unparseNodeListFrom(node.argumentsNode, node.argumentsNode.nodes.tail);
291 }
292
293 visitSendSet(SendSet node) {
294 if (node.isIndex) { 272 if (node.isIndex) {
295 unparseIndexedSet(node); 273 sb.add('[');
274 sb.add(node.arguments.head);
275 sb.add(']');
276 if (!node.isPrefix) visit(node.assignmentOperator);
277 unparseNodeListFrom(node.argumentsNode, node.argumentsNode.nodes.tail);
296 } else { 278 } else {
297 if (node.isPrefix) {
298 sb.add(' ');
299 add(node.assignmentOperator.source);
300 }
301 if (node.receiver !== null && rename(node.receiver) != '') {
302 visit(node.receiver);
303 CascadeReceiver asCascadeReceiver = node.receiver.asCascadeReceiver();
304 if (asCascadeReceiver !== null) {
305 add(asCascadeReceiver.cascadeOperator.value);
306 } else {
307 sb.add('.');
308 }
309 }
310 visit(node.selector); 279 visit(node.selector);
311 if (!node.isPrefix) { 280 if (!node.isPrefix) {
312 SourceString source = node.assignmentOperator.source; 281 visit(node.assignmentOperator);
313 add(source); 282 if (node.assignmentOperator.source.slowToString() != '=') sb.add(' ');
314 if (source.slowToString() != '=') sb.add(' ');
315 } 283 }
316 visit(node.argumentsNode); 284 visit(node.argumentsNode);
317 } 285 }
318 } 286 }
319 287
320 visitThrow(Throw node) { 288 visitThrow(Throw node) {
321 add(node.throwToken.value); 289 add(node.throwToken.value);
322 if (node.expression !== null) { 290 if (node.expression !== null) {
323 sb.add(' '); 291 sb.add(' ');
324 visit(node.expression); 292 visit(node.expression);
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 sb.add(' '); 481 sb.add(' ');
514 } 482 }
515 visit(node.name); 483 visit(node.name);
516 if (node.typeParameters !== null) { 484 if (node.typeParameters !== null) {
517 visit(node.typeParameters); 485 visit(node.typeParameters);
518 } 486 }
519 visit(node.formals); 487 visit(node.formals);
520 add(node.endToken.value); 488 add(node.endToken.value);
521 } 489 }
522 } 490 }
OLDNEW
« no previous file with comments | « no previous file | tests/compiler/dart2js/unparser_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698