rust/src/comp/util/ppaux.rs

177 lines
5.5 KiB
Rust
Raw Normal View History

2011-09-12 18:13:28 -05:00
import std::{vec, str, int, option};
import std::option::{none, some};
import middle::ty;
import middle::ty::*;
import metadata::encoder;
2011-11-10 10:41:42 -06:00
import syntax::print::pprust;
2011-09-12 18:13:28 -05:00
import syntax::print::pprust::{path_to_str, constr_args_to_str, proto_to_str};
import syntax::ast_util::ty_mach_to_str;
import syntax::ast;
import middle::ast_map;
fn mode_str(m: ty::mode) -> str {
2011-07-27 07:19:39 -05:00
alt m {
ast::by_ref. { "&&" }
ast::by_val. { "++" }
ast::by_mut_ref. { "&" }
ast::by_move. { "-" }
ast::by_copy. { "+" }
_ { "" }
}
}
fn mode_str_1(m: ty::mode) -> str {
alt m { ast::by_ref. { "ref" } _ { mode_str(m) } }
}
fn fn_ident_to_string(id: ast::node_id, i: ast::fn_ident) -> str {
2011-09-02 17:34:58 -05:00
ret alt i { none. { "anon" + int::str(id) } some(s) { s } };
}
fn get_id_ident(cx: ctxt, id: ast::def_id) -> str {
if id.crate != ast::local_crate {
alt cx.ext_map.find(id) {
2011-09-02 17:34:58 -05:00
some(j) { str::connect(j, "::") }
none. { "<#" + int::str(id.crate) + ":" + int::str(id.node) + ">" }
}
} else {
alt cx.items.find(id.node) {
some(ast_map::node_item(it)) { it.ident }
_ { fail "get_id_ident: can't find item in ast_map" }
}
}
}
fn ty_to_str(cx: ctxt, typ: t) -> str {
fn fn_input_to_str(cx: ctxt, input: {mode: middle::ty::mode, ty: t}) ->
2011-09-02 17:34:58 -05:00
str {
2011-07-27 07:19:39 -05:00
let s = mode_str(input.mode);
ret s + ty_to_str(cx, input.ty);
}
fn fn_to_str(cx: ctxt, proto: ast::proto, ident: option::t<ast::ident>,
inputs: [arg], output: t, cf: ast::ret_style,
constrs: [@constr]) -> str {
let s = proto_to_str(proto);
2011-09-02 17:34:58 -05:00
alt ident { some(i) { s += " "; s += i; } _ { } }
s += "(";
let strs = [];
for a: arg in inputs { strs += [fn_input_to_str(cx, a)]; }
2011-09-02 17:34:58 -05:00
s += str::connect(strs, ", ");
s += ")";
2011-07-27 07:19:39 -05:00
if struct(cx, output) != ty_nil {
s += " -> ";
alt cf {
ast::noreturn. { s += "!"; }
ast::return_val. { s += ty_to_str(cx, output); }
}
}
s += constrs_str(constrs);
ret s;
}
fn method_to_str(cx: ctxt, m: method) -> str {
ret fn_to_str(cx, m.proto, some::<ast::ident>(m.ident), m.inputs,
2011-09-02 17:34:58 -05:00
m.output, m.cf, m.constrs) + ";";
}
fn field_to_str(cx: ctxt, f: field) -> str {
2011-09-02 17:34:58 -05:00
ret f.ident + ": " + mt_to_str(cx, f.mt);
}
fn mt_to_str(cx: ctxt, m: mt) -> str {
2011-07-27 07:19:39 -05:00
let mstr;
alt m.mut {
2011-09-02 17:34:58 -05:00
ast::mut. { mstr = "mutable "; }
ast::imm. { mstr = ""; }
2011-11-16 16:41:32 -06:00
ast::maybe_mut. { mstr = "const "; }
}
ret mstr + ty_to_str(cx, m.ty);
}
2011-09-02 17:34:58 -05:00
alt cname(cx, typ) { some(cs) { ret cs; } _ { } }
2011-08-18 20:03:32 -05:00
ret alt struct(cx, typ) {
2011-09-02 17:34:58 -05:00
ty_native(_) { "native" }
ty_nil. { "()" }
ty_bot. { "_|_" }
ty_bool. { "bool" }
ty_int. { "int" }
ty_float. { "float" }
ty_uint. { "uint" }
ty_machine(tm) { ty_mach_to_str(tm) }
2011-09-02 17:34:58 -05:00
ty_char. { "char" }
2011-09-02 18:45:00 -05:00
ty_str. { "str" }
2011-09-02 17:34:58 -05:00
ty_box(tm) { "@" + mt_to_str(cx, tm) }
ty_uniq(tm) { "~" + mt_to_str(cx, tm) }
2011-09-02 17:34:58 -05:00
ty_vec(tm) { "[" + mt_to_str(cx, tm) + "]" }
ty_type. { "type" }
ty_rec(elems) {
2011-09-02 17:34:58 -05:00
let strs: [str] = [];
for fld: field in elems { strs += [field_to_str(cx, fld)]; }
2011-09-02 17:34:58 -05:00
"{" + str::connect(strs, ",") + "}"
}
ty_tup(elems) {
let strs = [];
for elem in elems { strs += [ty_to_str(cx, elem)]; }
2011-09-02 17:34:58 -05:00
"(" + str::connect(strs, ",") + ")"
}
ty_tag(id, tps) {
let s = get_id_ident(cx, id);
if vec::len::<t>(tps) > 0u {
2011-09-02 17:34:58 -05:00
let strs: [str] = [];
for typ: t in tps { strs += [ty_to_str(cx, typ)]; }
s += "<" + str::connect(strs, ",") + ">";
}
s
}
ty_fn(proto, inputs, output, cf, constrs) {
fn_to_str(cx, proto, none, inputs, output, cf, constrs)
}
2011-11-20 12:15:40 -06:00
ty_native_fn(inputs, output) {
fn_to_str(cx, ast::proto_bare, none, inputs, output,
ast::return_val, [])
}
ty_obj(meths) {
let strs = [];
for m: method in meths { strs += [method_to_str(cx, m)]; }
2011-09-02 17:34:58 -05:00
"obj {\n\t" + str::connect(strs, "\n\t") + "\n}"
}
ty_res(id, _, _) { get_id_ident(cx, id) }
2011-09-02 17:34:58 -05:00
ty_var(v) { "<T" + int::str(v) + ">" }
ty_param(id, _) {
2011-09-02 17:34:58 -05:00
"'" + str::unsafe_from_bytes([('a' as u8) + (id as u8)])
}
_ { ty_to_short_str(cx, typ) }
}
}
fn ty_to_short_str(cx: ctxt, typ: t) -> str {
2011-07-27 07:19:39 -05:00
let s = encoder::encoded_ty(cx, typ);
if str::byte_len(s) >= 32u { s = str::substr(s, 0u, 32u); }
ret s;
}
fn constr_to_str(c: @constr) -> str {
ret path_to_str(c.node.path) +
2011-09-02 17:34:58 -05:00
pprust::constr_args_to_str(pprust::uint_to_str, c.node.args);
}
fn constrs_str(constrs: [@constr]) -> str {
2011-09-02 17:34:58 -05:00
let s = "";
2011-07-27 07:19:39 -05:00
let colon = true;
for c: @constr in constrs {
2011-09-02 17:34:58 -05:00
if colon { s += " : "; colon = false; } else { s += ", "; }
s += constr_to_str(c);
}
ret s;
}
fn ty_constr_to_str<Q>(c: @ast::spanned<ast::constr_general_<@ast::path, Q>>)
2011-09-02 17:34:58 -05:00
-> str {
ret path_to_str(c.node.path) +
constr_args_to_str::<@ast::path>(path_to_str, c.node.args);
}
// Local Variables:
// mode: rust
// fill-column: 78;
// indent-tabs-mode: nil
// c-basic-offset: 4
// buffer-file-coding-system: utf-8-unix
// End: