Pretty-print literals exactly as we saw them in the source.
This commit is contained in:
parent
3a6b5576ac
commit
cb61d7b38e
2 changed files with 91 additions and 35 deletions
|
@ -20,6 +20,7 @@ state type reader = state obj {
|
||||||
fn bump();
|
fn bump();
|
||||||
fn mark();
|
fn mark();
|
||||||
fn get_mark_chpos() -> uint;
|
fn get_mark_chpos() -> uint;
|
||||||
|
fn get_mark_str() -> str;
|
||||||
fn get_interner() -> @interner::interner[str];
|
fn get_interner() -> @interner::interner[str];
|
||||||
fn get_chpos() -> uint;
|
fn get_chpos() -> uint;
|
||||||
fn get_col() -> uint;
|
fn get_col() -> uint;
|
||||||
|
@ -48,6 +49,9 @@ fn new_reader(session sess, io::reader rdr,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mark() { mark_chpos = chpos; }
|
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_mark_chpos() -> uint { ret mark_chpos; }
|
||||||
fn get_chpos() -> uint { ret 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());
|
auto file = str::unsafe_from_bytes(rdr.read_whole_stream());
|
||||||
let vec[str] strs = [];
|
let vec[str] strs = [];
|
||||||
auto rd = reader(sess, file, str::byte_len(file), 0u, 0u,
|
auto rd = reader(sess, file, str::byte_len(file), 0u, 0u,
|
||||||
-1 as char,
|
-1 as char, filemap.start_pos, filemap.start_pos,
|
||||||
filemap.start_pos, filemap.start_pos,
|
|
||||||
strs, filemap, itr);
|
strs, filemap, itr);
|
||||||
rd.init();
|
rd.init();
|
||||||
ret rd;
|
ret rd;
|
||||||
|
@ -888,11 +891,29 @@ fn consume_comment(&reader rdr, bool code_to_the_left,
|
||||||
log "<<< consume comment";
|
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 srdr = io::file_reader(path);
|
||||||
auto itr = @interner::mk[str](str::hash, str::eq);
|
auto itr = @interner::mk[str](str::hash, str::eq);
|
||||||
auto rdr = new_reader(sess, srdr, codemap::new_filemap(path, 0u), itr);
|
auto rdr = new_reader(sess, srdr, codemap::new_filemap(path, 0u), itr);
|
||||||
let vec[cmnt] comments = [];
|
let vec[cmnt] comments = [];
|
||||||
|
let vec[lit] literals = [];
|
||||||
while (!rdr.is_eof()) {
|
while (!rdr.is_eof()) {
|
||||||
while (true) {
|
while (true) {
|
||||||
auto code_to_the_left = true;
|
auto code_to_the_left = true;
|
||||||
|
@ -907,9 +928,12 @@ fn gather_comments(session sess, str path) -> vec[cmnt] {
|
||||||
}
|
}
|
||||||
break;
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,9 @@ import middle::ty;
|
||||||
import util::common;
|
import util::common;
|
||||||
import pp;
|
import pp;
|
||||||
|
|
||||||
|
import option::some;
|
||||||
|
import option::none;
|
||||||
|
|
||||||
import pp::printer;
|
import pp::printer;
|
||||||
import pp::break_offset;
|
import pp::break_offset;
|
||||||
import pp::word;
|
import pp::word;
|
||||||
|
@ -37,16 +40,20 @@ tag mode {
|
||||||
type ps = @rec(pp::printer s,
|
type ps = @rec(pp::printer s,
|
||||||
option::t[codemap] cm,
|
option::t[codemap] cm,
|
||||||
option::t[vec[lexer::cmnt]] comments,
|
option::t[vec[lexer::cmnt]] comments,
|
||||||
|
option::t[vec[lexer::lit]] literals,
|
||||||
mutable uint cur_cmnt,
|
mutable uint cur_cmnt,
|
||||||
|
mutable uint cur_lit,
|
||||||
mutable vec[pp::breaks] boxes,
|
mutable vec[pp::breaks] boxes,
|
||||||
mode mode);
|
mode mode);
|
||||||
|
|
||||||
fn rust_printer(io::writer writer) -> ps {
|
fn rust_printer(io::writer writer) -> ps {
|
||||||
let vec[pp::breaks] boxes = [];
|
let vec[pp::breaks] boxes = [];
|
||||||
ret @rec(s=pp::mk_printer(writer, default_columns),
|
ret @rec(s=pp::mk_printer(writer, default_columns),
|
||||||
cm=option::none[codemap],
|
cm=none[codemap],
|
||||||
comments=option::none[vec[lexer::cmnt]],
|
comments=none[vec[lexer::cmnt]],
|
||||||
|
literals=none[vec[lexer::lit]],
|
||||||
mutable cur_cmnt=0u,
|
mutable cur_cmnt=0u,
|
||||||
|
mutable cur_lit=0u,
|
||||||
mutable boxes=boxes,
|
mutable boxes=boxes,
|
||||||
mode=mo_untyped);
|
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,
|
fn print_file(session sess, ast::_mod _mod, str filename, io::writer out,
|
||||||
mode mode) {
|
mode mode) {
|
||||||
let vec[pp::breaks] boxes = [];
|
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),
|
auto s = @rec(s=pp::mk_printer(out, default_columns),
|
||||||
cm=option::some[codemap](sess.get_codemap()),
|
cm=some(sess.get_codemap()),
|
||||||
comments=option::some[vec[lexer::cmnt]](cmnts),
|
comments=some(r.cmnts),
|
||||||
|
literals=some(r.lits),
|
||||||
mutable cur_cmnt=0u,
|
mutable cur_cmnt=0u,
|
||||||
|
mutable cur_lit=0u,
|
||||||
mutable boxes = boxes,
|
mutable boxes = boxes,
|
||||||
mode=mode);
|
mode=mode);
|
||||||
print_mod(s, _mod);
|
print_mod(s, _mod);
|
||||||
|
@ -281,7 +290,7 @@ fn print_type(&ps s, &ast::ty ty) {
|
||||||
for (ast::ty_method m in methods) {
|
for (ast::ty_method m in methods) {
|
||||||
hardbreak(s.s);
|
hardbreak(s.s);
|
||||||
cbox(s, indent_unit);
|
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);
|
m.inputs, m.output, m.cf);
|
||||||
word(s.s, ";");
|
word(s.s, ";");
|
||||||
end(s);
|
end(s);
|
||||||
|
@ -289,7 +298,7 @@ fn print_type(&ps s, &ast::ty ty) {
|
||||||
bclose(s, ty.span);
|
bclose(s, ty.span);
|
||||||
}
|
}
|
||||||
case (ast::ty_fn(?proto,?inputs,?output,?cf)) {
|
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,_)) {
|
case (ast::ty_path(?path,_)) {
|
||||||
print_path(s, 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);
|
print_fn(s, decl, ast::proto_fn, id, typarams);
|
||||||
end(s); // end head-ibox
|
end(s); // end head-ibox
|
||||||
alt (lname) {
|
alt (lname) {
|
||||||
case (option::none[str]) {}
|
case (none) {}
|
||||||
case (option::some[str](?ss)) {
|
case (some(?ss)) {
|
||||||
print_string(s, ss);
|
print_string(s, ss);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -430,7 +439,7 @@ fn print_item(&ps s, &@ast::item item) {
|
||||||
print_block(s, meth.node.meth.body);
|
print_block(s, meth.node.meth.body);
|
||||||
}
|
}
|
||||||
alt (_obj.dtor) {
|
alt (_obj.dtor) {
|
||||||
case (option::some[@ast::method](?dtor)) {
|
case (some(?dtor)) {
|
||||||
head(s, "drop");
|
head(s, "drop");
|
||||||
print_block(s, dtor.node.meth.body);
|
print_block(s, dtor.node.meth.body);
|
||||||
}
|
}
|
||||||
|
@ -474,7 +483,7 @@ fn print_block(&ps s, ast::block blk) {
|
||||||
|
|
||||||
}
|
}
|
||||||
alt (blk.node.expr) {
|
alt (blk.node.expr) {
|
||||||
case (option::some[@ast::expr](?expr)) {
|
case (some(?expr)) {
|
||||||
space(s.s);
|
space(s.s);
|
||||||
print_expr(s, expr);
|
print_expr(s, expr);
|
||||||
maybe_print_trailing_comment(s, expr.span);
|
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) {
|
fn print_literal(&ps s, &@ast::lit lit) {
|
||||||
maybe_print_comment(s, lit.span.lo);
|
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) {
|
alt (lit.node) {
|
||||||
case (ast::lit_str(?st)) {print_string(s, st);}
|
case (ast::lit_str(?st)) {print_string(s, st);}
|
||||||
case (ast::lit_char(?ch)) {
|
case (ast::lit_char(?ch)) {
|
||||||
|
@ -504,8 +536,8 @@ fn print_literal(&ps s, &@ast::lit lit) {
|
||||||
case (ast::lit_int(?val)) {
|
case (ast::lit_int(?val)) {
|
||||||
word(s.s, common::istr(val));
|
word(s.s, common::istr(val));
|
||||||
}
|
}
|
||||||
case (ast::lit_uint(?val)) { // FIXME clipping? uistr?
|
case (ast::lit_uint(?val)) {
|
||||||
word(s.s, common::istr(val as int) + "u");
|
word(s.s, common::uistr(val) + "u");
|
||||||
}
|
}
|
||||||
case (ast::lit_float(?fstr)) {
|
case (ast::lit_float(?fstr)) {
|
||||||
word(s.s, fstr);
|
word(s.s, fstr);
|
||||||
|
@ -580,7 +612,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
|
||||||
auto gs = get_span;
|
auto gs = get_span;
|
||||||
commasep_cmnt[ast::field](s, consistent, fields, f, gs);
|
commasep_cmnt[ast::field](s, consistent, fields, f, gs);
|
||||||
alt (wth) {
|
alt (wth) {
|
||||||
case (option::some[@ast::expr](?expr)) {
|
case (some(?expr)) {
|
||||||
if (vec::len[ast::field](fields) > 0u) {space(s.s);}
|
if (vec::len[ast::field](fields) > 0u) {space(s.s);}
|
||||||
ibox(s, indent_unit);
|
ibox(s, indent_unit);
|
||||||
word_space(s, "with");
|
word_space(s, "with");
|
||||||
|
@ -605,7 +637,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
|
||||||
case (ast::expr_bind(?func,?args,_)) {
|
case (ast::expr_bind(?func,?args,_)) {
|
||||||
fn print_opt(&ps s, &option::t[@ast::expr] expr) {
|
fn print_opt(&ps s, &option::t[@ast::expr] expr) {
|
||||||
alt (expr) {
|
alt (expr) {
|
||||||
case (option::some[@ast::expr](?expr)) {
|
case (some(?expr)) {
|
||||||
print_expr(s, expr);
|
print_expr(s, expr);
|
||||||
}
|
}
|
||||||
case (_) {word(s.s, "_");}
|
case (_) {word(s.s, "_");}
|
||||||
|
@ -655,7 +687,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
|
||||||
print_block(s, block);
|
print_block(s, block);
|
||||||
fn do_else(&ps s, option::t[@ast::expr] els) {
|
fn do_else(&ps s, option::t[@ast::expr] els) {
|
||||||
alt (els) {
|
alt (els) {
|
||||||
case (option::some[@ast::expr](?_else)) {
|
case (some(?_else)) {
|
||||||
alt (_else.node) {
|
alt (_else.node) {
|
||||||
// "another else-if"
|
// "another else-if"
|
||||||
case (ast::expr_if(?i,?t,?e,_)) {
|
case (ast::expr_if(?i,?t,?e,_)) {
|
||||||
|
@ -807,7 +839,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
|
||||||
case (ast::expr_ret(?result,_)) {
|
case (ast::expr_ret(?result,_)) {
|
||||||
word(s.s, "ret");
|
word(s.s, "ret");
|
||||||
alt (result) {
|
alt (result) {
|
||||||
case (option::some[@ast::expr](?expr)) {
|
case (some(?expr)) {
|
||||||
word(s.s, " ");
|
word(s.s, " ");
|
||||||
print_expr(s, expr);
|
print_expr(s, expr);
|
||||||
}
|
}
|
||||||
|
@ -817,7 +849,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
|
||||||
case (ast::expr_put(?result,_)) {
|
case (ast::expr_put(?result,_)) {
|
||||||
word(s.s, "put");
|
word(s.s, "put");
|
||||||
alt (result) {
|
alt (result) {
|
||||||
case (option::some[@ast::expr](?expr)) {
|
case (some(?expr)) {
|
||||||
word(s.s, " ");
|
word(s.s, " ");
|
||||||
print_expr(s, expr);
|
print_expr(s, expr);
|
||||||
}
|
}
|
||||||
|
@ -902,7 +934,7 @@ fn print_decl(&ps s, &@ast::decl decl) {
|
||||||
space(s.s);
|
space(s.s);
|
||||||
ibox(s, indent_unit);
|
ibox(s, indent_unit);
|
||||||
alt (loc.ty) {
|
alt (loc.ty) {
|
||||||
case (option::some[@ast::ty](?ty)) {
|
case (some(?ty)) {
|
||||||
word_nbsp(s, "let");
|
word_nbsp(s, "let");
|
||||||
print_type(s, *ty);
|
print_type(s, *ty);
|
||||||
space(s.s);
|
space(s.s);
|
||||||
|
@ -924,7 +956,7 @@ fn print_decl(&ps s, &@ast::decl decl) {
|
||||||
}
|
}
|
||||||
word(s.s, loc.ident);
|
word(s.s, loc.ident);
|
||||||
alt (loc.init) {
|
alt (loc.init) {
|
||||||
case (option::some[ast::initializer](?init)) {
|
case (some(?init)) {
|
||||||
space(s.s);
|
space(s.s);
|
||||||
alt (init.op) {
|
alt (init.op) {
|
||||||
case (ast::init_assign) {
|
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");}
|
if (proto == ast::proto_fn) {word(s.s, "fn");}
|
||||||
else {word(s.s, "iter");}
|
else {word(s.s, "iter");}
|
||||||
alt (id) {
|
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 (_) {}
|
case (_) {}
|
||||||
}
|
}
|
||||||
popen(s);
|
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] {
|
fn next_comment(&ps s) -> option::t[lexer::cmnt] {
|
||||||
alt (s.comments) {
|
alt (s.comments) {
|
||||||
case (option::some[vec[lexer::cmnt]](?cmnts)) {
|
case (some(?cmnts)) {
|
||||||
if (s.cur_cmnt < vec::len[lexer::cmnt](cmnts)) {
|
if (s.cur_cmnt < vec::len(cmnts)) {
|
||||||
ret option::some[lexer::cmnt](cmnts.(s.cur_cmnt));
|
ret some(cmnts.(s.cur_cmnt));
|
||||||
} else {ret option::none[lexer::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) {
|
fn maybe_print_comment(&ps s, uint pos) {
|
||||||
while (true) {
|
while (true) {
|
||||||
alt (next_comment(s)) {
|
alt (next_comment(s)) {
|
||||||
case (option::some[lexer::cmnt](?cmnt)) {
|
case (some(?cmnt)) {
|
||||||
if (cmnt.pos < pos) {
|
if (cmnt.pos < pos) {
|
||||||
print_comment(s, cmnt);
|
print_comment(s, cmnt);
|
||||||
s.cur_cmnt += 1u;
|
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) {
|
fn maybe_print_trailing_comment(&ps s, common::span span) {
|
||||||
auto cm;
|
auto cm;
|
||||||
alt (s.cm) {
|
alt (s.cm) {
|
||||||
case (option::some[codemap](?ccm)) {
|
case (some(?ccm)) {
|
||||||
cm = ccm;
|
cm = ccm;
|
||||||
}
|
}
|
||||||
case (_) { ret; }
|
case (_) { ret; }
|
||||||
}
|
}
|
||||||
alt (next_comment(s)) {
|
alt (next_comment(s)) {
|
||||||
case (option::some[lexer::cmnt](?cmnt)) {
|
case (some(?cmnt)) {
|
||||||
if (cmnt.style != lexer::trailing) { ret; }
|
if (cmnt.style != lexer::trailing) { ret; }
|
||||||
|
|
||||||
auto span_line = codemap::lookup_pos(cm, span.hi);
|
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) {
|
fn print_remaining_comments(&ps s) {
|
||||||
while (true) {
|
while (true) {
|
||||||
alt (next_comment(s)) {
|
alt (next_comment(s)) {
|
||||||
case (option::some[lexer::cmnt](?cmnt)) {
|
case (some(?cmnt)) {
|
||||||
print_comment(s, cmnt);
|
print_comment(s, cmnt);
|
||||||
s.cur_cmnt += 1u;
|
s.cur_cmnt += 1u;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue