@@ -12,6 +12,9 @@ import middle::ty;
12
12
import util:: common;
13
13
import pp;
14
14
15
+ import option:: some;
16
+ import option:: none;
17
+
15
18
import pp:: printer;
16
19
import pp:: break_offset;
17
20
import pp:: word;
@@ -37,16 +40,20 @@ tag mode {
37
40
type ps = @rec ( pp:: printer s,
38
41
option:: t[ codemap] cm ,
39
42
option:: t[ vec[ lexer:: cmnt ] ] comments ,
43
+ option:: t[ vec[ lexer:: lit ] ] literals ,
40
44
mutable uint cur_cmnt ,
45
+ mutable uint cur_lit,
41
46
mutable vec[ pp:: breaks ] boxes ,
42
47
mode mode) ;
43
48
44
49
fn rust_printer ( io:: writer writer) -> ps {
45
50
let vec[ pp:: breaks] boxes = [ ] ;
46
51
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] ] ,
49
55
mutable cur_cmnt=0 u,
56
+ mutable cur_lit=0 u,
50
57
mutable boxes=boxes,
51
58
mode=mo_untyped) ;
52
59
}
@@ -62,11 +69,13 @@ fn to_str[T](&T t, fn(&ps s, &T s) f) -> str {
62
69
fn print_file ( session sess, ast:: _mod _mod, str filename , io:: writer out,
63
70
mode mode) {
64
71
let vec[ pp:: breaks] boxes = [ ] ;
65
- auto cmnts = lexer:: gather_comments ( sess, filename) ;
72
+ auto r = lexer:: gather_comments_and_literals ( sess, filename) ;
66
73
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 ) ,
69
77
mutable cur_cmnt=0 u,
78
+ mutable cur_lit=0 u,
70
79
mutable boxes = boxes,
71
80
mode=mode) ;
72
81
print_mod ( s, _mod) ;
@@ -281,15 +290,15 @@ fn print_type(&ps s, &ast::ty ty) {
281
290
for ( ast:: ty_method m in methods) {
282
291
hardbreak ( s. s ) ;
283
292
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 ) ,
285
294
m. inputs , m. output , m. cf ) ;
286
295
word ( s. s , ";" ) ;
287
296
end ( s) ;
288
297
}
289
298
bclose ( s, ty. span ) ;
290
299
}
291
300
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) ;
293
302
}
294
303
case ( ast:: ty_path ( ?path, _) ) {
295
304
print_path ( s, path) ;
@@ -351,8 +360,8 @@ fn print_item(&ps s, &@ast::item item) {
351
360
print_fn ( s, decl, ast:: proto_fn, id, typarams) ;
352
361
end ( s) ; // end head-ibox
353
362
alt ( lname) {
354
- case ( option :: none[ str ] ) { }
355
- case ( option :: some[ str ] ( ?ss) ) {
363
+ case ( none) { }
364
+ case ( some ( ?ss) ) {
356
365
print_string ( s, ss) ;
357
366
}
358
367
}
@@ -430,7 +439,7 @@ fn print_item(&ps s, &@ast::item item) {
430
439
print_block ( s, meth. node . meth . body ) ;
431
440
}
432
441
alt ( _obj. dtor ) {
433
- case ( option :: some[ @ast :: method ] ( ?dtor) ) {
442
+ case ( some ( ?dtor) ) {
434
443
head ( s, "drop" ) ;
435
444
print_block ( s, dtor. node . meth . body ) ;
436
445
}
@@ -474,7 +483,7 @@ fn print_block(&ps s, ast::block blk) {
474
483
475
484
}
476
485
alt ( blk. node . expr ) {
477
- case ( option :: some[ @ast :: expr ] ( ?expr) ) {
486
+ case ( some ( ?expr) ) {
478
487
space ( s. s ) ;
479
488
print_expr ( s, expr) ;
480
489
maybe_print_trailing_comment ( s, expr. span ) ;
@@ -493,8 +502,31 @@ fn print_block(&ps s, ast::block blk) {
493
502
}
494
503
}
495
504
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
+
496
516
fn print_literal ( & ps s, & @ast:: lit lit) {
497
517
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 += 1 u;
524
+ ret;
525
+ }
526
+ }
527
+ case ( _) { }
528
+ }
529
+
498
530
alt ( lit. node ) {
499
531
case ( ast:: lit_str ( ?st) ) { print_string ( s, st) ; }
500
532
case ( ast:: lit_char ( ?ch) ) {
@@ -504,8 +536,8 @@ fn print_literal(&ps s, &@ast::lit lit) {
504
536
case ( ast:: lit_int ( ?val) ) {
505
537
word ( s. s , common:: istr ( val) ) ;
506
538
}
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" ) ;
509
541
}
510
542
case ( ast:: lit_float ( ?fstr) ) {
511
543
word ( s. s , fstr) ;
@@ -580,7 +612,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
580
612
auto gs = get_span;
581
613
commasep_cmnt[ ast:: field] ( s, consistent, fields, f, gs) ;
582
614
alt ( wth) {
583
- case ( option :: some[ @ast :: expr ] ( ?expr) ) {
615
+ case ( some ( ?expr) ) {
584
616
if ( vec:: len[ ast:: field] ( fields) > 0 u) { space ( s. s ) ; }
585
617
ibox ( s, indent_unit) ;
586
618
word_space ( s, "with" ) ;
@@ -605,7 +637,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
605
637
case ( ast:: expr_bind ( ?func, ?args, _) ) {
606
638
fn print_opt ( & ps s, & option:: t[ @ast:: expr ] expr) {
607
639
alt ( expr) {
608
- case ( option :: some[ @ast :: expr ] ( ?expr) ) {
640
+ case ( some ( ?expr) ) {
609
641
print_expr ( s, expr) ;
610
642
}
611
643
case ( _) { word ( s. s , "_" ) ; }
@@ -655,7 +687,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
655
687
print_block ( s, block) ;
656
688
fn do_else ( & ps s, option:: t[ @ast:: expr ] els) {
657
689
alt ( els) {
658
- case ( option :: some[ @ast :: expr ] ( ?_else) ) {
690
+ case ( some ( ?_else) ) {
659
691
alt ( _else. node ) {
660
692
// "another else-if"
661
693
case ( ast:: expr_if ( ?i, ?t, ?e, _) ) {
@@ -807,7 +839,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
807
839
case ( ast:: expr_ret ( ?result, _) ) {
808
840
word ( s. s , "ret" ) ;
809
841
alt ( result) {
810
- case ( option :: some[ @ast :: expr ] ( ?expr) ) {
842
+ case ( some ( ?expr) ) {
811
843
word ( s. s , " " ) ;
812
844
print_expr ( s, expr) ;
813
845
}
@@ -817,7 +849,7 @@ fn print_expr(&ps s, &@ast::expr expr) {
817
849
case ( ast:: expr_put ( ?result, _) ) {
818
850
word ( s. s , "put" ) ;
819
851
alt ( result) {
820
- case ( option :: some[ @ast :: expr ] ( ?expr) ) {
852
+ case ( some ( ?expr) ) {
821
853
word ( s. s , " " ) ;
822
854
print_expr ( s, expr) ;
823
855
}
@@ -902,7 +934,7 @@ fn print_decl(&ps s, &@ast::decl decl) {
902
934
space ( s. s ) ;
903
935
ibox ( s, indent_unit) ;
904
936
alt ( loc. ty ) {
905
- case ( option :: some[ @ast :: ty ] ( ?ty) ) {
937
+ case ( some ( ?ty) ) {
906
938
word_nbsp ( s, "let" ) ;
907
939
print_type ( s, * ty) ;
908
940
space ( s. s ) ;
@@ -924,7 +956,7 @@ fn print_decl(&ps s, &@ast::decl decl) {
924
956
}
925
957
word ( s. s , loc. ident ) ;
926
958
alt ( loc. init ) {
927
- case ( option :: some[ ast :: initializer ] ( ?init) ) {
959
+ case ( some ( ?init) ) {
928
960
space ( s. s ) ;
929
961
alt ( init. op ) {
930
962
case ( ast:: init_assign) {
@@ -1176,7 +1208,7 @@ fn print_ty_fn(&ps s, &ast::proto proto, &option::t[str] id,
1176
1208
if ( proto == ast:: proto_fn) { word ( s. s , "fn" ) ; }
1177
1209
else { word ( s. s , "iter" ) ; }
1178
1210
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) ; }
1180
1212
case ( _) { }
1181
1213
}
1182
1214
popen ( s) ;
@@ -1207,19 +1239,19 @@ fn print_ty_fn(&ps s, &ast::proto proto, &option::t[str] id,
1207
1239
1208
1240
fn next_comment ( & ps s) -> option:: t [ lexer:: cmnt ] {
1209
1241
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] ; }
1214
1246
}
1215
- case ( _) { ret option :: none[ lexer:: cmnt] ; }
1247
+ case ( _) { ret none[ lexer:: cmnt] ; }
1216
1248
}
1217
1249
}
1218
1250
1219
1251
fn maybe_print_comment ( & ps s, uint pos) {
1220
1252
while ( true ) {
1221
1253
alt ( next_comment ( s) ) {
1222
- case ( option :: some[ lexer :: cmnt ] ( ?cmnt) ) {
1254
+ case ( some ( ?cmnt) ) {
1223
1255
if ( cmnt. pos < pos) {
1224
1256
print_comment ( s, cmnt) ;
1225
1257
s. cur_cmnt += 1 u;
@@ -1233,13 +1265,13 @@ fn maybe_print_comment(&ps s, uint pos) {
1233
1265
fn maybe_print_trailing_comment ( & ps s, common:: span span) {
1234
1266
auto cm;
1235
1267
alt ( s. cm ) {
1236
- case ( option :: some[ codemap ] ( ?ccm) ) {
1268
+ case ( some ( ?ccm) ) {
1237
1269
cm = ccm;
1238
1270
}
1239
1271
case ( _) { ret; }
1240
1272
}
1241
1273
alt ( next_comment ( s) ) {
1242
- case ( option :: some[ lexer :: cmnt ] ( ?cmnt) ) {
1274
+ case ( some ( ?cmnt) ) {
1243
1275
if ( cmnt. style != lexer:: trailing) { ret; }
1244
1276
1245
1277
auto span_line = codemap:: lookup_pos ( cm, span. hi ) ;
@@ -1258,7 +1290,7 @@ fn maybe_print_trailing_comment(&ps s, common::span span) {
1258
1290
fn print_remaining_comments ( & ps s) {
1259
1291
while ( true ) {
1260
1292
alt ( next_comment ( s) ) {
1261
- case ( option :: some[ lexer :: cmnt ] ( ?cmnt) ) {
1293
+ case ( some ( ?cmnt) ) {
1262
1294
print_comment ( s, cmnt) ;
1263
1295
s. cur_cmnt += 1 u;
1264
1296
}
0 commit comments