Skip to content

Commit d0049c3

Browse files
committed
---
yaml --- r: 4761 b: refs/heads/master c: cd54e77 h: refs/heads/master i: 4759: 10cabc2 v: v3
1 parent b0c5455 commit d0049c3

File tree

11 files changed

+156
-4
lines changed

11 files changed

+156
-4
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: c4ce463f3709c7a8a92941d2e4bfab6db5da550f
2+
refs/heads/master: cd54e7772040cd268f911e9dfd088ad5f659f552

trunk/src/comp/middle/resolve.rs

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ type scopes = list<scope>;
6161

6262
tag import_state {
6363
todo(@ast::view_item, scopes); // only used for explicit imports
64+
todo_from(@ast::view_item, ast::import_ident, scopes);
6465

6566
resolving(span);
6667
resolved(option::t<def>,
@@ -91,6 +92,7 @@ fn new_ext_hash() -> ext_hash {
9192

9293
tag mod_index_entry {
9394
mie_view_item(@ast::view_item);
95+
mie_import_ident(node_id);
9496
mie_item(@ast::item);
9597
mie_native_item(@ast::native_item);
9698
mie_tag_variant(/* tag item */@ast::item, /* variant index */uint);
@@ -173,6 +175,12 @@ fn map_crate(e: &@env, c: &@ast::crate) {
173175
ast::view_item_import(_, ids, id) {
174176
e.imports.insert(id, todo(i, sc));
175177
}
178+
ast::view_item_import_from(mod_path, idents, id) {
179+
for ident in idents {
180+
e.imports.insert(ident.node.id,
181+
todo_from(i, ident, sc));
182+
}
183+
}
176184
_ { }
177185
}
178186
}
@@ -238,11 +246,27 @@ fn map_crate(e: &@env, c: &@ast::crate) {
238246
}
239247
}
240248

249+
fn vi_from_to_vi(from_item: &@ast::view_item,
250+
ident: ast::import_ident) -> @ast::view_item {
251+
alt from_item.node {
252+
ast::view_item_import_from(mod_path, idents, _) {
253+
@ast::respan(ident.span,
254+
ast::view_item_import(ident.node.name,
255+
mod_path + ~[ident.node.name],
256+
ident.node.id))
257+
}
258+
}
259+
}
260+
241261
fn resolve_imports(e: &env) {
242262
for each it: @{key: ast::node_id, val: import_state} in e.imports.items()
243263
{
244264
alt it.val {
245265
todo(item, sc) { resolve_import(e, item, sc); }
266+
todo_from(item, ident, sc) {
267+
let vi = vi_from_to_vi(item, ident);
268+
resolve_import(e, vi, sc);
269+
}
246270
resolved(_, _, _) { }
247271
}
248272
}
@@ -941,6 +965,11 @@ fn lookup_import(e: &env, defid: def_id, ns: namespace) -> option::t<def> {
941965
resolve_import(e, item, sc);
942966
ret lookup_import(e, defid, ns);
943967
}
968+
todo_from(item, ident, sc) {
969+
let vi = vi_from_to_vi(item, ident);
970+
resolve_import(e, vi, sc);
971+
ret lookup_import(e, defid, ns);
972+
}
944973
resolving(sp) { e.sess.span_err(sp, "cyclic import"); ret none; }
945974
resolved(val, typ, md) {
946975
ret alt ns { ns_value. { val } ns_type. { typ } ns_module. { md } };
@@ -1044,6 +1073,7 @@ fn lookup_in_mie(e: &env, mie: &mod_index_entry, ns: namespace) ->
10441073
option::t<def> {
10451074
alt mie {
10461075
mie_view_item(view_item) { ret found_view_item(e, view_item, ns); }
1076+
mie_import_ident(id) { ret lookup_import(e, local_def(id), ns); }
10471077
mie_item(item) { ret found_def_item(item, ns); }
10481078
mie_tag_variant(item, variant_idx) {
10491079
alt item.node {
@@ -1070,7 +1100,6 @@ fn lookup_in_mie(e: &env, mie: &mod_index_entry, ns: namespace) ->
10701100
}
10711101
}
10721102
}
1073-
_ { }
10741103
}
10751104
ret none::<def>;
10761105
}
@@ -1094,6 +1123,13 @@ fn index_mod(md: &ast::_mod) -> mod_index {
10941123
add_to_index(index, ident, mie_view_item(it));
10951124
}
10961125

1126+
ast::view_item_import_from(_, idents, _) {
1127+
for ident in idents {
1128+
add_to_index(index, ident.node.name,
1129+
mie_import_ident(ident.node.id));
1130+
}
1131+
}
1132+
10971133
//globbed imports have to be resolved lazily.
10981134
ast::view_item_import_glob(_, _) | ast::view_item_export(_, _) {
10991135
}
@@ -1128,6 +1164,12 @@ fn index_nmod(md: &ast::native_mod) -> mod_index {
11281164
{
11291165
add_to_index(index, ident, mie_view_item(it));
11301166
}
1167+
ast::view_item_import_from(_, idents, _) {
1168+
for ident in idents {
1169+
add_to_index(index, ident.node.name,
1170+
mie_import_ident(ident.node.id));
1171+
}
1172+
}
11311173
ast::view_item_import_glob(_, _) | ast::view_item_export(_, _) { }
11321174
}
11331175
}

trunk/src/comp/syntax/ast.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,10 +564,15 @@ type view_item = spanned<view_item_>;
564564
// 'import ::foo'
565565
type simple_path = [ident];
566566

567+
type import_ident_ = {name: ident, id: node_id};
568+
569+
type import_ident = spanned<import_ident_>;
570+
567571
tag view_item_ {
568572
view_item_use(ident, [@meta_item], node_id);
569573
view_item_import(ident, simple_path, node_id);
570574
view_item_import_glob(simple_path, node_id);
575+
view_item_import_from(simple_path, [import_ident], node_id);
571576
view_item_export([ident], node_id);
572577
}
573578

trunk/src/comp/syntax/parse/parser.rs

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2288,11 +2288,17 @@ fn parse_rest_import_name(p: &parser, first: ast::ident,
22882288
ast::view_item_ {
22892289
let identifiers: [ast::ident] = ~[first];
22902290
let glob: bool = false;
2291+
let from_idents = option::none::<[ast::import_ident]>;
22912292
while true {
22922293
alt p.peek() {
22932294
token::SEMI. { break; }
22942295
token::MOD_SEP. {
2295-
if glob { p.fatal("cannot path into a glob"); }
2296+
if glob {
2297+
p.fatal("cannot path into a glob");
2298+
}
2299+
if option::is_some(from_idents) {
2300+
p.fatal("cannot path into import list");
2301+
}
22962302
p.bump();
22972303
}
22982304
_ { p.fatal("expecting '::' or ';'"); }
@@ -2305,17 +2311,46 @@ fn parse_rest_import_name(p: &parser, first: ast::ident,
23052311
glob = true;
23062312
p.bump();
23072313
}
2314+
2315+
token::LBRACE. {
2316+
fn parse_import_ident(p: &parser) -> ast::import_ident {
2317+
let lo = p.get_lo_pos();
2318+
let ident = parse_ident(p);
2319+
let hi = p.get_hi_pos();
2320+
ret spanned(lo, hi, {name: ident,
2321+
id: p.get_id()});
2322+
}
2323+
let from_idents_ = parse_seq(token::LBRACE,
2324+
token::RBRACE,
2325+
some(token::COMMA),
2326+
parse_import_ident,
2327+
p).node;
2328+
if vec::is_empty(from_idents_) {
2329+
p.fatal("at least one import is required");
2330+
}
2331+
from_idents = some(from_idents_);
2332+
}
2333+
23082334
_ { p.fatal("expecting an identifier, or '*'"); }
23092335
}
23102336
}
23112337
alt def_ident {
23122338
some(i) {
2313-
if glob { p.fatal("globbed imports can't be renamed"); }
2339+
if glob {
2340+
p.fatal("globbed imports can't be renamed");
2341+
}
2342+
if option::is_some(from_idents) {
2343+
p.fatal("can't rename import list");
2344+
}
23142345
ret ast::view_item_import(i, identifiers, p.get_id());
23152346
}
23162347
_ {
23172348
if glob {
23182349
ret ast::view_item_import_glob(identifiers, p.get_id());
2350+
} else if option::is_some(from_idents) {
2351+
ret ast::view_item_import_from(identifiers,
2352+
option::get(from_idents),
2353+
p.get_id());
23192354
} else {
23202355
let len = vec::len(identifiers);
23212356
ret ast::view_item_import(identifiers.(len - 1u), identifiers,

trunk/src/comp/syntax/print/pprust.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,6 +1267,19 @@ fn print_view_item(s: &ps, item: &@ast::view_item) {
12671267
word(s.s, elt);
12681268
}
12691269
}
1270+
ast::view_item_import_from(mod_path, idents, _) {
1271+
head(s, "import");
1272+
for elt: str in mod_path {
1273+
word(s.s, elt);
1274+
word(s.s, "::");
1275+
}
1276+
word(s.s, "{");
1277+
commasep(s, inconsistent, idents,
1278+
fn(s: &ps, w: &ast::import_ident) {
1279+
word(s.s, w.node.name)
1280+
});
1281+
word(s.s, "}");
1282+
}
12701283
ast::view_item_import_glob(ids, _) {
12711284
head(s, "import");
12721285
let first = true;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// error-pattern:unresolved import: eggs
2+
import spam::{ham, eggs};
3+
4+
mod spam {
5+
fn ham() {}
6+
}
7+
8+
fn main() {
9+
ham();
10+
eggs();
11+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// error-pattern:at least one import is required
2+
import spam::{};
3+
4+
mod spam {
5+
}
6+
7+
fn main() {
8+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// error-pattern:cannot path into import list
2+
import foo::{bar}::baz
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// error-pattern:can't rename import list
2+
3+
import baz = foo::{bar};
4+
5+
mod foo {
6+
fn bar() {}
7+
}
8+
9+
fn main() {
10+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
mod spam {
2+
fn ham() {}
3+
fn eggs() {}
4+
}
5+
6+
native "rust" mod rustrt {
7+
import spam::{ham, eggs};
8+
export ham;
9+
export eggs;
10+
}
11+
12+
fn main() {
13+
rustrt::ham();
14+
rustrt::eggs();
15+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import spam::{ham, eggs};
2+
3+
mod spam {
4+
fn ham() {}
5+
fn eggs() {}
6+
}
7+
8+
fn main() {
9+
ham();
10+
eggs();
11+
}

0 commit comments

Comments
 (0)