Skip to content

Commit a72982e

Browse files
committed
---
yaml --- r: 11661 b: refs/heads/master c: 4e4bd58 h: refs/heads/master i: 11659: c73ea09 v: v3
1 parent bcf4df0 commit a72982e

File tree

6 files changed

+152
-133
lines changed

6 files changed

+152
-133
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 19508c7d531910c309cd63e9ade2fe1be80ff71b
2+
refs/heads/master: 4e4bd585cd59caeb3a2fb107f1f5ba272149b3ee
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
55
refs/heads/try: 2898dcc5d97da9427ac367542382b6239d9c0bbf

trunk/src/rustc/metadata/encoder.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,12 +159,17 @@ fn encode_item_paths(ebml_w: ebml::writer, ecx: @encode_ctxt, crate: @crate)
159159

160160
fn encode_reexport_paths(ebml_w: ebml::writer,
161161
ecx: @encode_ctxt, &index: [entry<str>]) {
162-
ecx.ccx.exp_map.items {|path, defs|
163-
for def in *defs {
162+
let tcx = ecx.ccx.tcx;
163+
ecx.ccx.exp_map.items {|exp_id, defs|
164+
for def in defs {
165+
if !def.reexp { cont; }
166+
let path = alt check tcx.items.get(exp_id) {
167+
ast_map::node_export(_, path) { ast_map::path_to_str(*path) }
168+
};
164169
index += [{val: path, pos: ebml_w.writer.tell()}];
165170
ebml_w.start_tag(tag_paths_data_item);
166171
encode_name(ebml_w, path);
167-
encode_def_id(ebml_w, ast_util::def_id_of_def(def));
172+
encode_def_id(ebml_w, def.id);
168173
ebml_w.end_tag();
169174
}
170175
}

trunk/src/rustc/middle/ast_map.rs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ enum ast_node {
2727
node_method(@method, def_id /* impl did */, @path /* path to the impl */),
2828
node_variant(variant, def_id, @path),
2929
node_expr(@expr),
30+
node_export(@view_path, @path),
3031
// Locals are numbered, because the alias analysis needs to know in which
3132
// order they are introduced.
3233
node_arg(arg, uint),
@@ -38,14 +39,19 @@ type map = std::map::map<node_id, ast_node>;
3839
type ctx = {map: map, mutable path: path, mutable local_id: uint};
3940
type vt = visit::vt<ctx>;
4041

42+
fn extend(cx: ctx, elt: str) -> @path {
43+
@(cx.path + [path_name(elt)])
44+
}
45+
4146
fn mk_ast_map_visitor() -> vt {
4247
ret visit::mk_vt(@{
4348
visit_item: map_item,
4449
visit_native_item: map_native_item,
4550
visit_expr: map_expr,
4651
visit_fn: map_fn,
4752
visit_local: map_local,
48-
visit_arm: map_arm
53+
visit_arm: map_arm,
54+
visit_view_item: map_view_item
4955
with *visit::default_visitor()
5056
});
5157
}
@@ -140,20 +146,38 @@ fn map_item(i: @item, cx: ctx, v: vt) {
140146
item_enum(vs, _) {
141147
for v in vs {
142148
cx.map.insert(v.node.id, node_variant(
143-
v, ast_util::local_def(i.id),
144-
@(cx.path + [path_name(i.ident)])));
149+
v, ast_util::local_def(i.id), extend(cx, i.ident)));
145150
}
146151
}
147152
_ { }
148153
}
149154
alt i.node {
150-
item_mod(_) | item_native_mod(_) { cx.path += [path_mod(i.ident)]; }
155+
item_mod(_) | item_native_mod(_) {
156+
cx.path += [path_mod(i.ident)];
157+
}
151158
_ { cx.path += [path_name(i.ident)]; }
152159
}
153160
visit::visit_item(i, cx, v);
154161
vec::pop(cx.path);
155162
}
156163

164+
fn map_view_item(vi: @view_item, cx: ctx, _v: vt) {
165+
alt vi.node {
166+
view_item_export(vps) {
167+
for vp in vps {
168+
let (id, name) = alt vp.node {
169+
view_path_simple(nm, _, id) { (id, nm) }
170+
view_path_glob(pth, id) | view_path_list(pth, _, id) {
171+
(id, vec::last_total(*pth))
172+
}
173+
};
174+
cx.map.insert(id, node_export(vp, extend(cx, name)));
175+
}
176+
}
177+
_ {}
178+
}
179+
}
180+
157181
fn map_native_item(i: @native_item, cx: ctx, v: vt) {
158182
cx.map.insert(i.id, node_native_item(i, @cx.path));
159183
visit::visit_native_item(i, cx, v);

trunk/src/rustc/middle/resolve.rs

Lines changed: 89 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import front::attr;
88
import metadata::{csearch, cstore};
99
import driver::session::session;
1010
import util::common::*;
11-
import std::map::{new_int_hash, new_str_hash};
11+
import std::map::{new_int_hash, new_str_hash, mk_hashmap};
1212
import syntax::codemap::span;
1313
import syntax::visit;
1414
import visit::vt;
@@ -117,16 +117,18 @@ type indexed_mod = {
117117

118118
type def_map = hashmap<node_id, def>;
119119
type ext_map = hashmap<def_id, [ident]>;
120-
type exp_map = hashmap<str, @mutable [def]>;
121120
type impl_map = hashmap<node_id, iscopes>;
122121
type impl_cache = hashmap<def_id, option<@[@_impl]>>;
123122

123+
type exp = {reexp: bool, id: def_id};
124+
type exp_map = hashmap<node_id, [exp]>;
125+
124126
type env =
125127
{cstore: cstore::cstore,
126128
def_map: def_map,
127129
ast_map: ast_map::map,
128130
imports: hashmap<ast::node_id, import_state>,
129-
exp_map: exp_map,
131+
mutable exp_map: exp_map,
130132
mod_map: hashmap<ast::node_id, @indexed_mod>,
131133
block_map: hashmap<ast::node_id, [glob_imp_def]>,
132134
ext_map: ext_map,
@@ -188,7 +190,7 @@ fn create_env(sess: session, amap: ast_map::map) -> @env {
188190
def_map: new_int_hash(),
189191
ast_map: amap,
190192
imports: new_int_hash(),
191-
exp_map: new_str_hash(),
193+
mutable exp_map: new_int_hash(),
192194
mod_map: new_int_hash(),
193195
block_map: new_int_hash(),
194196
ext_map: new_def_hash(),
@@ -2005,63 +2007,59 @@ fn check_exports(e: @env) {
20052007

20062008

20072009

2008-
fn lookup_glob_any(e: @env, info: @indexed_mod, sp: span, path: str,
2009-
ident: ident) -> bool {
2010-
let lookup =
2011-
bind lookup_glob_in_mod(*e, info, sp, ident, _, inside);
2012-
let (m, v, t) = (lookup(ns_module),
2013-
lookup(ns_val(value_or_enum)),
2014-
lookup(ns_type));
2015-
let full_path = path + ident;
2016-
maybe_add_reexport(e, full_path, m);
2017-
maybe_add_reexport(e, full_path, v);
2018-
maybe_add_reexport(e, full_path, t);
2010+
fn lookup_glob_any(e: @env, info: @indexed_mod, sp: span,
2011+
ident: ident, export_id: node_id) -> bool {
2012+
let m = lookup_glob_in_mod(*e, info, sp, ident, ns_module, inside);
2013+
let v = lookup_glob_in_mod(*e, info, sp, ident, ns_val(value_or_enum),
2014+
inside);
2015+
let t = lookup_glob_in_mod(*e, info, sp, ident, ns_type, inside);
2016+
maybe_add_reexport(e, export_id, m);
2017+
maybe_add_reexport(e, export_id, v);
2018+
maybe_add_reexport(e, export_id, t);
20192019
is_some(m) || is_some(v) || is_some(t)
20202020
}
20212021

2022-
fn maybe_add_reexport(e: @env, path: str, def: option<def>) {
2023-
alt def {
2024-
some(def) {
2025-
alt e.exp_map.find(path) {
2026-
some(v) {
2027-
// If there are multiple reexports of the same def
2028-
// using the same path, then we only need one copy
2029-
if !vec::contains(*v, def) {
2030-
*v += [def];
2031-
}
2032-
}
2033-
none { e.exp_map.insert(path, @mutable [def]); }
2034-
}
2035-
}
2036-
_ {}
2022+
2023+
fn maybe_add_reexport(e: @env, export_id: node_id, def: option<def>) {
2024+
option::may(def) {|def|
2025+
add_export(e, export_id, def_id_of_def(def), true);
20372026
}
20382027
}
2028+
fn add_export(e: @env, export_id: node_id, target_id: def_id,
2029+
reexp: bool) {
2030+
let found = alt e.exp_map.find(export_id) {
2031+
some(f) { f } none { [] }
2032+
};
2033+
e.exp_map.insert(export_id, found + [{reexp: reexp, id: target_id}]);
2034+
}
20392035

20402036
fn check_export(e: @env, ident: str, _mod: @indexed_mod,
2041-
vi: @view_item) {
2037+
export_id: node_id, vi: @view_item) {
20422038
let found_something = false;
2043-
let full_path = _mod.path + ident;
20442039
if _mod.index.contains_key(ident) {
20452040
found_something = true;
20462041
let xs = _mod.index.get(ident);
20472042
list::iter(xs) {|x|
20482043
alt x {
20492044
mie_import_ident(id, _) {
2050-
alt e.imports.get(id) {
2045+
alt check e.imports.get(id) {
20512046
resolved(v, t, m, _, rid, _) {
2052-
maybe_add_reexport(e, full_path, v);
2053-
maybe_add_reexport(e, full_path, t);
2054-
maybe_add_reexport(e, full_path, m);
2047+
maybe_add_reexport(e, export_id, v);
2048+
maybe_add_reexport(e, export_id, t);
2049+
maybe_add_reexport(e, export_id, m);
20552050
}
2056-
_ { }
20572051
}
20582052
}
2053+
mie_item(@{id, _}) | mie_native_item(@{id, _}) |
2054+
mie_enum_variant(_, _, id, _) {
2055+
add_export(e, export_id, local_def(id), false);
2056+
}
20592057
_ { }
20602058
}
20612059
}
20622060
}
2063-
found_something |= lookup_glob_any(e, _mod, vi.span,
2064-
_mod.path, ident);
2061+
found_something |= lookup_glob_any(e, _mod, vi.span, ident,
2062+
export_id);
20652063
if !found_something {
20662064
e.sess.span_warn(vi.span,
20672065
#fmt("exported item %s is not defined", ident));
@@ -2071,64 +2069,54 @@ fn check_exports(e: @env) {
20712069
fn check_enum_ok(e: @env, sp:span, id: ident, _mod: @indexed_mod)
20722070
-> node_id {
20732071
alt _mod.index.find(id) {
2074-
none { e.sess.span_fatal(sp, #fmt("undefined id %s \
2075-
in an export", id)); }
2076-
some(ms) {
2077-
let maybe_id = list::find(ms) {|m|
2078-
alt m {
2079-
mie_item(an_item) {
2080-
alt an_item.node {
2081-
item_enum(_,_) { /* OK */ some(an_item.id) }
2082-
_ { none }
2083-
}
2084-
}
2085-
_ { none }
2086-
}
2087-
};
2088-
alt maybe_id {
2089-
some(an_id) { ret an_id; }
2090-
_ { e.sess.span_fatal(sp, #fmt("%s does not refer \
2091-
to an enumeration", id)); }
2092-
}
2093-
}
2094-
}
2072+
none {
2073+
e.sess.span_fatal(sp, #fmt("undefined id %s in an export", id));
2074+
}
2075+
some(ms) {
2076+
let maybe_id = list::find(ms) {|m|
2077+
alt m {
2078+
mie_item(@{node: item_enum(_, _), id, _}) { some(id) }
2079+
_ { none }
2080+
}
2081+
};
2082+
alt maybe_id {
2083+
some(an_id) { an_id }
2084+
_ { e.sess.span_fatal(sp, #fmt("%s does not refer \
2085+
to an enumeration", id)); }
2086+
}
2087+
}
2088+
}
20952089
}
20962090

2097-
fn check_export_enum_list(e: @env, _mod: @indexed_mod,
2091+
fn check_export_enum_list(e: @env, export_id: node_id, _mod: @indexed_mod,
20982092
span: codemap::span, id: ast::ident,
20992093
ids: [ast::path_list_ident]) {
2100-
if vec::len(ids) == 0u {
2101-
let _ = check_enum_ok(e, span, id, _mod);
2102-
} else {
2103-
let parent_id = check_enum_ok(e, span, id, _mod);
2104-
for variant_id in ids {
2105-
alt _mod.index.find(variant_id.node.name) {
2106-
some(ms) {
2107-
list::iter(ms) {|m|
2108-
alt m {
2109-
mie_enum_variant(_, _, actual_parent_id, _) {
2110-
if actual_parent_id != parent_id {
2111-
let msg = #fmt("variant %s \
2112-
doesn't belong to enum %s",
2113-
variant_id.node.name,
2114-
id);
2115-
e.sess.span_err(span, msg);
2116-
}
2117-
}
2118-
_ {
2119-
e.sess.span_err(span,
2120-
#fmt("%s is not a variant",
2121-
variant_id.node.name));
2122-
}
2094+
let parent_id = check_enum_ok(e, span, id, _mod);
2095+
add_export(e, export_id, local_def(parent_id), false);
2096+
for variant_id in ids {
2097+
let found = false;
2098+
alt _mod.index.find(variant_id.node.name) {
2099+
some(ms) {
2100+
list::iter(ms) {|m|
2101+
alt m {
2102+
mie_enum_variant(_, _, actual_parent_id, _) {
2103+
found = true;
2104+
if actual_parent_id != parent_id {
2105+
e.sess.span_err(
2106+
span, #fmt("variant %s doesn't belong to \
2107+
enum %s",
2108+
variant_id.node.name, id));
21232109
}
2110+
}
2111+
_ {}
21242112
}
2125-
}
2126-
_ {
2127-
e.sess.span_err(span,
2128-
#fmt("%s is not a variant",
2129-
variant_id.node.name));
2130-
}
21312113
}
2114+
}
2115+
_ {}
2116+
}
2117+
if !found {
2118+
e.sess.span_err(span, #fmt("%s is not a variant",
2119+
variant_id.node.name));
21322120
}
21332121
}
21342122
}
@@ -2141,17 +2129,17 @@ fn check_exports(e: @env) {
21412129
for vi in m.view_items {
21422130
iter_export_paths(*vi) { |vp|
21432131
alt vp.node {
2144-
ast::view_path_simple(ident, _, _) {
2145-
check_export(e, ident, _mod, vi);
2132+
ast::view_path_simple(ident, _, id) {
2133+
check_export(e, ident, _mod, id, vi);
21462134
}
2147-
ast::view_path_list(path, ids, _) {
2135+
ast::view_path_list(path, ids, node_id) {
21482136
let id = if vec::len(*path) == 1u {
21492137
path[0]
21502138
} else {
2151-
e.sess.span_fatal(vp.span,
2152-
#fmt("bad export name-list"))
2139+
e.sess.span_fatal(vp.span, "bad export name-list")
21532140
};
2154-
check_export_enum_list(e, _mod, vp.span, id, ids);
2141+
check_export_enum_list(e, node_id, _mod, vp.span, id,
2142+
ids);
21552143
}
21562144
ast::view_path_glob(_, node_id) {
21572145
glob_is_re_exported.insert(node_id, ());
@@ -2162,18 +2150,14 @@ fn check_exports(e: @env) {
21622150
// Now follow the export-glob links and fill in the
21632151
// globbed_exports and exp_map lists.
21642152
for glob in _mod.glob_imports {
2165-
alt check glob.path.node {
2166-
ast::view_path_glob(path, node_id) {
2167-
if ! glob_is_re_exported.contains_key(node_id) {
2168-
cont;
2169-
}
2170-
}
2171-
}
2153+
let id = alt check glob.path.node {
2154+
ast::view_path_glob(_, node_id) { node_id }
2155+
};
2156+
if ! glob_is_re_exported.contains_key(id) { cont; }
21722157
iter_mod(*e, glob.def,
21732158
glob.path.span, outside) {|ident, def|
2174-
let full_path = _mod.path + ident;
21752159
_mod.globbed_exports += [ident];
2176-
maybe_add_reexport(e, full_path, some(def));
2160+
maybe_add_reexport(e, id, some(def));
21772161
}
21782162
}
21792163
}

trunk/src/rustc/middle/ty.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2216,7 +2216,8 @@ fn item_path(cx: ctxt, id: ast::def_id) -> ast_map::path {
22162216
}
22172217

22182218
ast_map::node_expr(_) | ast_map::node_arg(_, _) |
2219-
ast_map::node_local(_) | ast_map::node_res_ctor(_) {
2219+
ast_map::node_local(_) | ast_map::node_res_ctor(_) |
2220+
ast_map::node_export(_, _) {
22202221
cx.sess.bug(#fmt["cannot find item_path for node %?", node]);
22212222
}
22222223
}

0 commit comments

Comments
 (0)