Skip to content

Commit f11f846

Browse files
paulstansifergraydon
authored andcommitted
Parsing and folding changes for globbed imports.
1 parent 610c81a commit f11f846

File tree

2 files changed

+42
-12
lines changed

2 files changed

+42
-12
lines changed

src/comp/front/ast.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,7 @@ type view_item = spanned[view_item_];
398398
tag view_item_ {
399399
view_item_use(ident, vec[@meta_item], def_id, ann);
400400
view_item_import(ident, vec[ident], def_id);
401+
view_item_import_glob(vec[ident], def_id);
401402
view_item_export(ident);
402403
}
403404

src/comp/front/parser.rs

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2183,29 +2183,58 @@ fn parse_use(&parser p) -> @ast::view_item {
21832183
}
21842184

21852185
fn parse_rest_import_name(&parser p, ast::ident first,
2186-
option::t[ast::ident] def_ident)
2186+
option::t[ast::ident] def_ident)
21872187
-> @ast::view_item {
21882188
auto lo = p.get_lo_pos();
21892189
let vec[ast::ident] identifiers = [first];
2190-
while (p.peek() != token::SEMI) {
2191-
expect(p, token::MOD_SEP);
2192-
auto i = parse_ident(p);
2193-
identifiers += [i];
2190+
let bool glob = false;
2191+
2192+
while (true) {
2193+
alt (p.peek()) {
2194+
case (token::SEMI) {
2195+
p.bump();
2196+
break;
2197+
}
2198+
case (token::MOD_SEP) {
2199+
if (glob) { p.err("cannot path into a glob"); }
2200+
p.bump();
2201+
}
2202+
case (_) { p.err("expecting '::' or ';'"); }
2203+
}
2204+
alt (p.peek()) {
2205+
case (token::IDENT(_,_)) {
2206+
identifiers += [parse_ident(p)];
2207+
}
2208+
//the lexer can't tell the different kinds of stars apart ) :
2209+
case (token::BINOP(token::STAR)) {
2210+
glob = true;
2211+
p.bump();
2212+
}
2213+
case (_) { p.err("expecting an identifier, or '*'"); }
2214+
}
21942215
}
21952216
auto hi = p.get_hi_pos();
2196-
p.bump();
2197-
auto defined_id;
2217+
auto import_decl;
21982218
alt (def_ident) {
21992219
case(some[ast::ident](?i)) {
2200-
defined_id = i;
2220+
if (glob) {
2221+
p.err("globbed imports can't be renamed");
2222+
}
2223+
import_decl = ast::view_item_import(i, identifiers,
2224+
p.next_def_id());
22012225
}
22022226
case (_) {
2203-
auto len = vec::len[ast::ident](identifiers);
2204-
defined_id = identifiers.(len - 1u);
2227+
if (glob) {
2228+
import_decl = ast::view_item_import_glob(identifiers,
2229+
p.next_def_id());
2230+
} else {
2231+
auto len = vec::len[ast::ident](identifiers);
2232+
import_decl = ast::view_item_import(identifiers.(len - 1u),
2233+
identifiers,
2234+
p.next_def_id());
2235+
}
22052236
}
22062237
}
2207-
auto import_decl = ast::view_item_import(defined_id, identifiers,
2208-
p.next_def_id());
22092238
ret @spanned(lo, hi, import_decl);
22102239
}
22112240

0 commit comments

Comments
 (0)