Skip to content

Commit cb61d7b

Browse files
committed
Pretty-print literals exactly as we saw them in the source.
1 parent 3a6b557 commit cb61d7b

File tree

2 files changed

+91
-35
lines changed

2 files changed

+91
-35
lines changed

src/comp/front/lexer.rs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ state type reader = state obj {
2020
fn bump();
2121
fn mark();
2222
fn get_mark_chpos() -> uint;
23+
fn get_mark_str() -> str;
2324
fn get_interner() -> @interner::interner[str];
2425
fn get_chpos() -> uint;
2526
fn get_col() -> uint;
@@ -48,6 +49,9 @@ fn new_reader(session sess, io::reader rdr,
4849
}
4950

5051
fn mark() { mark_chpos = chpos; }
52+
fn get_mark_str() -> str {
53+
ret str::slice(file, mark_chpos, chpos);
54+
}
5155
fn get_mark_chpos() -> uint { ret mark_chpos; }
5256
fn get_chpos() -> uint { ret chpos; }
5357

@@ -101,8 +105,7 @@ fn new_reader(session sess, io::reader rdr,
101105
auto file = str::unsafe_from_bytes(rdr.read_whole_stream());
102106
let vec[str] strs = [];
103107
auto rd = reader(sess, file, str::byte_len(file), 0u, 0u,
104-
-1 as char,
105-
filemap.start_pos, filemap.start_pos,
108+
-1 as char, filemap.start_pos, filemap.start_pos,
106109
strs, filemap, itr);
107110
rd.init();
108111
ret rd;
@@ -888,11 +891,29 @@ fn consume_comment(&reader rdr, bool code_to_the_left,
888891
log "<<< consume comment";
889892
}
890893

891-
fn gather_comments(session sess, str path) -> vec[cmnt] {
894+
fn is_lit(&token::token t) -> bool {
895+
ret alt (t) {
896+
case (token::LIT_INT(_)) { true }
897+
case (token::LIT_UINT(_)) { true }
898+
case (token::LIT_MACH_INT(_,_)) { true }
899+
case (token::LIT_FLOAT(_)) { true }
900+
case (token::LIT_MACH_FLOAT(_,_)) { true }
901+
case (token::LIT_STR(_)) { true }
902+
case (token::LIT_CHAR(_)) { true }
903+
case (token::LIT_BOOL(_)) { true }
904+
case (_) { false }
905+
}
906+
}
907+
908+
type lit = rec(str lit, uint pos);
909+
910+
fn gather_comments_and_literals(session sess, str path)
911+
-> rec(vec[cmnt] cmnts, vec[lit] lits) {
892912
auto srdr = io::file_reader(path);
893913
auto itr = @interner::mk[str](str::hash, str::eq);
894914
auto rdr = new_reader(sess, srdr, codemap::new_filemap(path, 0u), itr);
895915
let vec[cmnt] comments = [];
916+
let vec[lit] literals = [];
896917
while (!rdr.is_eof()) {
897918
while (true) {
898919
auto code_to_the_left = true;
@@ -907,9 +928,12 @@ fn gather_comments(session sess, str path) -> vec[cmnt] {
907928
}
908929
break;
909930
}
910-
next_token(rdr);
931+
if (is_lit(next_token(rdr))) {
932+
vec::push[lit](literals, rec(lit=rdr.get_mark_str(),
933+
pos=rdr.get_mark_chpos()));
934+
}
911935
}
912-
ret comments;
936+
ret rec(cmnts=comments, lits=literals);
913937
}
914938

915939

src/comp/pretty/pprust.rs

Lines changed: 62 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ import middle::ty;
1212
import util::common;
1313
import pp;
1414

15+
import option::some;
16+
import option::none;
17+
1518
import pp::printer;
1619
import pp::break_offset;
1720
import pp::word;
@@ -37,16 +40,20 @@ tag mode {
3740
type ps = @rec(pp::printer s,
3841
option::t[codemap] cm,
3942
option::t[vec[lexer::cmnt]] comments,
43+
option::t[vec[lexer::lit]] literals,
4044
mutable uint cur_cmnt,
45+
mutable uint cur_lit,
4146
mutable vec[pp::breaks] boxes,
4247
mode mode);
4348

4449
fn rust_printer(io::writer writer) -> ps {
4550
let vec[pp::breaks] boxes = [];
4651
ret @rec(s=pp::mk_printer(writer, default_columns),
47-
cm=option::none[codemap],
48-
comments=option::none[vec[lexer::cmnt]],
52+
cm=none[codemap],
53+
comments=none[vec[lexer::cmnt]],
54+
literals=none[vec[lexer::lit]],
4955
mutable cur_cmnt=0u,
56+
mutable cur_lit=0u,
5057
mutable boxes=boxes,
5158
mode=mo_untyped);
5259
}
@@ -62,11 +69,13 @@ fn to_str[T](&T t, fn(&ps s, &T s) f) -> str {
6269
fn print_file(session sess, ast::_mod _mod, str filename, io::writer out,
6370
mode mode) {
6471
let vec[pp::breaks] boxes = [];
65-
auto cmnts = lexer::gather_comments(sess, filename);
72+
auto r = lexer::gather_comments_and_literals(sess, filename);
6673
auto s = @rec(s=pp::mk_printer(out, default_columns),
67-
cm=option::some[codemap](sess.get_codemap()),
68-
comments=option::some[vec[lexer::cmnt]](cmnts),
74+
cm=some(sess.get_codemap()),
75+
comments=some(r.cmnts),
76+
literals=some(r.lits),
6977
mutable cur_cmnt=0u,
78+
mutable cur_lit=0u,
7079
mutable boxes = boxes,
7180
mode=mode);
7281
print_mod(s, _mod);
@@ -281,15 +290,15 @@ fn print_type(&ps s, &ast::ty ty) {
281290
for (ast::ty_method m in methods) {
282291
hardbreak(s.s);
283292
cbox(s, indent_unit);
284-
print_ty_fn(s, m.proto, option::some[str](m.ident),
293+
print_ty_fn(s, m.proto, some(m.ident),
285294
m.inputs, m.output, m.cf);
286295
word(s.s, ";");
287296
end(s);
288297
}
289298
bclose(s, ty.span);
290299
}
291300
case (ast::ty_fn(?proto,?inputs,?output,?cf)) {
292-
print_ty_fn(s, proto, option::none[str], inputs, output, cf);
301+
print_ty_fn(s, proto, none[str], inputs, output, cf);
293302
}
294303
case (ast::ty_path(?path,_)) {
295304
print_path(s, path);
@@ -351,8 +360,8 @@ fn print_item(&ps s, &@ast::item item) {
351360
print_fn(s, decl, ast::proto_fn, id, typarams);
352361
end(s); // end head-ibox
353362
alt (lname) {
354-
case (option::none[str]) {}
355-
case (option::some[str](?ss)) {
363+
case (none) {}
364+
case (some(?ss)) {
356365
print_string(s, ss);
357366
}
358367
}
@@ -430,7 +439,7 @@ fn print_item(&ps s, &@ast::item item) {
430439
print_block(s, meth.node.meth.body);
431440
}
432441
alt (_obj.dtor) {
433-
case (option::some[@ast::method](?dtor)) {
442+
case (some(?dtor)) {
434443
head(s, "drop");
435444
print_block(s, dtor.node.meth.body);
436445
}
@@ -474,7 +483,7 @@ fn print_block(&ps s, ast::block blk) {
474483

475484
}
476485
alt (blk.node.expr) {
477-
case (option::some[@ast::expr](?expr)) {
486+
case (some(?expr)) {
478487
space(s.s);
479488
print_expr(s, expr);
480489
maybe_print_trailing_comment(s, expr.span);
@@ -493,8 +502,31 @@ fn print_block(&ps s, ast::block blk) {
493502
}
494503
}
495504

505+
fn next_lit(&ps s) -> option::t[lexer::lit] {
506+
alt (s.literals) {
507+
case (some(?lits)) {
508+
if (s.cur_lit < vec::len(lits)) {
509+
ret some(lits.(s.cur_lit));
510+
} else {ret none[lexer::lit];}
511+
}
512+
case (_) {ret none[lexer::lit];}
513+
}
514+
}
515+
496516
fn print_literal(&ps s, &@ast::lit lit) {
497517
maybe_print_comment(s, lit.span.lo);
518+
519+
alt (next_lit(s)) {
520+
case (some(?lt)) {
521+
if (lt.pos == lit.span.lo) {
522+
word(s.s, lt.lit);
523+
s.cur_lit += 1u;
524+
ret;
525+
}
526+
}
527+
case (_) {}
528+
}
529+
498530
alt (lit.node) {
499531
case (ast::lit_str(?st)) {print_string(s, st);}
500532
case (ast::lit_char(?ch)) {
@@ -504,8 +536,8 @@ fn print_literal(&ps s, &@ast::lit lit) {
504536
case (ast::lit_int(?val)) {
505537
word(s.s, common::istr(val));
506538
}
507-
case (ast::lit_uint(?val)) { // FIXME clipping? uistr?
508-
word(s.s, common::istr(val as int) + "u");
539+
case (ast::lit_uint(?val)) {
540+
word(s.s, common::uistr(val) + "u");
509541
}
510542
case (ast::lit_float(?fstr)) {
511543
word(s.s, fstr);
@@ -580,7 +612,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
580612
auto gs = get_span;
581613
commasep_cmnt[ast::field](s, consistent, fields, f, gs);
582614
alt (wth) {
583-
case (option::some[@ast::expr](?expr)) {
615+
case (some(?expr)) {
584616
if (vec::len[ast::field](fields) > 0u) {space(s.s);}
585617
ibox(s, indent_unit);
586618
word_space(s, "with");
@@ -605,7 +637,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
605637
case (ast::expr_bind(?func,?args,_)) {
606638
fn print_opt(&ps s, &option::t[@ast::expr] expr) {
607639
alt (expr) {
608-
case (option::some[@ast::expr](?expr)) {
640+
case (some(?expr)) {
609641
print_expr(s, expr);
610642
}
611643
case (_) {word(s.s, "_");}
@@ -655,7 +687,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
655687
print_block(s, block);
656688
fn do_else(&ps s, option::t[@ast::expr] els) {
657689
alt (els) {
658-
case (option::some[@ast::expr](?_else)) {
690+
case (some(?_else)) {
659691
alt (_else.node) {
660692
// "another else-if"
661693
case (ast::expr_if(?i,?t,?e,_)) {
@@ -807,7 +839,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
807839
case (ast::expr_ret(?result,_)) {
808840
word(s.s, "ret");
809841
alt (result) {
810-
case (option::some[@ast::expr](?expr)) {
842+
case (some(?expr)) {
811843
word(s.s, " ");
812844
print_expr(s, expr);
813845
}
@@ -817,7 +849,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
817849
case (ast::expr_put(?result,_)) {
818850
word(s.s, "put");
819851
alt (result) {
820-
case (option::some[@ast::expr](?expr)) {
852+
case (some(?expr)) {
821853
word(s.s, " ");
822854
print_expr(s, expr);
823855
}
@@ -902,7 +934,7 @@ fn print_decl(&ps s, &@ast::decl decl) {
902934
space(s.s);
903935
ibox(s, indent_unit);
904936
alt (loc.ty) {
905-
case (option::some[@ast::ty](?ty)) {
937+
case (some(?ty)) {
906938
word_nbsp(s, "let");
907939
print_type(s, *ty);
908940
space(s.s);
@@ -924,7 +956,7 @@ fn print_decl(&ps s, &@ast::decl decl) {
924956
}
925957
word(s.s, loc.ident);
926958
alt (loc.init) {
927-
case (option::some[ast::initializer](?init)) {
959+
case (some(?init)) {
928960
space(s.s);
929961
alt (init.op) {
930962
case (ast::init_assign) {
@@ -1176,7 +1208,7 @@ fn print_ty_fn(&ps s, &ast::proto proto, &option::t[str] id,
11761208
if (proto == ast::proto_fn) {word(s.s, "fn");}
11771209
else {word(s.s, "iter");}
11781210
alt (id) {
1179-
case (option::some[str](?id)) {space(s.s); word(s.s, id);}
1211+
case (some(?id)) {space(s.s); word(s.s, id);}
11801212
case (_) {}
11811213
}
11821214
popen(s);
@@ -1207,19 +1239,19 @@ fn print_ty_fn(&ps s, &ast::proto proto, &option::t[str] id,
12071239

12081240
fn next_comment(&ps s) -> option::t[lexer::cmnt] {
12091241
alt (s.comments) {
1210-
case (option::some[vec[lexer::cmnt]](?cmnts)) {
1211-
if (s.cur_cmnt < vec::len[lexer::cmnt](cmnts)) {
1212-
ret option::some[lexer::cmnt](cmnts.(s.cur_cmnt));
1213-
} else {ret option::none[lexer::cmnt];}
1242+
case (some(?cmnts)) {
1243+
if (s.cur_cmnt < vec::len(cmnts)) {
1244+
ret some(cmnts.(s.cur_cmnt));
1245+
} else {ret none[lexer::cmnt];}
12141246
}
1215-
case (_) {ret option::none[lexer::cmnt];}
1247+
case (_) {ret none[lexer::cmnt];}
12161248
}
12171249
}
12181250

12191251
fn maybe_print_comment(&ps s, uint pos) {
12201252
while (true) {
12211253
alt (next_comment(s)) {
1222-
case (option::some[lexer::cmnt](?cmnt)) {
1254+
case (some(?cmnt)) {
12231255
if (cmnt.pos < pos) {
12241256
print_comment(s, cmnt);
12251257
s.cur_cmnt += 1u;
@@ -1233,13 +1265,13 @@ fn maybe_print_comment(&ps s, uint pos) {
12331265
fn maybe_print_trailing_comment(&ps s, common::span span) {
12341266
auto cm;
12351267
alt (s.cm) {
1236-
case (option::some[codemap](?ccm)) {
1268+
case (some(?ccm)) {
12371269
cm = ccm;
12381270
}
12391271
case (_) { ret; }
12401272
}
12411273
alt (next_comment(s)) {
1242-
case (option::some[lexer::cmnt](?cmnt)) {
1274+
case (some(?cmnt)) {
12431275
if (cmnt.style != lexer::trailing) { ret; }
12441276

12451277
auto span_line = codemap::lookup_pos(cm, span.hi);
@@ -1258,7 +1290,7 @@ fn maybe_print_trailing_comment(&ps s, common::span span) {
12581290
fn print_remaining_comments(&ps s) {
12591291
while (true) {
12601292
alt (next_comment(s)) {
1261-
case (option::some[lexer::cmnt](?cmnt)) {
1293+
case (some(?cmnt)) {
12621294
print_comment(s, cmnt);
12631295
s.cur_cmnt += 1u;
12641296
}

0 commit comments

Comments
 (0)