aboutsummaryrefslogtreecommitdiff
path: root/src/comp/pretty/pprust.rs
diff options
context:
space:
mode:
authorBrian Anderson <[email protected]>2011-03-13 19:40:25 -0400
committerBrian Anderson <[email protected]>2011-03-13 19:40:25 -0400
commitbbb6836da003be71744b6e6ea7af1fd4674f8291 (patch)
treefc7780f767666cced8406818806216bee3863c91 /src/comp/pretty/pprust.rs
parentRemove extra blocks from the translation of expr_block (diff)
parentAdd llvmext/include to the list of include directories to hopefully put out t... (diff)
downloadrust-bbb6836da003be71744b6e6ea7af1fd4674f8291.tar.xz
rust-bbb6836da003be71744b6e6ea7af1fd4674f8291.zip
Merge branch 'master' into recursive-elseif
Conflicts: src/comp/middle/typeck.rs
Diffstat (limited to 'src/comp/pretty/pprust.rs')
-rw-r--r--src/comp/pretty/pprust.rs75
1 files changed, 56 insertions, 19 deletions
diff --git a/src/comp/pretty/pprust.rs b/src/comp/pretty/pprust.rs
index cab778f1..2b64b8e4 100644
--- a/src/comp/pretty/pprust.rs
+++ b/src/comp/pretty/pprust.rs
@@ -11,13 +11,19 @@ import foo = std.io;
const uint indent_unit = 2u;
const int as_prec = 5;
-impure fn print_ast(ast._mod _mod) {
- auto s = pp.mkstate(80u);
+impure fn print_ast(ast._mod _mod, std.io.writer out) {
+ auto s = pp.mkstate(out, 80u);
for (@ast.view_item vitem in _mod.view_items) {print_view_item(s, vitem);}
line(s);
for (@ast.item item in _mod.items) {print_item(s, item);}
}
+fn ty_to_str(&@ast.ty ty) -> str {
+ auto writer = std.io.string_writer();
+ print_type(pp.mkstate(writer.get_writer(), 0u), ty);
+ ret writer.get_str();
+}
+
impure fn hbox(ps s) {
pp.hbox(s, indent_unit);
}
@@ -85,24 +91,21 @@ impure fn print_type(ps s, @ast.ty ty) {
commasep[ast.ty_field](s, fields, f);
pclose(s);
}
- case (ast.ty_fn(?proto,?inputs,?output)) {
- if (proto == ast.proto_fn) {wrd(s, "fn");}
- else {wrd(s, "iter");}
- popen(s);
- impure fn print_arg(ps s, ast.ty_arg input) {
- if (middle.ty.mode_is_alias(input.mode)) {wrd(s, "&");}
- print_type(s, input.ty);
- }
- auto f = print_arg;
- commasep[ast.ty_arg](s, inputs, f);
- pclose(s);
- if (output.node != ast.ty_nil) {
- space(s);
+ case (ast.ty_obj(?methods)) {
+ wrd1(s, "obj");
+ bopen(s);
+ for (ast.ty_method m in methods) {
hbox(s);
- wrd1(s, "->");
- print_type(s, output);
+ print_ty_fn(s, m.proto, option.some[str](m.ident),
+ m.inputs, m.output);
+ wrd(s, ";");
end(s);
+ line(s);
}
+ bclose(s);
+ }
+ case (ast.ty_fn(?proto,?inputs,?output)) {
+ print_ty_fn(s, proto, option.none[str], inputs, output);
}
case (ast.ty_path(?path,_)) {
print_path(s, path);
@@ -376,6 +379,7 @@ impure fn print_expr(ps s, @ast.expr expr) {
wrd1(s, "else");
print_expr(s, _else);
}
+ case (_) { /* fall through */ }
}
}
case (ast.expr_while(?test,?block,_)) {
@@ -503,8 +507,16 @@ impure fn print_expr(ps s, @ast.expr expr) {
wrd1(s, "check");
print_expr(s, expr);
}
- case (_) {wrd(s, "X");}
- // TODO expr_ext(path, vec[@expr], option.t[@expr], @expr, ann);
+ case (ast.expr_ext(?path, ?args, ?body, _, _)) {
+ wrd(s, "#");
+ print_path(s, path);
+ if (_vec.len[@ast.expr](args) > 0u) {
+ popen(s);
+ commasep[@ast.expr](s, args, pe);
+ pclose(s);
+ }
+ // TODO: extension 'body'
+ }
}
end(s);
}
@@ -706,3 +718,28 @@ fn escape_str(str st, char to_escape) -> str {
impure fn print_string(ps s, str st) {
wrd(s, "\""); wrd(s, escape_str(st, '"')); wrd(s, "\"");
}
+
+impure fn print_ty_fn(ps s, ast.proto proto, option.t[str] id,
+ vec[ast.ty_arg] inputs, @ast.ty output) {
+ if (proto == ast.proto_fn) {wrd(s, "fn");}
+ else {wrd(s, "iter");}
+ alt (id) {
+ case (option.some[str](?id)) {space(s); wrd(s, id);}
+ case (_) {}
+ }
+ popen(s);
+ impure fn print_arg(ps s, ast.ty_arg input) {
+ if (middle.ty.mode_is_alias(input.mode)) {wrd(s, "&");}
+ print_type(s, input.ty);
+ }
+ auto f = print_arg;
+ commasep[ast.ty_arg](s, inputs, f);
+ pclose(s);
+ if (output.node != ast.ty_nil) {
+ space(s);
+ hbox(s);
+ wrd1(s, "->");
+ print_type(s, output);
+ end(s);
+ }
+}