Skip to content

Commit 81e6bb1

Browse files
committed
libsyntax: First steps toward parsing "extern mod std;"
1 parent fbbe9ac commit 81e6bb1

File tree

1 file changed

+37
-22
lines changed

1 file changed

+37
-22
lines changed

src/libsyntax/parse/parser.rs

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,14 @@ macro_rules! maybe_whole {
157157
}
158158

159159

160+
pure fn maybe_append(+lhs: ~[attribute], rhs: option<~[attribute]>)
161+
-> ~[attribute] {
162+
match rhs {
163+
none => lhs,
164+
some(attrs) => vec::append(lhs, attrs)
165+
}
166+
}
167+
160168

161169
/* ident is handled by common.rs */
162170

@@ -2803,18 +2811,37 @@ class parser {
28032811
items: items};
28042812
}
28052813

2806-
fn parse_item_foreign_mod() -> item_info {
2814+
fn parse_item_foreign_mod(lo: uint,
2815+
visibility: visibility,
2816+
attrs: ~[attribute])
2817+
-> item_or_view_item {
28072818
if self.is_keyword(~"mod") {
28082819
self.expect_keyword(~"mod");
28092820
} else {
28102821
self.expect_keyword(~"module");
28112822
}
2812-
let id = self.parse_ident();
2813-
self.expect(token::LBRACE);
2814-
let more_attrs = self.parse_inner_attrs_and_next();
2815-
let m = self.parse_foreign_mod_items(more_attrs.next);
2816-
self.expect(token::RBRACE);
2817-
(id, item_foreign_mod(m), some(more_attrs.inner))
2823+
let ident = self.parse_ident();
2824+
2825+
// extern mod { ... }
2826+
if self.eat(token::LBRACE) {
2827+
let extra_attrs = self.parse_inner_attrs_and_next();
2828+
let m = self.parse_foreign_mod_items(extra_attrs.next);
2829+
self.expect(token::RBRACE);
2830+
return iovi_item(self.mk_item(lo, self.last_span.hi, ident,
2831+
item_foreign_mod(m), visibility,
2832+
maybe_append(attrs,
2833+
some(extra_attrs.
2834+
inner))));
2835+
}
2836+
2837+
// extern mod foo;
2838+
let metadata = self.parse_optional_meta();
2839+
return iovi_view_item(@{
2840+
node: view_item_use(ident, metadata, self.get_id()),
2841+
attrs: attrs,
2842+
vis: visibility,
2843+
span: mk_sp(lo, self.last_span.hi)
2844+
});
28182845
}
28192846

28202847
fn parse_type_decl() -> {lo: uint, ident: ident} {
@@ -3019,14 +3046,6 @@ class parser {
30193046
visibility = inherited;
30203047
}
30213048

3022-
pure fn maybe_append(+lhs: ~[attribute], rhs: option<~[attribute]>)
3023-
-> ~[attribute] {
3024-
match rhs {
3025-
none => lhs,
3026-
some(attrs) => vec::append(lhs, attrs)
3027-
}
3028-
}
3029-
30303049
if self.eat_keyword(~"const") {
30313050
let (ident, item_, extra_attrs) = self.parse_item_const();
30323051
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
@@ -3063,10 +3082,7 @@ class parser {
30633082
maybe_append(attrs,
30643083
extra_attrs)));
30653084
}
3066-
let (ident, item_, extra_attrs) = self.parse_item_foreign_mod();
3067-
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
3068-
visibility,
3069-
maybe_append(attrs, extra_attrs)));
3085+
return self.parse_item_foreign_mod(lo, visibility, attrs);
30703086
} else if self.eat_keyword(~"mod") || self.eat_keyword(~"module") {
30713087
let (ident, item_, extra_attrs) = self.parse_item_mod();
30723088
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
@@ -3104,9 +3120,8 @@ class parser {
31043120
visibility,
31053121
maybe_append(attrs, extra_attrs)));
31063122
} else if !self.is_any_keyword(copy self.token)
3107-
&& self.look_ahead(1) == token::NOT
3108-
&& is_plain_ident(self.look_ahead(2))
3109-
{
3123+
&& self.look_ahead(1) == token::NOT
3124+
&& is_plain_ident(self.look_ahead(2)) {
31103125
// item macro.
31113126
let pth = self.parse_path_without_tps();
31123127
self.expect(token::NOT);

0 commit comments

Comments
 (0)