2011-06-01 18:53:52 -07:00
|
|
|
import std::uint;
|
2011-05-17 20:41:41 +02:00
|
|
|
import std::vec;
|
|
|
|
import std::str;
|
2011-05-12 17:24:54 +02:00
|
|
|
import std::io;
|
|
|
|
import std::option;
|
|
|
|
import driver::session::session;
|
|
|
|
import front::ast;
|
|
|
|
import front::lexer;
|
2011-05-30 16:22:58 -07:00
|
|
|
import front::codemap;
|
|
|
|
import front::codemap::codemap;
|
2011-05-17 17:42:23 -07:00
|
|
|
import middle::ty;
|
2011-05-12 17:24:54 +02:00
|
|
|
import util::common;
|
2011-05-28 19:16:18 -07:00
|
|
|
import pp;
|
|
|
|
|
|
|
|
import pp::printer;
|
|
|
|
import pp::break_offset;
|
2011-05-30 14:10:54 -07:00
|
|
|
import pp::word;
|
2011-05-30 17:34:59 -07:00
|
|
|
import pp::huge_word;
|
2011-06-01 10:54:11 -07:00
|
|
|
import pp::zero_word;
|
2011-05-28 19:16:18 -07:00
|
|
|
import pp::space;
|
2011-05-30 14:10:54 -07:00
|
|
|
import pp::zerobreak;
|
2011-05-28 19:16:18 -07:00
|
|
|
import pp::hardbreak;
|
2011-05-29 07:43:33 +00:00
|
|
|
import pp::breaks;
|
|
|
|
import pp::consistent;
|
|
|
|
import pp::inconsistent;
|
2011-05-28 19:16:18 -07:00
|
|
|
import pp::eof;
|
2011-03-04 07:22:43 +01:00
|
|
|
|
2011-03-24 16:33:20 +01:00
|
|
|
const uint indent_unit = 4u;
|
|
|
|
const uint default_columns = 78u;
|
|
|
|
|
2011-05-17 17:42:23 -07:00
|
|
|
tag mode {
|
|
|
|
mo_untyped;
|
2011-05-19 15:47:15 -07:00
|
|
|
mo_typed(ty::ctxt);
|
2011-06-01 18:53:52 -07:00
|
|
|
mo_identified;
|
2011-05-17 17:42:23 -07:00
|
|
|
}
|
|
|
|
|
2011-05-28 19:16:18 -07:00
|
|
|
type ps = @rec(pp::printer s,
|
2011-05-30 16:22:58 -07:00
|
|
|
option::t[codemap] cm,
|
2011-05-12 17:24:54 +02:00
|
|
|
option::t[vec[lexer::cmnt]] comments,
|
2011-05-17 17:42:23 -07:00
|
|
|
mutable uint cur_cmnt,
|
2011-06-01 15:29:38 -07:00
|
|
|
mutable vec[pp::breaks] boxes,
|
2011-05-17 17:42:23 -07:00
|
|
|
mode mode);
|
2011-03-04 07:22:43 +01:00
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn rust_printer(io::writer writer) -> ps {
|
2011-06-01 15:29:38 -07:00
|
|
|
let vec[pp::breaks] boxes = [];
|
2011-05-31 10:58:30 -07:00
|
|
|
ret @rec(s=pp::mk_printer(writer, default_columns),
|
|
|
|
cm=option::none[codemap],
|
|
|
|
comments=option::none[vec[lexer::cmnt]],
|
|
|
|
mutable cur_cmnt=0u,
|
2011-06-01 15:29:38 -07:00
|
|
|
mutable boxes = boxes,
|
2011-05-31 10:58:30 -07:00
|
|
|
mode=mo_untyped);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn to_str[T](&T t, fn(&ps s, &T s) f) -> str {
|
|
|
|
auto writer = io::string_writer();
|
|
|
|
auto s = rust_printer(writer.get_writer());
|
|
|
|
f(s, t);
|
|
|
|
eof(s.s);
|
|
|
|
ret writer.get_str();
|
|
|
|
}
|
|
|
|
|
2011-05-17 17:42:23 -07:00
|
|
|
fn print_file(session sess, ast::_mod _mod, str filename, io::writer out,
|
|
|
|
mode mode) {
|
2011-06-01 15:29:38 -07:00
|
|
|
let vec[pp::breaks] boxes = [];
|
2011-05-12 17:24:54 +02:00
|
|
|
auto cmnts = lexer::gather_comments(sess, filename);
|
2011-05-28 19:16:18 -07:00
|
|
|
auto s = @rec(s=pp::mk_printer(out, default_columns),
|
2011-05-30 16:22:58 -07:00
|
|
|
cm=option::some[codemap](sess.get_codemap()),
|
2011-05-12 17:24:54 +02:00
|
|
|
comments=option::some[vec[lexer::cmnt]](cmnts),
|
2011-05-17 17:42:23 -07:00
|
|
|
mutable cur_cmnt=0u,
|
2011-06-01 15:29:38 -07:00
|
|
|
mutable boxes = boxes,
|
2011-05-17 17:42:23 -07:00
|
|
|
mode=mode);
|
2011-03-24 16:33:20 +01:00
|
|
|
print_mod(s, _mod);
|
2011-05-28 19:16:18 -07:00
|
|
|
eof(s.s);
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn ty_to_str(&ast::ty ty) -> str { be to_str(ty, print_type); }
|
2011-06-01 17:47:59 -07:00
|
|
|
fn pat_to_str(&@ast::pat pat) -> str { be to_str(pat, print_pat); }
|
|
|
|
fn expr_to_str(&@ast::expr e) -> str { be to_str(e, print_expr); }
|
|
|
|
fn stmt_to_str(&ast::stmt s) -> str { be to_str(s, print_stmt); }
|
|
|
|
fn item_to_str(&@ast::item i) -> str { be to_str(i, print_item); }
|
|
|
|
fn path_to_str(&ast::path p) -> str { be to_str(p, print_path); }
|
|
|
|
fn lit_to_str(&@ast::lit l) -> str { be to_str(l, print_literal); }
|
2011-05-31 10:58:30 -07:00
|
|
|
|
|
|
|
fn fun_to_str(&ast::_fn f, str name, vec[ast::ty_param] params) -> str {
|
2011-05-12 17:24:54 +02:00
|
|
|
auto writer = io::string_writer();
|
2011-05-31 10:58:30 -07:00
|
|
|
auto s = rust_printer(writer.get_writer());
|
2011-06-01 13:18:16 -07:00
|
|
|
print_fn(s, f.decl, f.proto, name, params);
|
2011-05-28 19:16:18 -07:00
|
|
|
eof(s.s);
|
2011-03-24 16:33:20 +01:00
|
|
|
ret writer.get_str();
|
2011-03-09 11:41:50 +01:00
|
|
|
}
|
|
|
|
|
2011-05-12 17:24:54 +02:00
|
|
|
fn block_to_str(&ast::block blk) -> str {
|
|
|
|
auto writer = io::string_writer();
|
2011-05-31 10:58:30 -07:00
|
|
|
auto s = rust_printer(writer.get_writer());
|
|
|
|
|
2011-05-31 09:54:18 -07:00
|
|
|
// containing cbox, will be closed by print-block at }
|
2011-06-01 15:29:38 -07:00
|
|
|
cbox(s, indent_unit);
|
2011-05-31 09:54:18 -07:00
|
|
|
|
|
|
|
// head-ibox, will be closed by print-block after {
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, 0u);
|
2011-03-31 20:29:59 -04:00
|
|
|
print_block(s, blk);
|
2011-05-28 19:16:18 -07:00
|
|
|
eof(s.s);
|
2011-03-31 20:29:59 -04:00
|
|
|
ret writer.get_str();
|
|
|
|
}
|
|
|
|
|
2011-06-01 15:29:38 -07:00
|
|
|
fn ibox(&ps s, uint u) {
|
|
|
|
vec::push(s.boxes, pp::inconsistent);
|
|
|
|
pp::ibox(s.s, u);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn cbox(&ps s, uint u) {
|
|
|
|
vec::push(s.boxes, pp::consistent);
|
|
|
|
pp::cbox(s.s, u);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn box(&ps s, uint u, pp::breaks b) {
|
|
|
|
vec::push(s.boxes, b);
|
|
|
|
pp::box(s.s, u, b);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn end(&ps s) {
|
|
|
|
vec::pop(s.boxes);
|
|
|
|
pp::end(s.s);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn word_nbsp(&ps s, str w) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, w);
|
|
|
|
word(s.s, " ");
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn word_space(&ps s, str w) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, w);
|
2011-03-24 16:33:20 +01:00
|
|
|
space(s.s);
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn popen(&ps s) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "(");
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn pclose(&ps s) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, ")");
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn head(&ps s, str w) {
|
2011-05-28 19:16:18 -07:00
|
|
|
// outer-box is consistent
|
2011-06-01 15:29:38 -07:00
|
|
|
cbox(s, indent_unit);
|
2011-05-28 19:16:18 -07:00
|
|
|
// head-box is inconsistent
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, str::char_len(w) + 1u);
|
2011-05-28 19:16:18 -07:00
|
|
|
// keyword that starts the head
|
2011-05-30 14:10:54 -07:00
|
|
|
word_nbsp(s, w);
|
2011-05-28 19:16:18 -07:00
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn bopen(&ps s) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "{");
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s); // close the head-box
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn bclose(&ps s, common::span span) {
|
2011-03-24 16:33:20 +01:00
|
|
|
maybe_print_comment(s, span.hi);
|
2011-05-28 19:16:18 -07:00
|
|
|
break_offset(s.s, 1u, -(indent_unit as int));
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "}");
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s); // close the outer-box
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
|
2011-06-01 18:53:52 -07:00
|
|
|
// Synthesizes a comment that was not textually present in the original source
|
|
|
|
// file.
|
|
|
|
fn synth_comment(&ps s, str text) {
|
|
|
|
word(s.s, "/*");
|
|
|
|
space(s.s);
|
|
|
|
word(s.s, text);
|
|
|
|
space(s.s);
|
|
|
|
word(s.s, "*/");
|
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn commasep[IN](&ps s, breaks b, vec[IN] elts, fn(&ps, &IN) op) {
|
2011-06-01 15:29:38 -07:00
|
|
|
box(s, 0u, b);
|
2011-03-24 16:33:20 +01:00
|
|
|
auto first = true;
|
|
|
|
for (IN elt in elts) {
|
|
|
|
if (first) {first = false;}
|
2011-05-28 19:16:18 -07:00
|
|
|
else {word_space(s, ",");}
|
2011-03-24 16:33:20 +01:00
|
|
|
op(s, elt);
|
|
|
|
}
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn commasep_cmnt[IN](&ps s, breaks b, vec[IN] elts, fn(&ps, &IN) op,
|
2011-05-28 19:16:18 -07:00
|
|
|
fn(&IN) -> common::span get_span) {
|
2011-06-01 15:29:38 -07:00
|
|
|
box(s, 0u, b);
|
2011-05-17 20:41:41 +02:00
|
|
|
auto len = vec::len[IN](elts);
|
2011-03-29 12:46:55 +02:00
|
|
|
auto i = 0u;
|
|
|
|
for (IN elt in elts) {
|
2011-05-30 15:56:01 -07:00
|
|
|
maybe_print_comment(s, get_span(elt).hi);
|
2011-03-29 12:46:55 +02:00
|
|
|
op(s, elt);
|
|
|
|
i += 1u;
|
|
|
|
if (i < len) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, ",");
|
2011-05-30 17:34:59 -07:00
|
|
|
maybe_print_trailing_comment(s, get_span(elt));
|
|
|
|
space(s.s);
|
2011-03-29 12:46:55 +02:00
|
|
|
}
|
|
|
|
}
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-03-29 12:46:55 +02:00
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn commasep_exprs(&ps s, breaks b, vec[@ast::expr] exprs) {
|
2011-05-12 17:24:54 +02:00
|
|
|
fn expr_span(&@ast::expr expr) -> common::span {ret expr.span;}
|
2011-03-29 12:46:55 +02:00
|
|
|
auto f = print_expr;
|
|
|
|
auto gs = expr_span;
|
2011-05-29 07:43:33 +00:00
|
|
|
commasep_cmnt[@ast::expr](s, b, exprs, f, gs);
|
2011-03-29 12:46:55 +02:00
|
|
|
}
|
2011-03-04 07:22:43 +01:00
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_mod(&ps s, ast::_mod _mod) {
|
2011-05-12 17:24:54 +02:00
|
|
|
for (@ast::view_item vitem in _mod.view_items) {
|
|
|
|
print_view_item(s, vitem);
|
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
for (@ast::item item in _mod.items) {
|
|
|
|
// Mod-level item printing we're a little more space-y about.
|
|
|
|
hardbreak(s.s);
|
|
|
|
print_item(s, item);
|
|
|
|
}
|
2011-03-24 16:33:20 +01:00
|
|
|
print_remaining_comments(s);
|
2011-03-17 17:39:47 -07:00
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_boxed_type(&ps s, &@ast::ty ty) { print_type(s, *ty); }
|
|
|
|
fn print_type(&ps s, &ast::ty ty) {
|
2011-05-28 19:16:18 -07:00
|
|
|
|
2011-03-24 16:33:20 +01:00
|
|
|
maybe_print_comment(s, ty.span.lo);
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, 0u);
|
2011-03-24 16:33:20 +01:00
|
|
|
alt (ty.node) {
|
2011-05-30 14:10:54 -07:00
|
|
|
case (ast::ty_nil) {word(s.s, "()");}
|
|
|
|
case (ast::ty_bool) {word(s.s, "bool");}
|
2011-06-01 13:08:08 -07:00
|
|
|
case (ast::ty_bot) {word(s.s, "!");}
|
2011-05-30 14:10:54 -07:00
|
|
|
case (ast::ty_int) {word(s.s, "int");}
|
|
|
|
case (ast::ty_uint) {word(s.s, "uint");}
|
|
|
|
case (ast::ty_float) {word(s.s, "float");}
|
|
|
|
case (ast::ty_machine(?tm)) {word(s.s, common::ty_mach_to_str(tm));}
|
|
|
|
case (ast::ty_char) {word(s.s, "char");}
|
|
|
|
case (ast::ty_str) {word(s.s, "str");}
|
|
|
|
case (ast::ty_box(?mt)) {word(s.s, "@"); print_mt(s, mt);}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::ty_vec(?mt)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "vec["); print_mt(s, mt); word(s.s, "]");
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::ty_port(?t)) {
|
2011-05-31 10:58:30 -07:00
|
|
|
word(s.s, "port["); print_type(s, *t); word(s.s, "]");
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::ty_chan(?t)) {
|
2011-05-31 10:58:30 -07:00
|
|
|
word(s.s, "chan["); print_type(s, *t); word(s.s, "]");
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-30 14:10:54 -07:00
|
|
|
case (ast::ty_type) {word(s.s, "type");}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::ty_tup(?elts)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "tup");
|
2011-03-24 16:33:20 +01:00
|
|
|
popen(s);
|
|
|
|
auto f = print_mt;
|
2011-05-29 07:43:33 +00:00
|
|
|
commasep[ast::mt](s, inconsistent, elts, f);
|
2011-03-24 16:33:20 +01:00
|
|
|
pclose(s);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::ty_rec(?fields)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "rec");
|
2011-03-24 16:33:20 +01:00
|
|
|
popen(s);
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_field(&ps s, &ast::ty_field f) {
|
2011-06-01 15:29:38 -07:00
|
|
|
cbox(s, indent_unit);
|
2011-03-24 16:33:20 +01:00
|
|
|
print_mt(s, f.mt);
|
|
|
|
space(s.s);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, f.ident);
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
fn get_span(&ast::ty_field f) -> common::span {
|
2011-03-29 12:46:55 +02:00
|
|
|
// Try to reconstruct the span for this field
|
|
|
|
auto sp = f.mt.ty.span;
|
2011-05-17 20:41:41 +02:00
|
|
|
auto hi = sp.hi + str::char_len(f.ident) + 1u;
|
2011-03-29 12:46:55 +02:00
|
|
|
ret rec(hi=hi with sp);
|
|
|
|
}
|
2011-03-24 16:33:20 +01:00
|
|
|
auto f = print_field;
|
2011-03-29 12:46:55 +02:00
|
|
|
auto gs = get_span;
|
2011-05-29 07:43:33 +00:00
|
|
|
commasep_cmnt[ast::ty_field](s, consistent, fields, f, gs);
|
2011-03-24 16:33:20 +01:00
|
|
|
pclose(s);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::ty_obj(?methods)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
head(s, "obj");
|
2011-03-24 16:33:20 +01:00
|
|
|
bopen(s);
|
2011-05-12 17:24:54 +02:00
|
|
|
for (ast::ty_method m in methods) {
|
2011-05-30 17:44:38 -07:00
|
|
|
hardbreak(s.s);
|
2011-06-01 15:29:38 -07:00
|
|
|
cbox(s, indent_unit);
|
2011-05-12 17:24:54 +02:00
|
|
|
print_ty_fn(s, m.proto, option::some[str](m.ident),
|
2011-05-20 14:15:39 -07:00
|
|
|
m.inputs, m.output, m.cf);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, ";");
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
bclose(s, ty.span);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-20 14:15:39 -07:00
|
|
|
case (ast::ty_fn(?proto,?inputs,?output,?cf)) {
|
|
|
|
print_ty_fn(s, proto, option::none[str], inputs, output, cf);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::ty_path(?path,_)) {
|
2011-03-24 16:33:20 +01:00
|
|
|
print_path(s, path);
|
|
|
|
}
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_item(&ps s, &@ast::item item) {
|
2011-05-28 19:16:18 -07:00
|
|
|
|
|
|
|
hardbreak(s.s);
|
2011-03-24 16:33:20 +01:00
|
|
|
maybe_print_comment(s, item.span.lo);
|
|
|
|
alt (item.node) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::item_const(?id, ?ty, ?expr, _, _)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
head(s, "const");
|
2011-05-31 10:58:30 -07:00
|
|
|
print_type(s, *ty);
|
2011-03-24 16:33:20 +01:00
|
|
|
space(s.s);
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, id);
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s); // end the head-ibox
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, "=");
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, expr);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, ";");
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s); // end the outer cbox
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::item_fn(?name,?_fn,?typarams,_,_)) {
|
2011-06-01 13:18:16 -07:00
|
|
|
print_fn(s, _fn.decl, _fn.proto, name, typarams);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, " ");
|
2011-03-24 16:33:20 +01:00
|
|
|
print_block(s, _fn.body);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::item_mod(?id,?_mod,_)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
head(s, "mod");
|
2011-06-01 12:26:42 -07:00
|
|
|
word_nbsp(s, id);
|
2011-03-24 16:33:20 +01:00
|
|
|
bopen(s);
|
2011-05-12 17:24:54 +02:00
|
|
|
for (@ast::item itm in _mod.items) {print_item(s, itm);}
|
2011-05-28 19:16:18 -07:00
|
|
|
bclose(s, item.span);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::item_native_mod(?id,?nmod,_)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
head(s, "native");
|
2011-03-24 16:33:20 +01:00
|
|
|
alt (nmod.abi) {
|
2011-05-28 19:16:18 -07:00
|
|
|
case (ast::native_abi_rust) {word_nbsp(s, "\"rust\"");}
|
|
|
|
case (ast::native_abi_cdecl) {word_nbsp(s, "\"cdecl\"");}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::native_abi_rust_intrinsic) {
|
2011-05-28 19:16:18 -07:00
|
|
|
word_nbsp(s, "\"rust-intrinsic\"");
|
2011-05-03 18:03:59 -07:00
|
|
|
}
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
word_nbsp(s, "mod");
|
|
|
|
word_nbsp(s, id);
|
2011-03-24 16:33:20 +01:00
|
|
|
bopen(s);
|
2011-05-12 17:24:54 +02:00
|
|
|
for (@ast::native_item item in nmod.items) {
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, indent_unit);
|
2011-03-24 16:33:20 +01:00
|
|
|
maybe_print_comment(s, item.span.lo);
|
|
|
|
alt (item.node) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::native_item_ty(?id,_)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
word_nbsp(s, "type");
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, id);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::native_item_fn(?id,?lname,?decl,
|
2011-03-24 16:33:20 +01:00
|
|
|
?typarams,_,_)) {
|
2011-06-01 13:18:16 -07:00
|
|
|
print_fn(s, decl, ast::proto_fn, id, typarams);
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s); // end head-ibox
|
2011-03-24 16:33:20 +01:00
|
|
|
alt (lname) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (option::none[str]) {}
|
|
|
|
case (option::some[str](?ss)) {
|
2011-03-24 16:33:20 +01:00
|
|
|
print_string(s, ss);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, ";");
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
bclose(s, item.span);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::item_ty(?id,?ty,?params,_,_)) {
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, indent_unit);
|
|
|
|
ibox(s, 0u);
|
2011-05-28 19:16:18 -07:00
|
|
|
word_nbsp(s, "type");
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, id);
|
2011-03-24 16:33:20 +01:00
|
|
|
print_type_params(s, params);
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s); // end the inner ibox
|
2011-03-24 16:33:20 +01:00
|
|
|
space(s.s);
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, "=");
|
2011-05-31 10:58:30 -07:00
|
|
|
print_type(s, *ty);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, ";");
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s); // end the outer ibox
|
2011-05-28 19:16:18 -07:00
|
|
|
break_offset(s.s, 0u, 0);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::item_tag(?id,?variants,?params,_,_)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
head(s, "tag");
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, id);
|
2011-03-24 16:33:20 +01:00
|
|
|
print_type_params(s, params);
|
|
|
|
space(s.s);
|
|
|
|
bopen(s);
|
2011-05-12 17:24:54 +02:00
|
|
|
for (ast::variant v in variants) {
|
2011-05-28 19:16:18 -07:00
|
|
|
space(s.s);
|
2011-03-29 12:46:55 +02:00
|
|
|
maybe_print_comment(s, v.span.lo);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, v.node.name);
|
2011-05-17 20:41:41 +02:00
|
|
|
if (vec::len[ast::variant_arg](v.node.args) > 0u) {
|
2011-03-24 16:33:20 +01:00
|
|
|
popen(s);
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_variant_arg(&ps s, &ast::variant_arg arg) {
|
|
|
|
print_type(s, *arg.ty);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
|
|
|
auto f = print_variant_arg;
|
2011-05-29 07:43:33 +00:00
|
|
|
commasep[ast::variant_arg](s, consistent, v.node.args, f);
|
2011-03-24 16:33:20 +01:00
|
|
|
pclose(s);
|
|
|
|
}
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, ";");
|
2011-05-30 17:34:59 -07:00
|
|
|
maybe_print_trailing_comment(s, v.span);
|
2011-03-20 20:18:19 -07:00
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
bclose(s, item.span);
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::item_obj(?id,?_obj,?params,_,_)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
head(s, "obj");
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, id);
|
2011-03-24 16:33:20 +01:00
|
|
|
print_type_params(s, params);
|
|
|
|
popen(s);
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_field(&ps s, &ast::obj_field field) {
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, indent_unit);
|
2011-05-31 10:58:30 -07:00
|
|
|
print_type(s, *field.ty);
|
2011-03-24 16:33:20 +01:00
|
|
|
space(s.s);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, field.ident);
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
fn get_span(&ast::obj_field f) -> common::span {ret f.ty.span;}
|
2011-03-24 16:33:20 +01:00
|
|
|
auto f = print_field;
|
2011-03-29 12:46:55 +02:00
|
|
|
auto gs = get_span;
|
2011-05-29 07:43:33 +00:00
|
|
|
commasep_cmnt[ast::obj_field](s, consistent, _obj.fields, f, gs);
|
2011-03-24 16:33:20 +01:00
|
|
|
pclose(s);
|
|
|
|
space(s.s);
|
|
|
|
bopen(s);
|
2011-05-12 17:24:54 +02:00
|
|
|
for (@ast::method meth in _obj.methods) {
|
2011-05-16 18:21:22 -07:00
|
|
|
let vec[ast::ty_param] typarams = [];
|
2011-05-28 19:16:18 -07:00
|
|
|
hardbreak(s.s);
|
2011-03-24 16:33:20 +01:00
|
|
|
maybe_print_comment(s, meth.span.lo);
|
2011-06-01 13:18:16 -07:00
|
|
|
print_fn(s, meth.node.meth.decl, meth.node.meth.proto,
|
|
|
|
meth.node.ident, typarams);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, " ");
|
2011-03-24 16:33:20 +01:00
|
|
|
print_block(s, meth.node.meth.body);
|
|
|
|
}
|
|
|
|
alt (_obj.dtor) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (option::some[@ast::method](?dtor)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
head(s, "drop");
|
2011-04-14 16:50:48 -07:00
|
|
|
print_block(s, dtor.node.meth.body);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
|
|
|
case (_) {}
|
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
bclose(s, item.span);
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_stmt(&ps s, &ast::stmt st) {
|
|
|
|
maybe_print_comment(s, st.span.lo);
|
|
|
|
alt (st.node) {
|
|
|
|
case (ast::stmt_decl(?decl,_)) {
|
|
|
|
print_decl(s, decl);
|
|
|
|
}
|
|
|
|
case (ast::stmt_expr(?expr,_)) {
|
|
|
|
space(s.s);
|
|
|
|
print_expr(s, expr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (front::parser::stmt_ends_with_semi(st)) {word(s.s, ";");}
|
|
|
|
maybe_print_trailing_comment(s, st.span);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn print_block(&ps s, ast::block blk) {
|
2011-03-24 16:33:20 +01:00
|
|
|
maybe_print_comment(s, blk.span.lo);
|
|
|
|
bopen(s);
|
2011-05-28 19:16:18 -07:00
|
|
|
auto first = true;
|
2011-05-12 17:24:54 +02:00
|
|
|
for (@ast::stmt st in blk.node.stmts) {
|
2011-05-31 10:58:30 -07:00
|
|
|
print_stmt(s, *st)
|
|
|
|
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
2011-03-24 16:33:20 +01:00
|
|
|
alt (blk.node.expr) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (option::some[@ast::expr](?expr)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
space(s.s);
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, expr);
|
2011-05-30 17:34:59 -07:00
|
|
|
maybe_print_trailing_comment(s, expr.span);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
|
|
|
case (_) {}
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
bclose(s, blk.span);
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_literal(&ps s, &@ast::lit lit) {
|
2011-03-24 16:33:20 +01:00
|
|
|
maybe_print_comment(s, lit.span.lo);
|
|
|
|
alt (lit.node) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::lit_str(?st)) {print_string(s, st);}
|
|
|
|
case (ast::lit_char(?ch)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "'" + escape_str(str::from_bytes([ch as u8]), '\'')
|
2011-03-24 16:33:20 +01:00
|
|
|
+ "'");
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::lit_int(?val)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, common::istr(val));
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::lit_uint(?val)) { // FIXME clipping? uistr?
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, common::istr(val as int) + "u");
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::lit_float(?fstr)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, fstr);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::lit_mach_int(?mach,?val)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, common::istr(val as int));
|
|
|
|
word(s.s, common::ty_mach_to_str(mach));
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::lit_mach_float(?mach,?val)) {
|
2011-04-01 17:48:47 -07:00
|
|
|
// val is already a str
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, val);
|
|
|
|
word(s.s, common::ty_mach_to_str(mach));
|
2011-04-01 17:48:47 -07:00
|
|
|
}
|
2011-05-30 14:10:54 -07:00
|
|
|
case (ast::lit_nil) {word(s.s, "()");}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::lit_bool(?val)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
if (val) {word(s.s, "true");} else {word(s.s, "false");}
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_expr(&ps s, &@ast::expr expr) {
|
2011-03-24 16:33:20 +01:00
|
|
|
maybe_print_comment(s, expr.span.lo);
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, indent_unit);
|
2011-05-17 17:42:23 -07:00
|
|
|
|
|
|
|
alt (s.mode) {
|
|
|
|
case (mo_untyped) { /* no-op */ }
|
2011-05-19 15:47:15 -07:00
|
|
|
case (mo_typed(_)) { popen(s); }
|
2011-06-01 18:53:52 -07:00
|
|
|
case (mo_identified) { popen(s); }
|
2011-05-17 17:42:23 -07:00
|
|
|
}
|
|
|
|
|
2011-03-24 16:33:20 +01:00
|
|
|
alt (expr.node) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_vec(?exprs,?mut,_)) {
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, indent_unit);
|
2011-06-01 12:26:42 -07:00
|
|
|
word(s.s, "[");
|
2011-05-12 17:24:54 +02:00
|
|
|
if (mut == ast::mut) {
|
2011-05-28 19:16:18 -07:00
|
|
|
word_nbsp(s, "mutable");
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-29 07:43:33 +00:00
|
|
|
commasep_exprs(s, inconsistent, exprs);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "]");
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-03-14 15:03:47 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_tup(?exprs,_)) {
|
2011-05-31 10:58:30 -07:00
|
|
|
fn printElt(&ps s, &ast::elt elt) {
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, indent_unit);
|
2011-05-28 19:16:18 -07:00
|
|
|
if (elt.mut == ast::mut) {word_nbsp(s, "mutable");}
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, elt.expr);
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
fn get_span(&ast::elt elt) -> common::span {ret elt.expr.span;}
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "tup");
|
2011-03-24 16:33:20 +01:00
|
|
|
popen(s);
|
|
|
|
auto f = printElt;
|
2011-03-29 12:46:55 +02:00
|
|
|
auto gs = get_span;
|
2011-05-29 07:43:33 +00:00
|
|
|
commasep_cmnt[ast::elt](s, inconsistent, exprs, f, gs);
|
2011-03-24 16:33:20 +01:00
|
|
|
pclose(s);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_rec(?fields,?wth,_)) {
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_field(&ps s, &ast::field field) {
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, indent_unit);
|
2011-05-30 15:56:01 -07:00
|
|
|
if (field.node.mut == ast::mut) {word_nbsp(s, "mutable");}
|
|
|
|
word(s.s, field.node.ident);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "=");
|
2011-05-30 15:56:01 -07:00
|
|
|
print_expr(s, field.node.expr);
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
fn get_span(&ast::field field) -> common::span {
|
2011-05-30 15:56:01 -07:00
|
|
|
ret field.span;
|
2011-03-29 12:46:55 +02:00
|
|
|
}
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "rec");
|
2011-03-24 16:33:20 +01:00
|
|
|
popen(s);
|
|
|
|
auto f = print_field;
|
2011-03-29 12:46:55 +02:00
|
|
|
auto gs = get_span;
|
2011-05-29 07:43:33 +00:00
|
|
|
commasep_cmnt[ast::field](s, consistent, fields, f, gs);
|
2011-03-24 16:33:20 +01:00
|
|
|
alt (wth) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (option::some[@ast::expr](?expr)) {
|
2011-05-17 20:41:41 +02:00
|
|
|
if (vec::len[ast::field](fields) > 0u) {space(s.s);}
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, indent_unit);
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, "with");
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, expr);
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
|
|
|
case (_) {}
|
|
|
|
}
|
|
|
|
pclose(s);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_call(?func,?args,_)) {
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, func);
|
2011-06-01 16:12:22 -07:00
|
|
|
zerobreak(s.s);
|
2011-03-24 16:33:20 +01:00
|
|
|
popen(s);
|
2011-05-29 07:43:33 +00:00
|
|
|
commasep_exprs(s, inconsistent, args);
|
2011-03-24 16:33:20 +01:00
|
|
|
pclose(s);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_self_method(?ident,_)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "self.");
|
2011-04-05 14:18:44 -07:00
|
|
|
print_ident(s, ident);
|
2011-03-31 11:26:25 -07:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_bind(?func,?args,_)) {
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_opt(&ps s, &option::t[@ast::expr] expr) {
|
2011-03-24 16:33:20 +01:00
|
|
|
alt (expr) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (option::some[@ast::expr](?expr)) {
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, expr);
|
|
|
|
}
|
2011-05-30 14:10:54 -07:00
|
|
|
case (_) {word(s.s, "_");}
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
word_nbsp(s, "bind");
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, func);
|
|
|
|
popen(s);
|
|
|
|
auto f = print_opt;
|
2011-05-29 07:43:33 +00:00
|
|
|
commasep[option::t[@ast::expr]](s, inconsistent, args, f);
|
2011-03-24 16:33:20 +01:00
|
|
|
pclose(s);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_spawn(_,_,?e,?es,_)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
word_nbsp(s, "spawn");
|
Handle nested items correctly in typestate_check
Summary says it all. Actually, only nested objects and functions
are handled, but that's better than before. The fold that I was using
before to traverse a crate wasn't working correctly, because annotations
have to reflect the number of local variables of the nearest enclosing
function (in turn, because annotations are represented as bit vectors).
The fold was traversing the AST in the wrong order, first filling in
the annotations correctly, but then re-traversing them with the bit
vector length for any outer nested functions, and so on.
Remedying this required writing a lot of tedious boilerplate code
because I scrapped the idea of using a fold altogether.
I also made typestate_check handle unary, field, alt, and fail.
Also, some miscellaneous changes:
* added annotations to blocks in typeck
* fix pprust so it can handle spawn
* added more logging functions in util.common
* fixed _vec.or
* added maybe and from_maybe in option
* removed fold_block field from ast_fold, since it was never used
2011-04-18 15:33:10 -07:00
|
|
|
print_expr(s, e);
|
|
|
|
popen(s);
|
2011-05-29 07:43:33 +00:00
|
|
|
commasep_exprs(s, inconsistent, es);
|
Handle nested items correctly in typestate_check
Summary says it all. Actually, only nested objects and functions
are handled, but that's better than before. The fold that I was using
before to traverse a crate wasn't working correctly, because annotations
have to reflect the number of local variables of the nearest enclosing
function (in turn, because annotations are represented as bit vectors).
The fold was traversing the AST in the wrong order, first filling in
the annotations correctly, but then re-traversing them with the bit
vector length for any outer nested functions, and so on.
Remedying this required writing a lot of tedious boilerplate code
because I scrapped the idea of using a fold altogether.
I also made typestate_check handle unary, field, alt, and fail.
Also, some miscellaneous changes:
* added annotations to blocks in typeck
* fix pprust so it can handle spawn
* added more logging functions in util.common
* fixed _vec.or
* added maybe and from_maybe in option
* removed fold_block field from ast_fold, since it was never used
2011-04-18 15:33:10 -07:00
|
|
|
pclose(s);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_binary(?op,?lhs,?rhs,_)) {
|
2011-03-24 16:33:20 +01:00
|
|
|
auto prec = operator_prec(op);
|
|
|
|
print_maybe_parens(s, lhs, prec);
|
|
|
|
space(s.s);
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, ast::binop_to_str(op));
|
2011-03-24 16:33:20 +01:00
|
|
|
print_maybe_parens(s, rhs, prec + 1);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_unary(?op,?expr,_)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, ast::unop_to_str(op));
|
2011-03-04 07:22:43 +01:00
|
|
|
print_expr(s, expr);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_lit(?lit,_)) {
|
2011-03-24 16:33:20 +01:00
|
|
|
print_literal(s, lit);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_cast(?expr,?ty,_)) {
|
2011-05-13 21:30:08 +02:00
|
|
|
print_maybe_parens(s, expr, front::parser::as_prec);
|
2011-03-24 16:33:20 +01:00
|
|
|
space(s.s);
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, "as");
|
2011-05-31 10:58:30 -07:00
|
|
|
print_type(s, *ty);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_if(?test,?block,?elseopt,_)) {
|
2011-05-31 12:57:56 -07:00
|
|
|
|
2011-05-28 19:16:18 -07:00
|
|
|
head(s, "if");
|
|
|
|
popen(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, test);
|
|
|
|
pclose(s);
|
|
|
|
space(s.s);
|
|
|
|
print_block(s, block);
|
2011-05-31 12:57:56 -07:00
|
|
|
fn do_else(&ps s, option::t[@ast::expr] els) {
|
|
|
|
alt (els) {
|
|
|
|
case (option::some[@ast::expr](?_else)) {
|
|
|
|
alt (_else.node) {
|
|
|
|
// "another else-if"
|
|
|
|
case (ast::expr_if(?i,?t,?e,_)) {
|
2011-06-01 15:29:38 -07:00
|
|
|
cbox(s, indent_unit-1u);
|
|
|
|
ibox(s, 0u);
|
2011-05-31 12:57:56 -07:00
|
|
|
word(s.s, " else if ");
|
|
|
|
popen(s);
|
|
|
|
print_expr(s, i);
|
|
|
|
pclose(s);
|
|
|
|
space(s.s);
|
|
|
|
print_block(s, t);
|
|
|
|
do_else(s, e);
|
|
|
|
}
|
|
|
|
// "final else"
|
|
|
|
case (ast::expr_block(?b, _)) {
|
2011-06-01 15:29:38 -07:00
|
|
|
cbox(s, indent_unit-1u);
|
|
|
|
ibox(s, 0u);
|
2011-05-31 12:57:56 -07:00
|
|
|
word(s.s, " else ");
|
|
|
|
print_block(s, b);
|
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
}
|
|
|
|
}
|
2011-05-31 12:57:56 -07:00
|
|
|
case (_) { /* fall through */ }
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
|
|
|
}
|
2011-05-31 12:57:56 -07:00
|
|
|
do_else(s, elseopt);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_while(?test,?block,_)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
head(s, "while");
|
|
|
|
popen(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, test);
|
|
|
|
pclose(s);
|
|
|
|
space(s.s);
|
|
|
|
print_block(s, block);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_for(?decl,?expr,?block,_)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
head(s, "for");
|
|
|
|
popen(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
print_for_decl(s, decl);
|
|
|
|
space(s.s);
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, "in");
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, expr);
|
|
|
|
pclose(s);
|
|
|
|
space(s.s);
|
|
|
|
print_block(s, block);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_for_each(?decl,?expr,?block,_)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
head(s, "for each");
|
|
|
|
popen(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
print_for_decl(s, decl);
|
|
|
|
space(s.s);
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, "in");
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, expr);
|
|
|
|
pclose(s);
|
|
|
|
space(s.s);
|
|
|
|
print_block(s, block);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_do_while(?block,?expr,_)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
head(s, "do");
|
2011-03-24 16:33:20 +01:00
|
|
|
space(s.s);
|
|
|
|
print_block(s, block);
|
|
|
|
space(s.s);
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, "while");
|
|
|
|
popen(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, expr);
|
|
|
|
pclose(s);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_alt(?expr,?arms,_)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
head(s, "alt");
|
|
|
|
popen(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, expr);
|
|
|
|
pclose(s);
|
|
|
|
space(s.s);
|
|
|
|
bopen(s);
|
2011-05-12 17:24:54 +02:00
|
|
|
for (ast::arm arm in arms) {
|
2011-05-28 19:16:18 -07:00
|
|
|
space(s.s);
|
|
|
|
head(s, "case");
|
|
|
|
popen(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
print_pat(s, arm.pat);
|
|
|
|
pclose(s);
|
|
|
|
space(s.s);
|
|
|
|
print_block(s, arm.block);
|
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
bclose(s, expr.span);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_block(?block,_)) {
|
2011-05-31 09:54:18 -07:00
|
|
|
// containing cbox, will be closed by print-block at }
|
2011-06-01 15:29:38 -07:00
|
|
|
cbox(s, indent_unit);
|
2011-05-31 09:54:18 -07:00
|
|
|
|
|
|
|
// head-box, will be closed by print-block after {
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, 0u);
|
2011-03-24 16:33:20 +01:00
|
|
|
print_block(s, block);
|
|
|
|
}
|
2011-05-27 17:38:52 -07:00
|
|
|
case (ast::expr_move(?lhs,?rhs,_)) {
|
|
|
|
print_expr(s, lhs);
|
|
|
|
space(s.s);
|
2011-05-31 16:16:36 -07:00
|
|
|
word_space(s, "<-");
|
2011-05-27 17:38:52 -07:00
|
|
|
print_expr(s, rhs);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_assign(?lhs,?rhs,_)) {
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, lhs);
|
|
|
|
space(s.s);
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, "=");
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, rhs);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_assign_op(?op,?lhs,?rhs,_)) {
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, lhs);
|
|
|
|
space(s.s);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, ast::binop_to_str(op));
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, "=");
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, rhs);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_send(?lhs, ?rhs, _)) {
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, lhs);
|
|
|
|
space(s.s);
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, "<|");
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, rhs);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_recv(?lhs, ?rhs, _)) {
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, rhs);
|
2011-05-27 11:59:19 -07:00
|
|
|
space(s.s);
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, "|>");
|
2011-05-27 11:59:19 -07:00
|
|
|
print_expr(s, lhs);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_field(?expr,?id,_)) {
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, expr);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, ".");
|
|
|
|
word(s.s, id);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_index(?expr,?index,_)) {
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, expr);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, ".");
|
2011-05-28 19:16:18 -07:00
|
|
|
popen(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, index);
|
|
|
|
pclose(s);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_path(?path,_)) {
|
2011-03-24 16:33:20 +01:00
|
|
|
print_path(s, path);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_fail(_)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "fail");
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_break(_)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "break");
|
2011-03-29 11:35:12 +02:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_cont(_)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "cont");
|
2011-03-29 11:35:12 +02:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_ret(?result,_)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "ret");
|
2011-03-24 16:33:20 +01:00
|
|
|
alt (result) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (option::some[@ast::expr](?expr)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, " ");
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, expr);
|
|
|
|
}
|
|
|
|
case (_) {}
|
|
|
|
}
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_put(?result,_)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "put");
|
2011-03-24 16:33:20 +01:00
|
|
|
alt (result) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (option::some[@ast::expr](?expr)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, " ");
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, expr);
|
|
|
|
}
|
|
|
|
case (_) {}
|
|
|
|
}
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_be(?result,_)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
word_nbsp(s, "be");
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, result);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_log(?lvl,?expr,_)) {
|
2011-04-19 11:21:23 +02:00
|
|
|
alt (lvl) {
|
2011-05-28 19:16:18 -07:00
|
|
|
case (1) {word_nbsp(s, "log");}
|
|
|
|
case (0) {word_nbsp(s, "log_err");}
|
2011-04-19 11:21:23 +02:00
|
|
|
}
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, expr);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_check(?expr,_)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
word_nbsp(s, "check");
|
|
|
|
popen(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, expr);
|
|
|
|
pclose(s);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_assert(?expr,_)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
word_nbsp(s, "assert");
|
|
|
|
popen(s);
|
2011-05-02 17:47:24 -07:00
|
|
|
print_expr(s, expr);
|
|
|
|
pclose(s);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_ext(?path, ?args, ?body, _, _)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "#");
|
2011-03-24 16:33:20 +01:00
|
|
|
print_path(s, path);
|
2011-05-17 20:41:41 +02:00
|
|
|
if (vec::len[@ast::expr](args) > 0u) {
|
2011-03-24 16:33:20 +01:00
|
|
|
popen(s);
|
2011-05-29 07:43:33 +00:00
|
|
|
commasep_exprs(s, inconsistent, args);
|
2011-03-24 16:33:20 +01:00
|
|
|
pclose(s);
|
|
|
|
}
|
|
|
|
// FIXME: extension 'body'
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_port(_)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "port");
|
2011-05-28 19:16:18 -07:00
|
|
|
popen(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
pclose(s);
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_chan(?expr, _)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "chan");
|
2011-05-28 19:16:18 -07:00
|
|
|
popen(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
print_expr(s, expr);
|
|
|
|
pclose(s);
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
2011-05-11 16:41:25 -07:00
|
|
|
|
|
|
|
case (ast::expr_anon_obj(_,_,_,_)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "anon obj");
|
2011-05-20 17:41:36 -07:00
|
|
|
// TODO: nicer pretty-printing of anon objs
|
2011-05-11 16:41:25 -07:00
|
|
|
}
|
2011-03-24 23:03:12 -04:00
|
|
|
}
|
2011-05-17 17:42:23 -07:00
|
|
|
|
2011-06-01 18:53:52 -07:00
|
|
|
// Print the type or node ID if necessary.
|
2011-05-17 17:42:23 -07:00
|
|
|
alt (s.mode) {
|
|
|
|
case (mo_untyped) { /* no-op */ }
|
2011-05-19 15:47:15 -07:00
|
|
|
case (mo_typed(?tcx)) {
|
2011-05-17 17:42:23 -07:00
|
|
|
space(s.s);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "as");
|
2011-05-28 19:16:18 -07:00
|
|
|
space(s.s);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, ty::ty_to_str(tcx, ty::expr_ty(tcx, expr)));
|
2011-05-17 17:42:23 -07:00
|
|
|
pclose(s);
|
|
|
|
}
|
2011-06-01 18:53:52 -07:00
|
|
|
case (mo_identified) {
|
|
|
|
space(s.s);
|
|
|
|
synth_comment(s, uint::to_str(ty::expr_ann(expr).id, 10u));
|
|
|
|
pclose(s);
|
|
|
|
}
|
2011-05-17 17:42:23 -07:00
|
|
|
}
|
|
|
|
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_decl(&ps s, &@ast::decl decl) {
|
2011-03-24 16:33:20 +01:00
|
|
|
maybe_print_comment(s, decl.span.lo);
|
|
|
|
alt (decl.node) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::decl_local(?loc)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
space(s.s);
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, indent_unit);
|
2011-03-24 16:33:20 +01:00
|
|
|
alt (loc.ty) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (option::some[@ast::ty](?ty)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
word_nbsp(s, "let");
|
2011-05-31 10:58:30 -07:00
|
|
|
print_type(s, *ty);
|
2011-03-24 16:33:20 +01:00
|
|
|
space(s.s);
|
|
|
|
}
|
|
|
|
case (_) {
|
2011-05-28 19:16:18 -07:00
|
|
|
word_nbsp(s, "auto");
|
2011-05-17 19:00:16 -07:00
|
|
|
|
2011-06-01 18:53:52 -07:00
|
|
|
// Print the type or node ID if necessary.
|
2011-05-17 19:00:16 -07:00
|
|
|
alt (s.mode) {
|
|
|
|
case (mo_untyped) { /* no-op */ }
|
2011-05-19 15:47:15 -07:00
|
|
|
case (mo_typed(?tcx)) {
|
|
|
|
auto lty =
|
|
|
|
ty::ann_to_type(tcx.node_types, loc.ann);
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, ty::ty_to_str(tcx, lty));
|
2011-05-17 19:00:16 -07:00
|
|
|
}
|
2011-06-01 18:53:52 -07:00
|
|
|
case (mo_identified) { /* no-op */ }
|
2011-05-17 19:00:16 -07:00
|
|
|
}
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-03-24 23:03:12 -04:00
|
|
|
}
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, loc.ident);
|
2011-03-24 16:33:20 +01:00
|
|
|
alt (loc.init) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (option::some[ast::initializer](?init)) {
|
2011-03-24 16:33:20 +01:00
|
|
|
space(s.s);
|
|
|
|
alt (init.op) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::init_assign) {
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, "=");
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-31 15:41:08 -07:00
|
|
|
case (ast::init_move) {
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, "<-");
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-31 15:41:08 -07:00
|
|
|
case (ast::init_recv) {
|
|
|
|
word_space(s, "|>");
|
|
|
|
}
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
|
|
|
print_expr(s, init.expr);
|
|
|
|
}
|
|
|
|
case (_) {}
|
2011-03-24 23:03:12 -04:00
|
|
|
}
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::decl_item(?item)) {
|
2011-03-24 16:33:20 +01:00
|
|
|
print_item(s, item);
|
|
|
|
}
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_ident(&ps s, &ast::ident ident) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, ident);
|
2011-04-05 14:18:44 -07:00
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_for_decl(&ps s, @ast::decl decl) {
|
2011-03-24 16:33:20 +01:00
|
|
|
alt (decl.node) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::decl_local(?loc)) {
|
2011-05-31 10:58:30 -07:00
|
|
|
print_type(s, *option::get[@ast::ty](loc.ty));
|
2011-03-24 16:33:20 +01:00
|
|
|
space(s.s);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, loc.ident);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_path(&ps s, &ast::path path) {
|
2011-03-24 16:33:20 +01:00
|
|
|
maybe_print_comment(s, path.span.lo);
|
|
|
|
auto first = true;
|
|
|
|
for (str id in path.node.idents) {
|
|
|
|
if (first) {first = false;}
|
2011-05-30 14:10:54 -07:00
|
|
|
else {word(s.s, "::");}
|
|
|
|
word(s.s, id);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-17 20:41:41 +02:00
|
|
|
if (vec::len[@ast::ty](path.node.types) > 0u) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "[");
|
2011-05-31 10:58:30 -07:00
|
|
|
auto f = print_boxed_type;
|
2011-05-29 07:43:33 +00:00
|
|
|
commasep[@ast::ty](s, inconsistent, path.node.types, f);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "]");
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_pat(&ps s, &@ast::pat pat) {
|
2011-03-24 16:33:20 +01:00
|
|
|
maybe_print_comment(s, pat.span.lo);
|
|
|
|
alt (pat.node) {
|
2011-05-30 14:10:54 -07:00
|
|
|
case (ast::pat_wild(_)) {word(s.s, "_");}
|
|
|
|
case (ast::pat_bind(?id,_,_)) {word(s.s, "?" + id);}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::pat_lit(?lit,_)) {print_literal(s, lit);}
|
|
|
|
case (ast::pat_tag(?path,?args,_)) {
|
2011-03-24 16:33:20 +01:00
|
|
|
print_path(s, path);
|
2011-05-17 20:41:41 +02:00
|
|
|
if (vec::len[@ast::pat](args) > 0u) {
|
2011-05-28 19:16:18 -07:00
|
|
|
popen(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
auto f = print_pat;
|
2011-05-29 07:43:33 +00:00
|
|
|
commasep[@ast::pat](s, inconsistent, args, f);
|
2011-03-24 16:33:20 +01:00
|
|
|
pclose(s);
|
|
|
|
}
|
|
|
|
}
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-06-01 13:18:16 -07:00
|
|
|
fn print_fn(&ps s, ast::fn_decl decl, ast::proto proto, str name,
|
2011-05-31 10:58:30 -07:00
|
|
|
vec[ast::ty_param] typarams) {
|
2011-05-04 11:28:13 -07:00
|
|
|
alt (decl.purity) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::impure_fn) {
|
2011-06-01 13:18:16 -07:00
|
|
|
if (proto == ast::proto_iter) {
|
|
|
|
head(s, "iter");
|
|
|
|
} else {
|
|
|
|
head(s, "fn");
|
|
|
|
}
|
2011-05-04 11:28:13 -07:00
|
|
|
}
|
|
|
|
case (_) {
|
2011-05-28 19:16:18 -07:00
|
|
|
head(s, "pred");
|
2011-05-04 11:28:13 -07:00
|
|
|
}
|
|
|
|
}
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, name);
|
2011-03-24 16:33:20 +01:00
|
|
|
print_type_params(s, typarams);
|
|
|
|
popen(s);
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_arg(&ps s, &ast::arg x) {
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, indent_unit);
|
2011-05-30 14:10:54 -07:00
|
|
|
if (x.mode == ast::alias) {word(s.s, "&");}
|
2011-05-31 10:58:30 -07:00
|
|
|
print_type(s, *x.ty);
|
2011-03-24 16:33:20 +01:00
|
|
|
space(s.s);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, x.ident);
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
|
|
|
auto f = print_arg;
|
2011-05-29 07:43:33 +00:00
|
|
|
commasep[ast::arg](s, inconsistent, decl.inputs, f);
|
2011-03-24 16:33:20 +01:00
|
|
|
pclose(s);
|
|
|
|
maybe_print_comment(s, decl.output.span.lo);
|
2011-05-12 17:24:54 +02:00
|
|
|
if (decl.output.node != ast::ty_nil) {
|
2011-03-24 16:33:20 +01:00
|
|
|
space(s.s);
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, "->");
|
2011-05-31 10:58:30 -07:00
|
|
|
print_type(s, *decl.output);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_type_params(&ps s, &vec[ast::ty_param] params) {
|
2011-05-17 20:41:41 +02:00
|
|
|
if (vec::len[ast::ty_param](params) > 0u) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "[");
|
2011-05-31 10:58:30 -07:00
|
|
|
fn printParam(&ps s, &ast::ty_param param) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, param);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
|
|
|
auto f = printParam;
|
2011-05-29 07:43:33 +00:00
|
|
|
commasep[ast::ty_param](s, inconsistent, params, f);
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "]");
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_view_item(&ps s, &@ast::view_item item) {
|
2011-05-28 19:16:18 -07:00
|
|
|
hardbreak(s.s);
|
2011-03-24 16:33:20 +01:00
|
|
|
maybe_print_comment(s, item.span.lo);
|
|
|
|
alt (item.node) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::view_item_use(?id,?mta,_,_)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
head(s, "use");
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, id);
|
2011-05-17 20:41:41 +02:00
|
|
|
if (vec::len[@ast::meta_item](mta) > 0u) {
|
2011-03-24 16:33:20 +01:00
|
|
|
popen(s);
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_meta(&ps s, &@ast::meta_item item) {
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, indent_unit);
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, item.node.name);
|
|
|
|
word_space(s, "=");
|
2011-03-24 16:33:20 +01:00
|
|
|
print_string(s, item.node.value);
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
|
|
|
auto f = print_meta;
|
2011-05-29 07:43:33 +00:00
|
|
|
commasep[@ast::meta_item](s, consistent, mta, f);
|
2011-03-24 16:33:20 +01:00
|
|
|
pclose(s);
|
|
|
|
}
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::view_item_import(?id,?ids,_)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
head(s, "import");
|
2011-05-17 20:41:41 +02:00
|
|
|
if (!str::eq(id, ids.(vec::len[str](ids)-1u))) {
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, id);
|
|
|
|
word_space(s, "=");
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
|
|
|
auto first = true;
|
|
|
|
for (str elt in ids) {
|
|
|
|
if (first) {first = false;}
|
2011-05-30 14:10:54 -07:00
|
|
|
else {word(s.s, "::");}
|
|
|
|
word(s.s, elt);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
|
|
|
}
|
2011-06-01 11:08:44 -07:00
|
|
|
case (ast::view_item_import_glob(?ids,_)) {
|
|
|
|
head(s, "import");
|
|
|
|
auto first = true;
|
|
|
|
for (str elt in ids) {
|
|
|
|
if (first) {first = false;}
|
|
|
|
else {word(s.s, "::");}
|
|
|
|
word(s.s, elt);
|
|
|
|
}
|
|
|
|
word(s.s, "::*");
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::view_item_export(?id)) {
|
2011-05-28 19:16:18 -07:00
|
|
|
head(s, "export");
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, id);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, ";");
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s); // end inner head-block
|
|
|
|
end(s); // end outer head-block
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// FIXME: The fact that this builds up the table anew for every call is
|
|
|
|
// not good. Eventually, table should be a const.
|
2011-05-12 17:24:54 +02:00
|
|
|
fn operator_prec(ast::binop op) -> int {
|
|
|
|
for (front::parser::op_spec spec in front::parser::prec_table()) {
|
2011-03-24 16:33:20 +01:00
|
|
|
if (spec.op == op) {ret spec.prec;}
|
|
|
|
}
|
|
|
|
fail;
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_maybe_parens(&ps s, &@ast::expr expr, int outer_prec) {
|
2011-03-24 16:33:20 +01:00
|
|
|
auto add_them;
|
|
|
|
alt (expr.node) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_binary(?op,_,_,_)) {
|
2011-03-24 16:33:20 +01:00
|
|
|
add_them = operator_prec(op) < outer_prec;
|
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::expr_cast(_,_,_)) {
|
2011-05-13 21:30:08 +02:00
|
|
|
add_them = front::parser::as_prec < outer_prec;
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
|
|
|
case (_) {
|
|
|
|
add_them = false;
|
|
|
|
}
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
2011-03-24 16:33:20 +01:00
|
|
|
if (add_them) {popen(s);}
|
|
|
|
print_expr(s, expr);
|
|
|
|
if (add_them) {pclose(s);}
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
fn escape_str(str st, char to_escape) -> str {
|
2011-03-24 16:33:20 +01:00
|
|
|
let str out = "";
|
2011-05-17 20:41:41 +02:00
|
|
|
auto len = str::byte_len(st);
|
2011-03-24 16:33:20 +01:00
|
|
|
auto i = 0u;
|
|
|
|
while (i < len) {
|
|
|
|
alt (st.(i) as char) {
|
|
|
|
case ('\n') {out += "\\n";}
|
|
|
|
case ('\t') {out += "\\t";}
|
|
|
|
case ('\r') {out += "\\r";}
|
|
|
|
case ('\\') {out += "\\\\";}
|
|
|
|
case (?cur) {
|
|
|
|
if (cur == to_escape) {out += "\\";}
|
2011-05-23 22:46:39 +02:00
|
|
|
// FIXME some (or all?) non-ascii things should be escaped
|
|
|
|
str::push_char(out, cur);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
i += 1u;
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
2011-03-24 16:33:20 +01:00
|
|
|
ret out;
|
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_mt(&ps s, &ast::mt mt) {
|
2011-03-24 16:33:20 +01:00
|
|
|
alt (mt.mut) {
|
2011-05-28 19:16:18 -07:00
|
|
|
case (ast::mut) { word_nbsp(s, "mutable"); }
|
|
|
|
case (ast::maybe_mut) { word_nbsp(s, "mutable?"); }
|
2011-05-12 17:24:54 +02:00
|
|
|
case (ast::imm) { /* nothing */ }
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-31 10:58:30 -07:00
|
|
|
print_type(s, *mt.ty);
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_string(&ps s, &str st) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, "\""); word(s.s, escape_str(st, '"')); word(s.s, "\"");
|
2011-03-04 07:22:43 +01:00
|
|
|
}
|
2011-03-09 12:28:18 +01:00
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_ty_fn(&ps s, &ast::proto proto, &option::t[str] id,
|
|
|
|
&vec[ast::ty_arg] inputs, &@ast::ty output,
|
|
|
|
&ast::controlflow cf) {
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, indent_unit);
|
2011-05-30 14:10:54 -07:00
|
|
|
if (proto == ast::proto_fn) {word(s.s, "fn");}
|
|
|
|
else {word(s.s, "iter");}
|
2011-03-24 16:33:20 +01:00
|
|
|
alt (id) {
|
2011-05-30 14:10:54 -07:00
|
|
|
case (option::some[str](?id)) {space(s.s); word(s.s, id);}
|
2011-03-24 16:33:20 +01:00
|
|
|
case (_) {}
|
|
|
|
}
|
2011-05-28 19:16:18 -07:00
|
|
|
popen(s);
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_arg(&ps s, &ast::ty_arg input) {
|
2011-05-30 14:10:54 -07:00
|
|
|
if (input.mode == ast::alias) {word(s.s, "&");}
|
2011-05-31 10:58:30 -07:00
|
|
|
print_type(s, *input.ty);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
|
|
|
auto f = print_arg;
|
2011-05-29 07:43:33 +00:00
|
|
|
commasep[ast::ty_arg](s, inconsistent, inputs, f);
|
2011-03-24 16:33:20 +01:00
|
|
|
pclose(s);
|
|
|
|
maybe_print_comment(s, output.span.lo);
|
2011-05-12 17:24:54 +02:00
|
|
|
if (output.node != ast::ty_nil) {
|
2011-03-24 16:33:20 +01:00
|
|
|
space(s.s);
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, indent_unit);
|
2011-05-28 19:16:18 -07:00
|
|
|
word_space(s, "->");
|
2011-05-20 14:15:39 -07:00
|
|
|
alt (cf) {
|
|
|
|
case (ast::return) {
|
2011-05-31 10:58:30 -07:00
|
|
|
print_type(s, *output);
|
2011-05-20 14:15:39 -07:00
|
|
|
}
|
|
|
|
case (ast::noreturn) {
|
2011-05-28 19:16:18 -07:00
|
|
|
word_nbsp(s, "!");
|
2011-05-20 14:15:39 -07:00
|
|
|
}
|
|
|
|
}
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn next_comment(&ps s) -> option::t[lexer::cmnt] {
|
2011-03-24 16:33:20 +01:00
|
|
|
alt (s.comments) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (option::some[vec[lexer::cmnt]](?cmnts)) {
|
2011-05-17 20:41:41 +02:00
|
|
|
if (s.cur_cmnt < vec::len[lexer::cmnt](cmnts)) {
|
2011-05-12 17:24:54 +02:00
|
|
|
ret option::some[lexer::cmnt](cmnts.(s.cur_cmnt));
|
|
|
|
} else {ret option::none[lexer::cmnt];}
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-05-12 17:24:54 +02:00
|
|
|
case (_) {ret option::none[lexer::cmnt];}
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn maybe_print_comment(&ps s, uint pos) {
|
2011-03-24 16:33:20 +01:00
|
|
|
while (true) {
|
|
|
|
alt (next_comment(s)) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (option::some[lexer::cmnt](?cmnt)) {
|
2011-04-08 18:44:20 +02:00
|
|
|
if (cmnt.pos < pos) {
|
2011-05-30 14:10:54 -07:00
|
|
|
print_comment(s, cmnt);
|
2011-03-24 16:33:20 +01:00
|
|
|
s.cur_cmnt += 1u;
|
|
|
|
} else { break; }
|
|
|
|
}
|
|
|
|
case (_) {break;}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn maybe_print_trailing_comment(&ps s, common::span span) {
|
2011-05-30 16:22:58 -07:00
|
|
|
auto cm;
|
|
|
|
alt (s.cm) {
|
|
|
|
case (option::some[codemap](?ccm)) {
|
|
|
|
cm = ccm;
|
|
|
|
}
|
2011-05-30 17:34:59 -07:00
|
|
|
case (_) { ret; }
|
2011-05-30 16:22:58 -07:00
|
|
|
}
|
2011-03-24 16:33:20 +01:00
|
|
|
alt (next_comment(s)) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (option::some[lexer::cmnt](?cmnt)) {
|
2011-05-30 17:34:59 -07:00
|
|
|
if (cmnt.style != lexer::trailing) { ret; }
|
2011-05-30 16:22:58 -07:00
|
|
|
|
|
|
|
auto span_line = codemap::lookup_pos(cm, span.hi);
|
|
|
|
auto comment_line = codemap::lookup_pos(cm, cmnt.pos);
|
2011-06-01 15:29:38 -07:00
|
|
|
if (span.hi < cmnt.pos &&
|
|
|
|
span_line.line == comment_line.line) {
|
2011-05-30 14:10:54 -07:00
|
|
|
word(s.s, " ");
|
|
|
|
print_comment(s, cmnt);
|
2011-03-24 16:33:20 +01:00
|
|
|
s.cur_cmnt += 1u;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case (_) {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_remaining_comments(&ps s) {
|
2011-03-24 16:33:20 +01:00
|
|
|
while (true) {
|
|
|
|
alt (next_comment(s)) {
|
2011-05-12 17:24:54 +02:00
|
|
|
case (option::some[lexer::cmnt](?cmnt)) {
|
2011-05-30 14:10:54 -07:00
|
|
|
print_comment(s, cmnt);
|
2011-03-24 16:33:20 +01:00
|
|
|
s.cur_cmnt += 1u;
|
|
|
|
}
|
|
|
|
case (_) {break;}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-06-01 15:29:38 -07:00
|
|
|
fn in_cbox(&ps s) -> bool {
|
|
|
|
auto len = vec::len(s.boxes);
|
|
|
|
if (len == 0u) { ret false; }
|
|
|
|
ret s.boxes.(len-1u) == pp::consistent;
|
|
|
|
}
|
|
|
|
|
2011-05-31 10:58:30 -07:00
|
|
|
fn print_comment(&ps s, lexer::cmnt cmnt) {
|
2011-05-30 14:10:54 -07:00
|
|
|
alt (cmnt.style) {
|
2011-05-31 17:35:47 -07:00
|
|
|
case (lexer::mixed) {
|
|
|
|
assert vec::len(cmnt.lines) == 1u;
|
|
|
|
zerobreak(s.s);
|
|
|
|
word(s.s, cmnt.lines.(0));
|
|
|
|
zerobreak(s.s);
|
2011-05-30 14:10:54 -07:00
|
|
|
}
|
2011-06-01 15:29:38 -07:00
|
|
|
|
2011-06-01 10:54:11 -07:00
|
|
|
case (lexer::isolated) {
|
|
|
|
hardbreak(s.s);
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, 0u);
|
2011-06-01 10:54:11 -07:00
|
|
|
for (str line in cmnt.lines) {
|
2011-06-01 15:29:38 -07:00
|
|
|
word(s.s, line);
|
2011-06-01 10:54:11 -07:00
|
|
|
hardbreak(s.s);
|
|
|
|
}
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-06-01 10:54:11 -07:00
|
|
|
}
|
2011-06-01 15:29:38 -07:00
|
|
|
|
2011-06-01 10:54:11 -07:00
|
|
|
case (lexer::trailing) {
|
2011-05-30 17:34:59 -07:00
|
|
|
if (vec::len(cmnt.lines) == 1u) {
|
2011-06-01 15:29:38 -07:00
|
|
|
word(s.s, cmnt.lines.(0));
|
2011-05-30 17:34:59 -07:00
|
|
|
hardbreak(s.s);
|
|
|
|
} else {
|
2011-06-01 15:29:38 -07:00
|
|
|
ibox(s, 0u);
|
2011-05-30 17:34:59 -07:00
|
|
|
for (str line in cmnt.lines) {
|
2011-06-01 15:29:38 -07:00
|
|
|
word(s.s, line);
|
2011-05-31 17:35:47 -07:00
|
|
|
hardbreak(s.s);
|
2011-05-30 17:34:59 -07:00
|
|
|
}
|
2011-06-01 15:29:38 -07:00
|
|
|
end(s);
|
2011-05-30 14:10:54 -07:00
|
|
|
}
|
|
|
|
}
|
2011-03-24 16:33:20 +01:00
|
|
|
}
|
2011-03-09 12:28:18 +01:00
|
|
|
}
|
Handle nested items correctly in typestate_check
Summary says it all. Actually, only nested objects and functions
are handled, but that's better than before. The fold that I was using
before to traverse a crate wasn't working correctly, because annotations
have to reflect the number of local variables of the nearest enclosing
function (in turn, because annotations are represented as bit vectors).
The fold was traversing the AST in the wrong order, first filling in
the annotations correctly, but then re-traversing them with the bit
vector length for any outer nested functions, and so on.
Remedying this required writing a lot of tedious boilerplate code
because I scrapped the idea of using a fold altogether.
I also made typestate_check handle unary, field, alt, and fail.
Also, some miscellaneous changes:
* added annotations to blocks in typeck
* fix pprust so it can handle spawn
* added more logging functions in util.common
* fixed _vec.or
* added maybe and from_maybe in option
* removed fold_block field from ast_fold, since it was never used
2011-04-18 15:33:10 -07:00
|
|
|
//
|
|
|
|
// Local Variables:
|
|
|
|
// mode: rust
|
|
|
|
// fill-column: 78;
|
|
|
|
// indent-tabs-mode: nil
|
|
|
|
// c-basic-offset: 4
|
|
|
|
// buffer-file-coding-system: utf-8-unix
|
|
|
|
// compile-command: "make -k -C $RBUILD 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
|
|
|
|
// End:
|
|
|
|
//
|