Skip to content

Commit f8ac788

Browse files
committed
Print tag names in type error messages. Closes #834.
1 parent 4a894da commit f8ac788

File tree

4 files changed

+31
-14
lines changed

4 files changed

+31
-14
lines changed

src/comp/driver/rustc.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -143,13 +143,13 @@ fn compile_input(sess: session::session, cfg: ast::crate_cfg, input: str,
143143
bind middle::ast_map::map_crate(*crate));
144144
time(time_passes, "external crate/lib resolution",
145145
bind creader::read_crates(sess, *crate));
146-
let d =
146+
let {def_map, ext_map} =
147147
time(time_passes, "resolution",
148148
bind resolve::resolve_crate(sess, ast_map, crate));
149149
let freevars =
150150
time(time_passes, "freevar finding",
151-
bind freevars::annotate_freevars(sess, d, crate));
152-
let ty_cx = ty::mk_ctxt(sess, d, ast_map, freevars);
151+
bind freevars::annotate_freevars(sess, def_map, crate));
152+
let ty_cx = ty::mk_ctxt(sess, def_map, ext_map, ast_map, freevars);
153153
time::<()>(time_passes, "typechecking",
154154
bind typeck::check_crate(ty_cx, crate));
155155
time::<()>(time_passes, "alt checking",
@@ -222,9 +222,9 @@ fn pretty_print_input(sess: session::session, cfg: ast::crate_cfg, input: str,
222222
alt ppm {
223223
ppm_typed. {
224224
let amap = middle::ast_map::map_crate(*crate);
225-
let d = resolve::resolve_crate(sess, amap, crate);
226-
let freevars = freevars::annotate_freevars(sess, d, crate);
227-
let ty_cx = ty::mk_ctxt(sess, d, amap, freevars);
225+
let {def_map, ext_map} = resolve::resolve_crate(sess, amap, crate);
226+
let freevars = freevars::annotate_freevars(sess, def_map, crate);
227+
let ty_cx = ty::mk_ctxt(sess, def_map, ext_map, amap, freevars);
228228
typeck::check_crate(ty_cx, crate);
229229
ann = {pre: ann_paren_for_expr, post: bind ann_typed_post(ty_cx, _)};
230230
}

src/comp/middle/resolve.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import syntax::print::pprust::*;
3636

3737
export resolve_crate;
3838
export def_map;
39+
export ext_map;
3940

4041
// Resolving happens in two passes. The first pass collects defids of all
4142
// (internal) imports and modules, so that they can be looked up when needed,
@@ -113,6 +114,7 @@ type indexed_mod =
113114
only need to look at them to determine exports, which they can't control.*/
114115

115116
type def_map = hashmap<node_id, def>;
117+
type ext_map = hashmap<def_id, [ident]>;
116118

117119
type env =
118120
{cstore: cstore::cstore,
@@ -133,7 +135,7 @@ tag dir { inside; outside; }
133135
tag namespace { ns_value; ns_type; ns_module; }
134136

135137
fn resolve_crate(sess: session, amap: &ast_map::map, crate: @ast::crate) ->
136-
def_map {
138+
{def_map: def_map, ext_map: ext_map} {
137139
let e =
138140
@{cstore: sess.get_cstore(),
139141
def_map: new_int_hash::<def>(),
@@ -148,7 +150,7 @@ fn resolve_crate(sess: session, amap: &ast_map::map, crate: @ast::crate) ->
148150
resolve_imports(*e);
149151
check_for_collisions(e, *crate);
150152
resolve_names(e, crate);
151-
ret e.def_map;
153+
ret {def_map: e.def_map, ext_map: e.ext_map};
152154
}
153155

154156

src/comp/middle/ty.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,9 @@ type ctxt =
212212
@{ts: @type_store,
213213
sess: session::session,
214214
def_map: resolve::def_map,
215+
// We need the ext_map just for printing the types of tags defined in
216+
// other crates. Once we get cnames back it should go.
217+
ext_map: resolve::ext_map,
215218
node_types: node_type_table,
216219
items: ast_map::map,
217220
freevars: freevars::freevar_map,
@@ -392,7 +395,8 @@ fn mk_rcache() -> creader_cache {
392395
}
393396

394397

395-
fn mk_ctxt(s: session::session, dm: resolve::def_map, amap: ast_map::map,
398+
fn mk_ctxt(s: session::session, dm: resolve::def_map,
399+
em: hashmap<def_id, [ident]>, amap: ast_map::map,
396400
freevars: freevars::freevar_map) -> ctxt {
397401
let ntt: node_type_table =
398402
@smallintmap::mk::<ty::ty_param_substs_opt_and_ty>();
@@ -402,6 +406,7 @@ fn mk_ctxt(s: session::session, dm: resolve::def_map, amap: ast_map::map,
402406
@{ts: ts,
403407
sess: s,
404408
def_map: dm,
409+
ext_map: em,
405410
node_types: ntt,
406411
items: amap,
407412
freevars: freevars,

src/comp/util/ppaux.rs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import pp::zerobreak;
1818
import pp::hardbreak;
1919
import ast::ty_mach_to_str;
2020
import syntax::ast;
21+
import middle::ast_map;
22+
import metadata::csearch;
2123

2224
fn mode_str(m: &ty::mode) -> str {
2325
alt m {
@@ -35,6 +37,17 @@ fn fn_ident_to_string(id: ast::node_id, i: &ast::fn_ident) -> str {
3537
ret alt i { none. { "anon" + int::str(id) } some(s) { s } };
3638
}
3739

40+
fn get_id_ident(cx: &ctxt, id: ast::def_id) -> str {
41+
if (id.crate != ast::local_crate) {
42+
str::connect(cx.ext_map.get(id), "::")
43+
} else {
44+
alt cx.items.find(id.node) {
45+
some(ast_map::node_item(it)) { it.ident }
46+
_ { fail "get_id_ident: can't find item in ast_map" }
47+
}
48+
}
49+
}
50+
3851
fn ty_to_str(cx: &ctxt, typ: &t) -> str {
3952
fn fn_input_to_str(cx: &ctxt, input: &{mode: middle::ty::mode, ty: t}) ->
4053
str {
@@ -105,9 +118,7 @@ fn ty_to_str(cx: &ctxt, typ: &t) -> str {
105118
s += "(" + str::connect(strs, ",") + ")";
106119
}
107120
ty_tag(id, tps) {
108-
// The user should never see this if the cname is set properly!
109-
110-
s += "<tag#" + int::str(id.crate) + ":" + int::str(id.node) + ">";
121+
s += get_id_ident(cx, id);
111122
if vec::len::<t>(tps) > 0u {
112123
let strs: [str] = ~[];
113124
for typ: t in tps { strs += ~[ty_to_str(cx, typ)]; }
@@ -128,8 +139,7 @@ fn ty_to_str(cx: &ctxt, typ: &t) -> str {
128139
s += "obj {\n\t" + str::connect(strs, "\n\t") + "\n}";
129140
}
130141
ty_res(id, _, _) {
131-
s +=
132-
"<resource#" + int::str(id.node) + ":" + int::str(id.crate) + ">";
142+
s += get_id_ident(cx, id);
133143
}
134144
ty_var(v) { s += "<T" + int::str(v) + ">"; }
135145
ty_param(id,_) {

0 commit comments

Comments
 (0)