2012-03-15 21:05:38 -05:00
|
|
|
import std::map::hashmap;
|
2011-07-05 04:48:19 -05:00
|
|
|
import middle::ty;
|
2012-06-06 16:19:52 -05:00
|
|
|
import middle::ty::{arg, bound_region, br_anon, br_named, canon_mode};
|
2012-07-13 20:43:52 -05:00
|
|
|
import middle::ty::{ck_block, ck_box, ck_uniq, ctxt, field, method};
|
2012-06-06 16:19:52 -05:00
|
|
|
import middle::ty::{mt, re_bound, re_free, re_scope, re_var, region, t};
|
2012-07-13 20:43:52 -05:00
|
|
|
import middle::ty::{ty_bool, ty_bot, ty_box, ty_class, ty_enum};
|
2012-07-03 18:30:42 -05:00
|
|
|
import middle::ty::{ty_estr, ty_evec, ty_float, ty_fn, ty_trait, ty_int};
|
2012-06-06 16:19:52 -05:00
|
|
|
import middle::ty::{ty_nil, ty_opaque_box, ty_opaque_closure_ptr, ty_param};
|
2012-07-14 14:19:36 -05:00
|
|
|
import middle::ty::{ty_ptr, ty_rec, ty_rptr, ty_self, ty_tup};
|
2012-06-06 16:19:52 -05:00
|
|
|
import middle::ty::{ty_type, ty_uniq, ty_uint, ty_var, ty_var_integral};
|
2012-07-14 14:19:36 -05:00
|
|
|
import middle::ty::{ty_unboxed_vec, vid};
|
2011-07-07 14:47:39 -05:00
|
|
|
import metadata::encoder;
|
2012-03-15 21:05:38 -05:00
|
|
|
import syntax::codemap;
|
2011-11-10 10:41:42 -06:00
|
|
|
import syntax::print::pprust;
|
2012-07-13 20:43:52 -05:00
|
|
|
import syntax::print::pprust::{path_to_str, proto_to_str,
|
2012-05-25 01:44:58 -05:00
|
|
|
mode_to_str, purity_to_str};
|
2011-12-07 14:06:12 -06:00
|
|
|
import syntax::{ast, ast_util};
|
2012-05-22 01:34:34 -05:00
|
|
|
import syntax::ast_map;
|
2012-02-10 12:28:35 -06:00
|
|
|
import driver::session::session;
|
2011-07-05 04:48:19 -05:00
|
|
|
|
2012-07-14 00:57:48 -05:00
|
|
|
fn bound_region_to_str(cx: ctxt, br: bound_region) -> ~str {
|
2012-04-01 16:28:30 -05:00
|
|
|
alt br {
|
2012-07-14 00:57:48 -05:00
|
|
|
br_anon { ~"&" }
|
2012-06-10 02:49:59 -05:00
|
|
|
br_named(str) { #fmt["&%s", *str] }
|
2012-07-14 00:57:48 -05:00
|
|
|
br_self if cx.sess.ppregions() { ~"&<self>" }
|
|
|
|
br_self { ~"&self" }
|
2012-04-01 16:28:30 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-14 00:57:48 -05:00
|
|
|
fn re_scope_id_to_str(cx: ctxt, node_id: ast::node_id) -> ~str {
|
2012-06-18 15:33:07 -05:00
|
|
|
alt cx.items.find(node_id) {
|
|
|
|
some(ast_map::node_block(blk)) {
|
2012-04-12 23:59:33 -05:00
|
|
|
#fmt("<block at %s>",
|
|
|
|
codemap::span_to_str(blk.span, cx.sess.codemap))
|
|
|
|
}
|
2012-06-18 15:33:07 -05:00
|
|
|
some(ast_map::node_expr(expr)) {
|
2012-04-12 23:59:33 -05:00
|
|
|
alt expr.node {
|
2012-06-01 17:46:32 -05:00
|
|
|
ast::expr_call(*) {
|
2012-04-12 23:59:33 -05:00
|
|
|
#fmt("<call at %s>",
|
|
|
|
codemap::span_to_str(expr.span, cx.sess.codemap))
|
|
|
|
}
|
2012-06-01 17:46:32 -05:00
|
|
|
ast::expr_alt(*) {
|
2012-04-12 23:59:33 -05:00
|
|
|
#fmt("<alt at %s>",
|
|
|
|
codemap::span_to_str(expr.span, cx.sess.codemap))
|
|
|
|
}
|
2012-07-06 11:14:57 -05:00
|
|
|
ast::expr_assign_op(*) |
|
|
|
|
ast::expr_field(*) |
|
|
|
|
ast::expr_unary(*) |
|
|
|
|
ast::expr_binary(*) |
|
|
|
|
ast::expr_index(*) {
|
2012-06-01 17:46:32 -05:00
|
|
|
#fmt("<method at %s>",
|
|
|
|
codemap::span_to_str(expr.span, cx.sess.codemap))
|
|
|
|
}
|
2012-04-12 23:59:33 -05:00
|
|
|
_ { cx.sess.bug(
|
|
|
|
#fmt["re_scope refers to %s",
|
|
|
|
ast_map::node_id_to_str(cx.items, node_id)]) }
|
2012-03-15 21:05:38 -05:00
|
|
|
}
|
|
|
|
}
|
2012-07-06 15:59:17 -05:00
|
|
|
none {
|
|
|
|
#fmt["<unknown-%d>", node_id]
|
|
|
|
}
|
2012-04-12 23:59:33 -05:00
|
|
|
_ { cx.sess.bug(
|
|
|
|
#fmt["re_scope refers to %s",
|
|
|
|
ast_map::node_id_to_str(cx.items, node_id)]) }
|
|
|
|
}
|
|
|
|
}
|
2012-04-01 16:28:30 -05:00
|
|
|
|
2012-07-14 00:57:48 -05:00
|
|
|
fn region_to_str(cx: ctxt, region: region) -> ~str {
|
2012-04-12 23:59:33 -05:00
|
|
|
alt region {
|
2012-04-13 15:35:57 -05:00
|
|
|
re_scope(node_id) { #fmt["&%s", re_scope_id_to_str(cx, node_id)] }
|
2012-04-01 16:28:30 -05:00
|
|
|
re_bound(br) { bound_region_to_str(cx, br) }
|
2012-04-17 10:39:58 -05:00
|
|
|
re_free(id, br) {
|
2012-05-17 23:53:49 -05:00
|
|
|
if cx.sess.ppregions() {
|
2012-04-17 12:05:28 -05:00
|
|
|
// For debugging, this version is sometimes helpful:
|
|
|
|
#fmt["{%d} %s", id, bound_region_to_str(cx, br)]
|
|
|
|
} else {
|
|
|
|
// But this version is what the user expects to see:
|
|
|
|
bound_region_to_str(cx, br)
|
|
|
|
}
|
2012-04-17 10:39:58 -05:00
|
|
|
}
|
2012-04-01 16:28:30 -05:00
|
|
|
|
|
|
|
// These two should not be seen by end-users (very often, anyhow):
|
2012-04-13 15:35:57 -05:00
|
|
|
re_var(id) { #fmt("&%s", id.to_str()) }
|
2012-07-14 00:57:48 -05:00
|
|
|
re_static { ~"&static" }
|
2012-03-15 21:05:38 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-14 00:57:48 -05:00
|
|
|
fn mt_to_str(cx: ctxt, m: mt) -> ~str {
|
2012-03-22 22:06:01 -05:00
|
|
|
let mstr = alt m.mutbl {
|
2012-07-14 00:57:48 -05:00
|
|
|
ast::m_mutbl { ~"mut " }
|
|
|
|
ast::m_imm { ~"" }
|
|
|
|
ast::m_const { ~"const " }
|
2012-03-22 22:06:01 -05:00
|
|
|
};
|
|
|
|
ret mstr + ty_to_str(cx, m.ty);
|
|
|
|
}
|
|
|
|
|
2012-07-14 00:57:48 -05:00
|
|
|
fn vstore_to_str(cx: ctxt, vs: ty::vstore) -> ~str {
|
2012-04-13 15:35:57 -05:00
|
|
|
alt vs {
|
|
|
|
ty::vstore_fixed(n) { #fmt["%u", n] }
|
2012-07-14 00:57:48 -05:00
|
|
|
ty::vstore_uniq { ~"~" }
|
|
|
|
ty::vstore_box { ~"@" }
|
2012-04-13 15:35:57 -05:00
|
|
|
ty::vstore_slice(r) { region_to_str(cx, r) }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-14 00:57:48 -05:00
|
|
|
fn vstore_ty_to_str(cx: ctxt, ty: ~str, vs: ty::vstore) -> ~str {
|
2012-07-13 17:24:41 -05:00
|
|
|
alt vs {
|
|
|
|
ty::vstore_fixed(_) {
|
|
|
|
#fmt["%s/%s", ty, vstore_to_str(cx, vs)]
|
|
|
|
}
|
|
|
|
_ { #fmt["%s%s", vstore_to_str(cx, vs), ty] }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-14 00:57:48 -05:00
|
|
|
fn tys_to_str(cx: ctxt, ts: ~[t]) -> ~str {
|
|
|
|
let mut rs = ~"";
|
2012-06-30 18:19:07 -05:00
|
|
|
for ts.each |t| { rs += ty_to_str(cx, t); }
|
2012-05-03 11:17:58 -05:00
|
|
|
rs
|
|
|
|
}
|
|
|
|
|
2012-07-14 00:57:48 -05:00
|
|
|
fn ty_to_str(cx: ctxt, typ: t) -> ~str {
|
2012-01-30 23:00:57 -06:00
|
|
|
fn fn_input_to_str(cx: ctxt, input: {mode: ast::mode, ty: t}) ->
|
2012-07-14 00:57:48 -05:00
|
|
|
~str {
|
2012-02-03 19:10:29 -06:00
|
|
|
let {mode, ty} = input;
|
|
|
|
let modestr = alt canon_mode(cx, mode) {
|
2012-07-14 00:57:48 -05:00
|
|
|
ast::infer(_) { ~"" }
|
2012-02-03 19:10:29 -06:00
|
|
|
ast::expl(m) {
|
2012-05-09 08:09:58 -05:00
|
|
|
if !ty::type_needs_infer(ty) &&
|
2012-02-03 08:15:28 -06:00
|
|
|
m == ty::default_arg_mode_for_ty(ty) {
|
2012-07-14 00:57:48 -05:00
|
|
|
~""
|
2012-02-03 19:10:29 -06:00
|
|
|
} else {
|
|
|
|
mode_to_str(ast::expl(m))
|
|
|
|
}
|
|
|
|
}
|
2012-01-16 04:32:38 -06:00
|
|
|
};
|
2012-02-03 19:10:29 -06:00
|
|
|
modestr + ty_to_str(cx, ty)
|
2011-07-05 04:48:19 -05:00
|
|
|
}
|
2012-05-25 01:44:58 -05:00
|
|
|
fn fn_to_str(cx: ctxt, purity: ast::purity, proto: ast::proto,
|
|
|
|
ident: option<ast::ident>,
|
2012-07-13 20:43:52 -05:00
|
|
|
inputs: ~[arg], output: t, cf: ast::ret_style) -> ~str {
|
2012-05-25 01:44:58 -05:00
|
|
|
let mut s;
|
|
|
|
|
|
|
|
s = alt purity {
|
2012-07-14 00:57:48 -05:00
|
|
|
ast::impure_fn {~""}
|
|
|
|
_ {purity_to_str(purity) + ~" "}
|
2012-05-25 01:44:58 -05:00
|
|
|
};
|
|
|
|
s += proto_to_str(proto);
|
2012-07-14 00:57:48 -05:00
|
|
|
alt ident { some(i) { s += ~" "; s += *i; } _ { } }
|
|
|
|
s += ~"(";
|
2012-06-29 18:26:56 -05:00
|
|
|
let mut strs = ~[];
|
2012-06-30 18:19:07 -05:00
|
|
|
for inputs.each |a| { vec::push(strs, fn_input_to_str(cx, a)); }
|
2012-07-14 00:57:48 -05:00
|
|
|
s += str::connect(strs, ~", ");
|
|
|
|
s += ~")";
|
2012-02-03 08:15:28 -06:00
|
|
|
if ty::get(output).struct != ty_nil {
|
2012-07-14 00:57:48 -05:00
|
|
|
s += ~" -> ";
|
2011-09-14 10:18:48 -05:00
|
|
|
alt cf {
|
2012-07-14 00:57:48 -05:00
|
|
|
ast::noreturn { s += ~"!"; }
|
2012-01-19 03:03:57 -06:00
|
|
|
ast::return_val { s += ty_to_str(cx, output); }
|
2011-07-05 04:48:19 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
ret s;
|
|
|
|
}
|
2012-07-14 00:57:48 -05:00
|
|
|
fn method_to_str(cx: ctxt, m: method) -> ~str {
|
2012-05-25 01:44:58 -05:00
|
|
|
ret fn_to_str(
|
|
|
|
cx, m.fty.purity, m.fty.proto, some(m.ident), m.fty.inputs,
|
2012-07-13 20:43:52 -05:00
|
|
|
m.fty.output, m.fty.ret_style) + ~";";
|
2011-07-05 04:48:19 -05:00
|
|
|
}
|
2012-07-14 00:57:48 -05:00
|
|
|
fn field_to_str(cx: ctxt, f: field) -> ~str {
|
|
|
|
ret *f.ident + ~": " + mt_to_str(cx, f.mt);
|
2011-07-05 04:48:19 -05:00
|
|
|
}
|
2012-02-10 12:28:35 -06:00
|
|
|
|
|
|
|
// if there is an id, print that instead of the structural type:
|
2012-06-30 18:19:07 -05:00
|
|
|
for ty::type_def_id(typ).each |def_id| {
|
2012-05-04 14:33:04 -05:00
|
|
|
// note that this typedef cannot have type parameters
|
|
|
|
ret ast_map::path_to_str(ty::item_path(cx, def_id));
|
2011-12-19 06:52:58 -06:00
|
|
|
}
|
2012-02-10 12:28:35 -06:00
|
|
|
|
|
|
|
// pretty print the structural type representation:
|
2012-02-03 08:15:28 -06:00
|
|
|
ret alt ty::get(typ).struct {
|
2012-07-14 00:57:48 -05:00
|
|
|
ty_nil { ~"()" }
|
|
|
|
ty_bot { ~"_|_" }
|
|
|
|
ty_bool { ~"bool" }
|
|
|
|
ty_int(ast::ty_i) { ~"int" }
|
|
|
|
ty_int(ast::ty_char) { ~"char" }
|
2011-12-07 14:06:12 -06:00
|
|
|
ty_int(t) { ast_util::int_ty_to_str(t) }
|
2012-07-14 00:57:48 -05:00
|
|
|
ty_uint(ast::ty_u) { ~"uint" }
|
2011-12-07 14:06:12 -06:00
|
|
|
ty_uint(t) { ast_util::uint_ty_to_str(t) }
|
2012-07-14 00:57:48 -05:00
|
|
|
ty_float(ast::ty_f) { ~"float" }
|
2011-12-07 14:06:12 -06:00
|
|
|
ty_float(t) { ast_util::float_ty_to_str(t) }
|
2012-07-14 00:57:48 -05:00
|
|
|
ty_box(tm) { ~"@" + mt_to_str(cx, tm) }
|
|
|
|
ty_uniq(tm) { ~"~" + mt_to_str(cx, tm) }
|
|
|
|
ty_ptr(tm) { ~"*" + mt_to_str(cx, tm) }
|
2012-04-13 15:35:57 -05:00
|
|
|
ty_rptr(r, tm) {
|
|
|
|
let rs = region_to_str(cx, r);
|
2012-07-14 00:57:48 -05:00
|
|
|
if rs == ~"&" {
|
2012-04-13 15:35:57 -05:00
|
|
|
rs + mt_to_str(cx, tm)
|
|
|
|
} else {
|
2012-07-14 00:57:48 -05:00
|
|
|
rs + ~"/" + mt_to_str(cx, tm)
|
2012-04-13 15:35:57 -05:00
|
|
|
}
|
|
|
|
}
|
2012-07-14 00:57:48 -05:00
|
|
|
ty_unboxed_vec(tm) { ~"unboxed_vec<" + mt_to_str(cx, tm) + ~">" }
|
|
|
|
ty_type { ~"type" }
|
2011-12-07 14:06:12 -06:00
|
|
|
ty_rec(elems) {
|
2012-07-14 00:57:48 -05:00
|
|
|
let mut strs: ~[~str] = ~[];
|
2012-06-30 18:19:07 -05:00
|
|
|
for elems.each |fld| { vec::push(strs, field_to_str(cx, fld)); }
|
2012-07-14 00:57:48 -05:00
|
|
|
~"{" + str::connect(strs, ~",") + ~"}"
|
2011-12-07 14:06:12 -06:00
|
|
|
}
|
|
|
|
ty_tup(elems) {
|
2012-06-29 18:26:56 -05:00
|
|
|
let mut strs = ~[];
|
2012-06-30 18:19:07 -05:00
|
|
|
for elems.each |elem| { vec::push(strs, ty_to_str(cx, elem)); }
|
2012-07-14 00:57:48 -05:00
|
|
|
~"(" + str::connect(strs, ~",") + ~")"
|
2011-12-07 14:06:12 -06:00
|
|
|
}
|
2011-12-23 09:09:52 -06:00
|
|
|
ty_fn(f) {
|
2012-05-25 01:44:58 -05:00
|
|
|
fn_to_str(cx, f.purity, f.proto, none, f.inputs,
|
2012-07-13 20:43:52 -05:00
|
|
|
f.output, f.ret_style)
|
2011-12-07 14:06:12 -06:00
|
|
|
}
|
2012-04-01 16:28:30 -05:00
|
|
|
ty_var(v) { v.to_str() }
|
2012-06-01 16:56:33 -05:00
|
|
|
ty_var_integral(v) { v.to_str() }
|
2012-07-18 13:01:54 -05:00
|
|
|
ty_param({idx: id, _}) {
|
2012-07-14 00:57:48 -05:00
|
|
|
~"'" + str::from_bytes(~[('a' as u8) + (id as u8)])
|
2011-12-07 14:06:12 -06:00
|
|
|
}
|
2012-07-14 00:57:48 -05:00
|
|
|
ty_self { ~"self" }
|
2012-06-24 17:09:57 -05:00
|
|
|
ty_enum(did, substs) | ty_class(did, substs) {
|
2012-04-18 23:26:25 -05:00
|
|
|
let path = ty::item_path(cx, did);
|
|
|
|
let base = ast_map::path_to_str(path);
|
|
|
|
parameterized(cx, base, substs.self_r, substs.tps)
|
|
|
|
}
|
2012-07-03 18:30:42 -05:00
|
|
|
ty_trait(did, substs) {
|
2012-02-10 08:01:32 -06:00
|
|
|
let path = ty::item_path(cx, did);
|
|
|
|
let base = ast_map::path_to_str(path);
|
2012-04-24 17:52:52 -05:00
|
|
|
parameterized(cx, base, substs.self_r, substs.tps)
|
2012-02-10 08:01:32 -06:00
|
|
|
}
|
2012-04-13 15:35:57 -05:00
|
|
|
ty_evec(mt, vs) {
|
2012-07-13 17:24:41 -05:00
|
|
|
vstore_ty_to_str(cx, #fmt["[%s]", mt_to_str(cx, mt)], vs)
|
2012-04-13 15:35:57 -05:00
|
|
|
}
|
2012-07-14 00:57:48 -05:00
|
|
|
ty_estr(vs) { vstore_ty_to_str(cx, ~"str", vs) }
|
|
|
|
ty_opaque_box { ~"@?" }
|
|
|
|
ty_opaque_closure_ptr(ck_block) { ~"closure&" }
|
|
|
|
ty_opaque_closure_ptr(ck_box) { ~"closure@" }
|
|
|
|
ty_opaque_closure_ptr(ck_uniq) { ~"closure~" }
|
2011-12-07 14:06:12 -06:00
|
|
|
}
|
2011-07-05 04:48:19 -05:00
|
|
|
}
|
|
|
|
|
2012-04-23 18:01:03 -05:00
|
|
|
fn parameterized(cx: ctxt,
|
2012-07-14 00:57:48 -05:00
|
|
|
base: ~str,
|
2012-04-23 18:01:03 -05:00
|
|
|
self_r: option<ty::region>,
|
2012-07-14 00:57:48 -05:00
|
|
|
tps: ~[ty::t]) -> ~str {
|
2012-04-23 18:01:03 -05:00
|
|
|
|
|
|
|
let r_str = alt self_r {
|
2012-07-14 00:57:48 -05:00
|
|
|
none { ~"" }
|
2012-04-23 18:01:03 -05:00
|
|
|
some(r) {
|
|
|
|
#fmt["/%s", region_to_str(cx, r)]
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
if vec::len(tps) > 0u {
|
2012-06-30 18:19:07 -05:00
|
|
|
let strs = vec::map(tps, |t| ty_to_str(cx, t) );
|
2012-07-14 00:57:48 -05:00
|
|
|
#fmt["%s%s<%s>", base, r_str, str::connect(strs, ~",")]
|
2012-04-23 18:01:03 -05:00
|
|
|
} else {
|
|
|
|
#fmt["%s%s", base, r_str]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-14 00:57:48 -05:00
|
|
|
fn ty_to_short_str(cx: ctxt, typ: t) -> ~str {
|
2012-03-15 08:47:03 -05:00
|
|
|
let mut s = encoder::encoded_ty(cx, typ);
|
2012-02-23 03:44:04 -06:00
|
|
|
if str::len(s) >= 32u { s = str::slice(s, 0u, 32u); }
|
2011-07-05 04:48:19 -05:00
|
|
|
ret s;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Local Variables:
|
|
|
|
// mode: rust
|
|
|
|
// fill-column: 78;
|
|
|
|
// indent-tabs-mode: nil
|
|
|
|
// c-basic-offset: 4
|
|
|
|
// buffer-file-coding-system: utf-8-unix
|
|
|
|
// End:
|