about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2012-01-16 10:50:34 +0100
committerMarijn Haverbeke <marijnh@gmail.com>2012-01-16 11:19:32 +0100
commit96f1eda6d0ae0cf4f91d28304ded3996efda356a (patch)
tree63a01bf8200de4e716a287c0af3a5f4ccbb800bd
parent2d36a71aee17b6dad04a184541cebbb8e3901a5a (diff)
downloadrust-96f1eda6d0ae0cf4f91d28304ded3996efda356a.tar.gz
rust-96f1eda6d0ae0cf4f91d28304ded3996efda356a.zip
Be more careful about pretty-printing literals
Before, literal printing would basically get derailed completely when
a literal was encountered that did not end up being printed. This
caused the strangeness seen in #1532.

Also cleans up pretty-printing of discriminants a little.

Closes #1510
Closes #1532
-rw-r--r--src/comp/syntax/print/pprust.rs31
1 files changed, 19 insertions, 12 deletions
diff --git a/src/comp/syntax/print/pprust.rs b/src/comp/syntax/print/pprust.rs
index 38449d6e255..092fb5780b1 100644
--- a/src/comp/syntax/print/pprust.rs
+++ b/src/comp/syntax/print/pprust.rs
@@ -419,6 +419,7 @@ fn print_item(s: ps, &&item: @ast::item) {
             for v: ast::variant in variants {
                 space_if_not_bol(s);
                 maybe_print_comment(s, v.span.lo);
+                ibox(s, indent_unit);
                 word(s.s, v.node.name);
                 if vec::len(v.node.args) > 0u {
                     popen(s);
@@ -429,14 +430,15 @@ fn print_item(s: ps, &&item: @ast::item) {
                     pclose(s);
                 }
                 alt v.node.disr_expr {
-                  some(expr) {
-                    nbsp(s);
-                    word_nbsp(s, "=");
-                    print_expr(s, expr);
+                  some(d) {
+                    space(s.s);
+                    word_space(s, "=");
+                    print_expr(s, d);
                   }
                   _ {}
                 }
                 word(s.s, ";");
+                end(s);
                 maybe_print_trailing_comment(s, v.span, none::<uint>);
             }
             bclose(s, item.span);
@@ -1414,11 +1416,12 @@ fn in_cbox(s: ps) -> bool {
 
 fn print_literal(s: ps, &&lit: @ast::lit) {
     maybe_print_comment(s, lit.span.lo);
-    alt next_lit(s) {
+    alt next_lit(s, lit.span.lo) {
       some(lt) {
-        if lt.pos == lit.span.lo { word(s.s, lt.lit); s.cur_lit += 1u; ret; }
+        word(s.s, lt.lit);
+        ret;
       }
-      _ { }
+      _ {}
     }
     alt lit.node {
       ast::lit_str(st) { print_string(s, st); }
@@ -1443,14 +1446,18 @@ fn print_literal(s: ps, &&lit: @ast::lit) {
 
 fn lit_to_str(l: @ast::lit) -> str { be to_str(l, print_literal); }
 
-fn next_lit(s: ps) -> option::t<lexer::lit> {
+fn next_lit(s: ps, pos: uint) -> option::t<lexer::lit> {
     alt s.literals {
       some(lits) {
-        if s.cur_lit < vec::len(lits) {
-            ret some(lits[s.cur_lit]);
-        } else { ret none::<lexer::lit>; }
+        while s.cur_lit < vec::len(lits) {
+            let lt = lits[s.cur_lit];
+            if lt.pos > pos { ret none; }
+            s.cur_lit += 1u;
+            if lt.pos == pos { ret some(lt); }
+        }
+        ret none;
       }
-      _ { ret none::<lexer::lit>; }
+      _ { ret none; }
     }
 }