diff options
| author | Marijn Haverbeke <[email protected]> | 2011-03-09 11:41:50 +0100 |
|---|---|---|
| committer | unknown <graydon@.(none)> | 2011-03-09 16:15:55 -0800 |
| commit | aed40fbcd8e81cc1ef7a51b40b76b4631cba299e (patch) | |
| tree | b9fe1cf0f40a6f54ab8b6522a3ed6677b127bb02 /src/comp/pretty/pp.rs | |
| parent | Add stdout_writer and string_writer to std.io (diff) | |
| download | rust-aed40fbcd8e81cc1ef7a51b40b76b4631cba299e.tar.xz rust-aed40fbcd8e81cc1ef7a51b40b76b4631cba299e.zip | |
Have the pretty-printer take a writer stream as argument
It now uses a string writer to also fill in for
middle.ty.ast_ty_to_str
Diffstat (limited to 'src/comp/pretty/pp.rs')
| -rw-r--r-- | src/comp/pretty/pp.rs | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/src/comp/pretty/pp.rs b/src/comp/pretty/pp.rs index 43a9220f..d3145180 100644 --- a/src/comp/pretty/pp.rs +++ b/src/comp/pretty/pp.rs @@ -17,17 +17,19 @@ type context = rec(contexttype tp, uint indent); type ps = @rec(mutable vec[context] context, uint width, + io.writer out, mutable vec[token] buffered, mutable uint scandepth, mutable uint bufferedcol, mutable uint col, mutable bool start_of_line); -fn mkstate(uint width) -> ps { +fn mkstate(io.writer out, uint width) -> ps { let vec[context] stack = vec(rec(tp=cx_v, indent=0u)); let vec[token] buff = vec(); ret @rec(mutable context=stack, width=width, + out=out, mutable buffered=buff, mutable scandepth=0u, mutable bufferedcol=0u, @@ -46,10 +48,22 @@ impure fn pop_context(ps p) { } impure fn add_token(ps p, token tok) { - if (p.scandepth == 0u) {do_token(p, tok);} + if (p.width == 0u) {direct_token(p, tok);} + else if (p.scandepth == 0u) {do_token(p, tok);} else {buffer_token(p, tok);} } +impure fn direct_token(ps p, token tok) { + alt (tok) { + case (brk(?sz)) { + while (sz > 0u) {p.out.write_str(" "); sz -= 1u;} + } + case (word(?w)) {p.out.write_str(w);} + case (cword(?w)) {p.out.write_str(w);} + case (_) {} + } +} + impure fn buffer_token(ps p, token tok) { p.buffered += vec(tok); p.bufferedcol += token_size(tok); @@ -101,14 +115,13 @@ impure fn finish_block_scan(ps p, contexttype tp) { impure fn finish_break_scan(ps p) { if (p.bufferedcol > p.width) { - write_str("\n"); - p.col = 0u; + line_break(p); } else { auto width; alt (p.buffered.(0)) {case(brk(?w)) {width = w;}} auto i = 0u; - while (i < width) {write_str(" "); i+=1u;} + while (i < width) {p.out.write_str(" "); i+=1u;} p.col += width; } p.scandepth = 0u; @@ -142,20 +155,18 @@ impure fn do_token(ps p, token tok) { start_scan(p, tok); } case (cx_v) { - write_str("\n"); - p.col = 0u; - p.start_of_line = true; + line_break(p); } } } case (word(?w)) { before_print(p, false); - write_str(w); + p.out.write_str(w); p.col += _str.byte_len(w); // TODO char_len } case (cword(?w)) { before_print(p, true); - write_str(w); + p.out.write_str(w); p.col += _str.byte_len(w); // TODO char_len } case (open(?tp, ?indent)) { @@ -170,6 +181,12 @@ impure fn do_token(ps p, token tok) { } } +impure fn line_break(ps p) { + p.out.write_str("\n"); + p.col = 0u; + p.start_of_line = true; +} + impure fn before_print(ps p, bool closing) { if (p.start_of_line) { p.start_of_line = false; @@ -177,14 +194,10 @@ impure fn before_print(ps p, bool closing) { if (closing) {ind = base_indent(p);} else {ind = cur_context(p).indent;} p.col = ind; - while (ind > 0u) {write_str(" "); ind -= 1u;} + while (ind > 0u) {p.out.write_str(" "); ind -= 1u;} } } -fn write_str(str s) { - io.writefd(1, _str.bytes(s)); -} - fn token_size(token tok) -> uint { alt (tok) { case (brk(?sz)) {ret sz;} |