Pretty-print literals exactly as we saw them in the source.

This commit is contained in:
Graydon Hoare 2011-06-02 17:18:43 -07:00
parent 3a6b5576ac
commit cb61d7b38e
2 changed files with 91 additions and 35 deletions

View file

@ -20,6 +20,7 @@ state type reader = state obj {
fn bump();
fn mark();
fn get_mark_chpos() -> uint;
fn get_mark_str() -> str;
fn get_interner() -> @interner::interner[str];
fn get_chpos() -> uint;
fn get_col() -> uint;
@ -48,6 +49,9 @@ fn new_reader(session sess, io::reader rdr,
}
fn mark() { mark_chpos = chpos; }
fn get_mark_str() -> str {
ret str::slice(file, mark_chpos, chpos);
}
fn get_mark_chpos() -> uint { ret mark_chpos; }
fn get_chpos() -> uint { ret chpos; }
@ -101,8 +105,7 @@ fn new_reader(session sess, io::reader rdr,
auto file = str::unsafe_from_bytes(rdr.read_whole_stream());
let vec[str] strs = [];
auto rd = reader(sess, file, str::byte_len(file), 0u, 0u,
-1 as char,
filemap.start_pos, filemap.start_pos,
-1 as char, filemap.start_pos, filemap.start_pos,
strs, filemap, itr);
rd.init();
ret rd;
@ -888,11 +891,29 @@ fn consume_comment(&reader rdr, bool code_to_the_left,
log "<<< consume comment";
}
fn gather_comments(session sess, str path) -> vec[cmnt] {
fn is_lit(&token::token t) -> bool {
ret alt (t) {
case (token::LIT_INT(_)) { true }
case (token::LIT_UINT(_)) { true }
case (token::LIT_MACH_INT(_,_)) { true }
case (token::LIT_FLOAT(_)) { true }
case (token::LIT_MACH_FLOAT(_,_)) { true }
case (token::LIT_STR(_)) { true }
case (token::LIT_CHAR(_)) { true }
case (token::LIT_BOOL(_)) { true }
case (_) { false }
}
}
type lit = rec(str lit, uint pos);
fn gather_comments_and_literals(session sess, str path)
-> rec(vec[cmnt] cmnts, vec[lit] lits) {
auto srdr = io::file_reader(path);
auto itr = @interner::mk[str](str::hash, str::eq);
auto rdr = new_reader(sess, srdr, codemap::new_filemap(path, 0u), itr);
let vec[cmnt] comments = [];
let vec[lit] literals = [];
while (!rdr.is_eof()) {
while (true) {
auto code_to_the_left = true;
@ -907,9 +928,12 @@ fn gather_comments(session sess, str path) -> vec[cmnt] {
}
break;
}
next_token(rdr);
if (is_lit(next_token(rdr))) {
vec::push[lit](literals, rec(lit=rdr.get_mark_str(),
pos=rdr.get_mark_chpos()));
}
}
ret comments;
ret rec(cmnts=comments, lits=literals);
}

View file

@ -12,6 +12,9 @@ import middle::ty;
import util::common;
import pp;
import option::some;
import option::none;
import pp::printer;
import pp::break_offset;
import pp::word;
@ -37,16 +40,20 @@ tag mode {
type ps = @rec(pp::printer s,
option::t[codemap] cm,
option::t[vec[lexer::cmnt]] comments,
option::t[vec[lexer::lit]] literals,
mutable uint cur_cmnt,
mutable uint cur_lit,
mutable vec[pp::breaks] boxes,
mode mode);
fn rust_printer(io::writer writer) -> ps {
let vec[pp::breaks] boxes = [];
ret @rec(s=pp::mk_printer(writer, default_columns),
cm=option::none[codemap],
comments=option::none[vec[lexer::cmnt]],
cm=none[codemap],
comments=none[vec[lexer::cmnt]],
literals=none[vec[lexer::lit]],
mutable cur_cmnt=0u,
mutable cur_lit=0u,
mutable boxes=boxes,
mode=mo_untyped);
}
@ -62,11 +69,13 @@ fn to_str[T](&T t, fn(&ps s, &T s) f) -> str {
fn print_file(session sess, ast::_mod _mod, str filename, io::writer out,
mode mode) {
let vec[pp::breaks] boxes = [];
auto cmnts = lexer::gather_comments(sess, filename);
auto r = lexer::gather_comments_and_literals(sess, filename);
auto s = @rec(s=pp::mk_printer(out, default_columns),
cm=option::some[codemap](sess.get_codemap()),
comments=option::some[vec[lexer::cmnt]](cmnts),
cm=some(sess.get_codemap()),
comments=some(r.cmnts),
literals=some(r.lits),
mutable cur_cmnt=0u,
mutable cur_lit=0u,
mutable boxes = boxes,
mode=mode);
print_mod(s, _mod);
@ -281,7 +290,7 @@ fn print_type(&ps s, &ast::ty ty) {
for (ast::ty_method m in methods) {
hardbreak(s.s);
cbox(s, indent_unit);
print_ty_fn(s, m.proto, option::some[str](m.ident),
print_ty_fn(s, m.proto, some(m.ident),
m.inputs, m.output, m.cf);
word(s.s, ";");
end(s);
@ -289,7 +298,7 @@ fn print_type(&ps s, &ast::ty ty) {
bclose(s, ty.span);
}
case (ast::ty_fn(?proto,?inputs,?output,?cf)) {
print_ty_fn(s, proto, option::none[str], inputs, output, cf);
print_ty_fn(s, proto, none[str], inputs, output, cf);
}
case (ast::ty_path(?path,_)) {
print_path(s, path);
@ -351,8 +360,8 @@ fn print_item(&ps s, &@ast::item item) {
print_fn(s, decl, ast::proto_fn, id, typarams);
end(s); // end head-ibox
alt (lname) {
case (option::none[str]) {}
case (option::some[str](?ss)) {
case (none) {}
case (some(?ss)) {
print_string(s, ss);
}
}
@ -430,7 +439,7 @@ fn print_item(&ps s, &@ast::item item) {
print_block(s, meth.node.meth.body);
}
alt (_obj.dtor) {
case (option::some[@ast::method](?dtor)) {
case (some(?dtor)) {
head(s, "drop");
print_block(s, dtor.node.meth.body);
}
@ -474,7 +483,7 @@ fn print_block(&ps s, ast::block blk) {
}
alt (blk.node.expr) {
case (option::some[@ast::expr](?expr)) {
case (some(?expr)) {
space(s.s);
print_expr(s, expr);
maybe_print_trailing_comment(s, expr.span);
@ -493,8 +502,31 @@ fn print_block(&ps s, ast::block blk) {
}
}
fn next_lit(&ps s) -> option::t[lexer::lit] {
alt (s.literals) {
case (some(?lits)) {
if (s.cur_lit < vec::len(lits)) {
ret some(lits.(s.cur_lit));
} else {ret none[lexer::lit];}
}
case (_) {ret none[lexer::lit];}
}
}
fn print_literal(&ps s, &@ast::lit lit) {
maybe_print_comment(s, lit.span.lo);
alt (next_lit(s)) {
case (some(?lt)) {
if (lt.pos == lit.span.lo) {
word(s.s, lt.lit);
s.cur_lit += 1u;
ret;
}
}
case (_) {}
}
alt (lit.node) {
case (ast::lit_str(?st)) {print_string(s, st);}
case (ast::lit_char(?ch)) {
@ -504,8 +536,8 @@ fn print_literal(&ps s, &@ast::lit lit) {
case (ast::lit_int(?val)) {
word(s.s, common::istr(val));
}
case (ast::lit_uint(?val)) { // FIXME clipping? uistr?
word(s.s, common::istr(val as int) + "u");
case (ast::lit_uint(?val)) {
word(s.s, common::uistr(val) + "u");
}
case (ast::lit_float(?fstr)) {
word(s.s, fstr);
@ -580,7 +612,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
auto gs = get_span;
commasep_cmnt[ast::field](s, consistent, fields, f, gs);
alt (wth) {
case (option::some[@ast::expr](?expr)) {
case (some(?expr)) {
if (vec::len[ast::field](fields) > 0u) {space(s.s);}
ibox(s, indent_unit);
word_space(s, "with");
@ -605,7 +637,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
case (ast::expr_bind(?func,?args,_)) {
fn print_opt(&ps s, &option::t[@ast::expr] expr) {
alt (expr) {
case (option::some[@ast::expr](?expr)) {
case (some(?expr)) {
print_expr(s, expr);
}
case (_) {word(s.s, "_");}
@ -655,7 +687,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
print_block(s, block);
fn do_else(&ps s, option::t[@ast::expr] els) {
alt (els) {
case (option::some[@ast::expr](?_else)) {
case (some(?_else)) {
alt (_else.node) {
// "another else-if"
case (ast::expr_if(?i,?t,?e,_)) {
@ -807,7 +839,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
case (ast::expr_ret(?result,_)) {
word(s.s, "ret");
alt (result) {
case (option::some[@ast::expr](?expr)) {
case (some(?expr)) {
word(s.s, " ");
print_expr(s, expr);
}
@ -817,7 +849,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
case (ast::expr_put(?result,_)) {
word(s.s, "put");
alt (result) {
case (option::some[@ast::expr](?expr)) {
case (some(?expr)) {
word(s.s, " ");
print_expr(s, expr);
}
@ -902,7 +934,7 @@ fn print_decl(&ps s, &@ast::decl decl) {
space(s.s);
ibox(s, indent_unit);
alt (loc.ty) {
case (option::some[@ast::ty](?ty)) {
case (some(?ty)) {
word_nbsp(s, "let");
print_type(s, *ty);
space(s.s);
@ -924,7 +956,7 @@ fn print_decl(&ps s, &@ast::decl decl) {
}
word(s.s, loc.ident);
alt (loc.init) {
case (option::some[ast::initializer](?init)) {
case (some(?init)) {
space(s.s);
alt (init.op) {
case (ast::init_assign) {
@ -1176,7 +1208,7 @@ fn print_ty_fn(&ps s, &ast::proto proto, &option::t[str] id,
if (proto == ast::proto_fn) {word(s.s, "fn");}
else {word(s.s, "iter");}
alt (id) {
case (option::some[str](?id)) {space(s.s); word(s.s, id);}
case (some(?id)) {space(s.s); word(s.s, id);}
case (_) {}
}
popen(s);
@ -1207,19 +1239,19 @@ fn print_ty_fn(&ps s, &ast::proto proto, &option::t[str] id,
fn next_comment(&ps s) -> option::t[lexer::cmnt] {
alt (s.comments) {
case (option::some[vec[lexer::cmnt]](?cmnts)) {
if (s.cur_cmnt < vec::len[lexer::cmnt](cmnts)) {
ret option::some[lexer::cmnt](cmnts.(s.cur_cmnt));
} else {ret option::none[lexer::cmnt];}
case (some(?cmnts)) {
if (s.cur_cmnt < vec::len(cmnts)) {
ret some(cmnts.(s.cur_cmnt));
} else {ret none[lexer::cmnt];}
}
case (_) {ret option::none[lexer::cmnt];}
case (_) {ret none[lexer::cmnt];}
}
}
fn maybe_print_comment(&ps s, uint pos) {
while (true) {
alt (next_comment(s)) {
case (option::some[lexer::cmnt](?cmnt)) {
case (some(?cmnt)) {
if (cmnt.pos < pos) {
print_comment(s, cmnt);
s.cur_cmnt += 1u;
@ -1233,13 +1265,13 @@ fn maybe_print_comment(&ps s, uint pos) {
fn maybe_print_trailing_comment(&ps s, common::span span) {
auto cm;
alt (s.cm) {
case (option::some[codemap](?ccm)) {
case (some(?ccm)) {
cm = ccm;
}
case (_) { ret; }
}
alt (next_comment(s)) {
case (option::some[lexer::cmnt](?cmnt)) {
case (some(?cmnt)) {
if (cmnt.style != lexer::trailing) { ret; }
auto span_line = codemap::lookup_pos(cm, span.hi);
@ -1258,7 +1290,7 @@ fn maybe_print_trailing_comment(&ps s, common::span span) {
fn print_remaining_comments(&ps s) {
while (true) {
alt (next_comment(s)) {
case (option::some[lexer::cmnt](?cmnt)) {
case (some(?cmnt)) {
print_comment(s, cmnt);
s.cur_cmnt += 1u;
}