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
This commit is contained in:
Marijn Haverbeke 2011-03-09 11:41:50 +01:00 committed by unknown
parent dddd7d8f44
commit aed40fbcd8
6 changed files with 61 additions and 119 deletions

View file

@ -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;}

View file

@ -11,13 +11,19 @@ import foo = std.io;
const uint indent_unit = 2u;
const int as_prec = 5;
impure fn print_ast(ast._mod _mod) {
auto s = pp.mkstate(80u);
impure fn print_ast(ast._mod _mod, std.io.writer out) {
auto s = pp.mkstate(out, 80u);
for (@ast.view_item vitem in _mod.view_items) {print_view_item(s, vitem);}
line(s);
for (@ast.item item in _mod.items) {print_item(s, item);}
}
fn ty_to_str(&@ast.ty ty) -> str {
auto writer = std.io.string_writer();
print_type(pp.mkstate(writer.get_writer(), 0u), ty);
ret writer.get_str();
}
impure fn hbox(ps s) {
pp.hbox(s, indent_unit);
}