2011-08-15 18:38:23 -05:00
|
|
|
import std::vec;
|
2011-07-05 04:48:19 -05:00
|
|
|
import std::str;
|
2011-08-23 23:17:20 -05:00
|
|
|
import std::istr;
|
2011-07-06 09:46:17 -05:00
|
|
|
import std::int;
|
2011-07-05 04:48:19 -05:00
|
|
|
import std::option;
|
|
|
|
import std::option::none;
|
|
|
|
import std::option::some;
|
|
|
|
import middle::ty;
|
|
|
|
import middle::ty::*;
|
2011-07-07 14:47:39 -05:00
|
|
|
import metadata::encoder;
|
2011-07-05 04:48:19 -05:00
|
|
|
import syntax::print::pp;
|
|
|
|
import syntax::print::pprust;
|
2011-07-19 19:52:34 -05:00
|
|
|
import syntax::print::pprust::path_to_str;
|
|
|
|
import syntax::print::pprust::constr_args_to_str;
|
2011-07-19 22:11:48 -05:00
|
|
|
import syntax::print::pprust::proto_to_str;
|
2011-07-05 04:48:19 -05:00
|
|
|
import pp::word;
|
|
|
|
import pp::eof;
|
|
|
|
import pp::zerobreak;
|
|
|
|
import pp::hardbreak;
|
2011-08-21 23:44:41 -05:00
|
|
|
import syntax::ast_util::ty_mach_to_str;
|
2011-07-05 04:48:19 -05:00
|
|
|
import syntax::ast;
|
2011-08-18 19:59:17 -05:00
|
|
|
import middle::ast_map;
|
|
|
|
import metadata::csearch;
|
2011-07-05 04:48:19 -05:00
|
|
|
|
2011-08-27 01:39:08 -05:00
|
|
|
fn mode_str(m: &ty::mode) -> istr {
|
2011-07-27 07:19:39 -05:00
|
|
|
alt m {
|
2011-08-27 01:39:08 -05:00
|
|
|
mo_val. { ~"" }
|
|
|
|
mo_alias(false) { ~"&" }
|
|
|
|
mo_alias(true) { ~"&mutable " }
|
|
|
|
mo_move. { ~"-" }
|
2011-07-05 04:48:19 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-08-27 01:39:08 -05:00
|
|
|
fn mode_str_1(m: &ty::mode) -> istr {
|
|
|
|
alt m { mo_val. { ~"val" } _ { mode_str(m) } }
|
2011-07-05 04:48:19 -05:00
|
|
|
}
|
|
|
|
|
2011-08-27 01:39:08 -05:00
|
|
|
fn fn_ident_to_string(id: ast::node_id, i: &ast::fn_ident) -> istr {
|
2011-08-23 23:17:20 -05:00
|
|
|
ret alt i {
|
2011-08-27 01:39:08 -05:00
|
|
|
none. { ~"anon" + int::str(id) }
|
|
|
|
some(s) { s }
|
2011-08-23 23:17:20 -05:00
|
|
|
};
|
2011-07-05 04:48:19 -05:00
|
|
|
}
|
|
|
|
|
2011-08-27 01:39:08 -05:00
|
|
|
fn get_id_ident(cx: &ctxt, id: ast::def_id) -> istr {
|
2011-08-19 17:16:48 -05:00
|
|
|
if id.crate != ast::local_crate {
|
2011-08-27 01:39:08 -05:00
|
|
|
istr::connect(cx.ext_map.get(id), ~"::")
|
2011-08-18 19:59:17 -05:00
|
|
|
} else {
|
|
|
|
alt cx.items.find(id.node) {
|
2011-08-27 01:39:08 -05:00
|
|
|
some(ast_map::node_item(it)) { it.ident }
|
2011-08-18 19:59:17 -05:00
|
|
|
_ { fail "get_id_ident: can't find item in ast_map" }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-08-27 01:39:08 -05:00
|
|
|
fn ty_to_str(cx: &ctxt, typ: &t) -> istr {
|
2011-07-27 07:19:39 -05:00
|
|
|
fn fn_input_to_str(cx: &ctxt, input: &{mode: middle::ty::mode, ty: t}) ->
|
2011-08-27 01:39:08 -05:00
|
|
|
istr {
|
2011-07-27 07:19:39 -05:00
|
|
|
let s = mode_str(input.mode);
|
2011-07-05 04:48:19 -05:00
|
|
|
ret s + ty_to_str(cx, input.ty);
|
|
|
|
}
|
2011-08-12 09:15:18 -05:00
|
|
|
fn fn_to_str(cx: &ctxt, proto: ast::proto, ident: option::t<ast::ident>,
|
2011-08-04 18:20:09 -05:00
|
|
|
inputs: &[arg], output: t, cf: ast::controlflow,
|
2011-08-27 01:39:08 -05:00
|
|
|
constrs: &[@constr]) -> istr {
|
|
|
|
let s = istr::from_estr(proto_to_str(proto));
|
2011-08-25 19:00:12 -05:00
|
|
|
alt ident {
|
|
|
|
some(i) {
|
2011-08-27 01:39:08 -05:00
|
|
|
s += ~" ";
|
|
|
|
s += i;
|
2011-08-25 19:00:12 -05:00
|
|
|
}
|
|
|
|
_ { }
|
|
|
|
}
|
2011-08-27 01:39:08 -05:00
|
|
|
s += ~"(";
|
2011-08-19 17:16:48 -05:00
|
|
|
let strs = [];
|
|
|
|
for a: arg in inputs { strs += [fn_input_to_str(cx, a)]; }
|
2011-08-27 01:39:08 -05:00
|
|
|
s += istr::connect(strs, ~", ");
|
|
|
|
s += ~")";
|
2011-07-27 07:19:39 -05:00
|
|
|
if struct(cx, output) != ty_nil {
|
|
|
|
alt cf {
|
2011-08-27 01:39:08 -05:00
|
|
|
ast::noreturn. { s += ~" -> !"; }
|
|
|
|
ast::return. { s += ~" -> " + ty_to_str(cx, output); }
|
2011-07-05 04:48:19 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
s += constrs_str(constrs);
|
|
|
|
ret s;
|
|
|
|
}
|
2011-08-27 01:39:08 -05:00
|
|
|
fn method_to_str(cx: &ctxt, m: &method) -> istr {
|
2011-08-13 02:09:25 -05:00
|
|
|
ret fn_to_str(cx, m.proto, some::<ast::ident>(m.ident), m.inputs,
|
2011-08-27 01:39:08 -05:00
|
|
|
m.output, m.cf, m.constrs) + ~";";
|
2011-07-05 04:48:19 -05:00
|
|
|
}
|
2011-08-27 01:39:08 -05:00
|
|
|
fn field_to_str(cx: &ctxt, f: &field) -> istr {
|
|
|
|
ret f.ident + ~": " + mt_to_str(cx, f.mt);
|
2011-07-05 04:48:19 -05:00
|
|
|
}
|
2011-08-27 01:39:08 -05:00
|
|
|
fn mt_to_str(cx: &ctxt, m: &mt) -> istr {
|
2011-07-27 07:19:39 -05:00
|
|
|
let mstr;
|
|
|
|
alt m.mut {
|
2011-08-27 01:39:08 -05:00
|
|
|
ast::mut. { mstr = ~"mutable "; }
|
|
|
|
ast::imm. { mstr = ~""; }
|
|
|
|
ast::maybe_mut. { mstr = ~"mutable? "; }
|
2011-07-05 04:48:19 -05:00
|
|
|
}
|
|
|
|
ret mstr + ty_to_str(cx, m.ty);
|
|
|
|
}
|
2011-08-27 01:39:08 -05:00
|
|
|
alt cname(cx, typ) {
|
|
|
|
some(cs) {
|
|
|
|
ret istr::from_estr(cs);
|
|
|
|
}
|
|
|
|
_ { }
|
|
|
|
}
|
2011-08-18 20:03:32 -05:00
|
|
|
ret alt struct(cx, typ) {
|
2011-08-27 01:39:08 -05:00
|
|
|
ty_native(_) { ~"native" }
|
|
|
|
ty_nil. { ~"()" }
|
|
|
|
ty_bot. { ~"_|_" }
|
|
|
|
ty_bool. { ~"bool" }
|
|
|
|
ty_int. { ~"int" }
|
|
|
|
ty_float. { ~"float" }
|
|
|
|
ty_uint. { ~"uint" }
|
|
|
|
ty_machine(tm) { istr::from_estr(ty_mach_to_str(tm)) }
|
|
|
|
ty_char. { ~"char" }
|
|
|
|
ty_str. { ~"str" }
|
|
|
|
ty_istr. { ~"istr" }
|
|
|
|
ty_box(tm) { ~"@" + mt_to_str(cx, tm) }
|
|
|
|
ty_uniq(t) { ~"~" + ty_to_str(cx, t) }
|
|
|
|
ty_vec(tm) { ~"[" + mt_to_str(cx, tm) + ~"]" }
|
|
|
|
ty_type. { ~"type" }
|
2011-08-19 17:16:48 -05:00
|
|
|
ty_rec(elems) {
|
2011-08-27 01:39:08 -05:00
|
|
|
let strs: [istr] = [];
|
2011-08-19 17:16:48 -05:00
|
|
|
for fld: field in elems { strs += [field_to_str(cx, fld)]; }
|
2011-08-27 01:39:08 -05:00
|
|
|
~"{" + istr::connect(strs, ~",") + ~"}"
|
2011-08-19 17:16:48 -05:00
|
|
|
}
|
|
|
|
ty_tup(elems) {
|
|
|
|
let strs = [];
|
|
|
|
for elem in elems { strs += [ty_to_str(cx, elem)]; }
|
2011-08-27 01:39:08 -05:00
|
|
|
~"(" + istr::connect(strs, ~",") + ~")"
|
2011-08-19 17:16:48 -05:00
|
|
|
}
|
|
|
|
ty_tag(id, tps) {
|
|
|
|
let s = get_id_ident(cx, id);
|
|
|
|
if vec::len::<t>(tps) > 0u {
|
2011-08-27 01:39:08 -05:00
|
|
|
let strs: [istr] = [];
|
2011-08-19 17:16:48 -05:00
|
|
|
for typ: t in tps { strs += [ty_to_str(cx, typ)]; }
|
2011-08-27 01:39:08 -05:00
|
|
|
s += ~"[" + istr::connect(strs, ~",") + ~"]";
|
2011-08-19 17:16:48 -05:00
|
|
|
}
|
|
|
|
s
|
|
|
|
}
|
|
|
|
ty_fn(proto, inputs, output, cf, constrs) {
|
|
|
|
fn_to_str(cx, proto, none, inputs, output, cf, constrs)
|
|
|
|
}
|
|
|
|
ty_native_fn(_, inputs, output) {
|
|
|
|
fn_to_str(cx, ast::proto_fn, none, inputs, output, ast::return,
|
|
|
|
[])
|
|
|
|
}
|
|
|
|
ty_obj(meths) {
|
|
|
|
let strs = [];
|
|
|
|
for m: method in meths { strs += [method_to_str(cx, m)]; }
|
2011-08-27 01:39:08 -05:00
|
|
|
~"obj {\n\t" + istr::connect(strs, ~"\n\t") + ~"\n}"
|
2011-08-19 17:16:48 -05:00
|
|
|
}
|
|
|
|
ty_res(id, _, _) { get_id_ident(cx, id) }
|
2011-08-27 01:39:08 -05:00
|
|
|
ty_var(v) { ~"<T" + int::str(v) + ~">" }
|
2011-08-19 17:16:48 -05:00
|
|
|
ty_param(id, _) {
|
2011-08-27 01:39:08 -05:00
|
|
|
~"'" + istr::unsafe_from_bytes([('a' as u8) + (id as u8)])
|
2011-08-19 17:16:48 -05:00
|
|
|
}
|
2011-08-27 01:39:08 -05:00
|
|
|
_ { ty_to_short_str(cx, typ) }
|
2011-07-05 04:48:19 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-08-25 00:13:16 -05:00
|
|
|
fn ty_to_short_str(cx: &ctxt, typ: t) -> istr {
|
2011-07-27 07:19:39 -05:00
|
|
|
let s = encoder::encoded_ty(cx, typ);
|
2011-08-25 00:13:16 -05:00
|
|
|
if istr::byte_len(s) >= 32u { s = istr::substr(s, 0u, 32u); }
|
2011-07-05 04:48:19 -05:00
|
|
|
ret s;
|
|
|
|
}
|
|
|
|
|
2011-08-27 01:39:08 -05:00
|
|
|
fn constr_to_str(c: &@constr) -> istr {
|
|
|
|
ret istr::from_estr(path_to_str(c.node.path)) +
|
|
|
|
istr::from_estr(
|
|
|
|
pprust::constr_args_to_str(pprust::uint_to_str, c.node.args));
|
2011-07-05 04:48:19 -05:00
|
|
|
}
|
|
|
|
|
2011-08-27 01:39:08 -05:00
|
|
|
fn constrs_str(constrs: &[@constr]) -> istr {
|
|
|
|
let s = ~"";
|
2011-07-27 07:19:39 -05:00
|
|
|
let colon = true;
|
2011-08-15 23:54:52 -05:00
|
|
|
for c: @constr in constrs {
|
2011-08-27 01:39:08 -05:00
|
|
|
if colon { s += ~" : "; colon = false; } else { s += ~", "; }
|
2011-07-05 04:48:19 -05:00
|
|
|
s += constr_to_str(c);
|
|
|
|
}
|
|
|
|
ret s;
|
|
|
|
}
|
|
|
|
|
2011-08-12 08:36:51 -05:00
|
|
|
fn ty_constr_to_str<Q>(c: &@ast::spanned<ast::constr_general_<ast::path, Q>>)
|
2011-08-27 01:39:08 -05:00
|
|
|
-> istr {
|
|
|
|
ret istr::from_estr(path_to_str(c.node.path)) +
|
|
|
|
istr::from_estr(
|
|
|
|
constr_args_to_str::<ast::path>(path_to_str, c.node.args));
|
2011-07-19 19:52:34 -05:00
|
|
|
}
|
|
|
|
|
2011-07-05 04:48:19 -05: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:
|