rustc: Make meta items into interior vectors

This commit is contained in:
Patrick Walton 2011-07-05 17:57:34 -07:00
parent 479ce4d783
commit 401b6362d7
10 changed files with 90 additions and 66 deletions

View file

@ -81,7 +81,7 @@ fn def_id_of_def(def d) -> def_id {
// The set of meta_items that define the compilation environment of the crate,
// used to drive conditional compilation
type crate_cfg = vec[@meta_item];
type crate_cfg = (@meta_item)[];
type crate = spanned[crate_];
@ -105,7 +105,7 @@ type meta_item = spanned[meta_item_];
tag meta_item_ {
meta_word(ident);
meta_list(ident, vec[@meta_item]);
meta_list(ident, (@meta_item)[]);
meta_name_value(ident, lit);
}
@ -505,7 +505,7 @@ type variant = spanned[variant_];
type view_item = spanned[view_item_];
tag view_item_ {
view_item_use(ident, vec[@meta_item], node_id);
view_item_use(ident, (@meta_item)[], node_id);
view_item_import(ident, vec[ident], node_id);
view_item_import_glob(vec[ident], node_id);
view_item_export(ident, node_id);

View file

@ -104,7 +104,7 @@ fn fold_meta_item_(&@meta_item mi, ast_fold fld) -> @meta_item {
case (meta_word(?id)) { meta_word(fld.fold_ident(id)) }
case (meta_list(?id, ?mis)) {
auto fold_meta_item = bind fold_meta_item_(_,fld);
meta_list(id, map(fold_meta_item, mis))
meta_list(id, ivec::map(fold_meta_item, mis))
}
case (meta_name_value(?id,?s)) {
meta_name_value(fld.fold_ident(id),s)
@ -135,7 +135,7 @@ fn noop_fold_crate(&crate_ c, ast_fold fld) -> crate_ {
ret rec(directives=ivec::map(fld.fold_crate_directive, c.directives),
module=fld.fold_mod(c.module),
attrs=ivec::map(fold_attribute, c.attrs),
config=vec::map(fold_meta_item, c.config));
config=ivec::map(fold_meta_item, c.config));
}
fn noop_fold_crate_directive(&crate_directive_ cd, ast_fold fld)

View file

@ -591,6 +591,24 @@ fn parse_seq_to_end[T](token::token ket, option::t[token::token] sep,
ret v;
}
fn parse_seq_to_end_ivec[T](token::token ket, option::t[token::token] sep,
fn(&parser)->T f, &parser p) -> T[] {
let bool first = true;
let T[] v = ~[];
while (p.peek() != ket) {
alt (sep) {
case (some(?t)) {
if (first) { first = false; } else { expect(p, t); }
}
case (_) { }
}
v += ~[f(p)];
}
expect(p, ket);
ret v;
}
fn parse_seq[T](token::token bra, token::token ket,
option::t[token::token] sep, fn(&parser) -> T f, &parser p)
-> ast::spanned[vec[T]] {
@ -601,6 +619,17 @@ fn parse_seq[T](token::token bra, token::token ket,
ret spanned(lo, hi, result);
}
fn parse_seq_ivec[T](token::token bra, token::token ket,
option::t[token::token] sep,
fn(&parser)->T f, &parser p) -> ast::spanned[T[]] {
auto lo = p.get_lo_pos();
expect(p, bra);
auto result = parse_seq_to_end_ivec[T](ket, sep, f, p);
auto hi = p.get_hi_pos();
ret spanned(lo, hi, result);
}
fn parse_lit(&parser p) -> ast::lit {
auto sp = p.get_span();
let ast::lit_ lit = ast::lit_nil;
@ -2185,15 +2214,15 @@ fn parse_meta_item(&parser p) -> @ast::meta_item {
}
}
fn parse_meta_seq(&parser p) -> vec[@ast::meta_item] {
ret parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA),
parse_meta_item, p).node;
fn parse_meta_seq(&parser p) -> (@ast::meta_item)[] {
ret parse_seq_ivec(token::LPAREN, token::RPAREN, some(token::COMMA),
parse_meta_item, p).node;
}
fn parse_optional_meta(&parser p) -> vec[@ast::meta_item] {
fn parse_optional_meta(&parser p) -> (@ast::meta_item)[] {
alt (p.peek()) {
case (token::LPAREN) { ret parse_meta_seq(p); }
case (_) { let vec[@ast::meta_item] v = []; ret v; }
case (_) { ret ~[]; }
}
}
@ -2203,8 +2232,7 @@ fn parse_use(&parser p) -> @ast::view_item {
auto metadata = parse_optional_meta(p);
auto hi = p.get_hi_pos();
expect(p, token::SEMI);
auto use_decl =
ast::view_item_use(ident, metadata, p.get_id());
auto use_decl = ast::view_item_use(ident, metadata, p.get_id());
ret @spanned(lo, hi, use_decl);
}

View file

@ -1118,7 +1118,7 @@ fn print_meta_item(&ps s, &@ast::meta_item item) {
case (ast::meta_list(?name, ?items)) {
word(s.s, name);
popen(s);
commasep(s, consistent, items, print_meta_item);
commasep_ivec(s, consistent, items, print_meta_item);
pclose(s);
}
}
@ -1132,9 +1132,9 @@ fn print_view_item(&ps s, &@ast::view_item item) {
case (ast::view_item_use(?id, ?mta, _)) {
head(s, "use");
word(s.s, id);
if (vec::len(mta) > 0u) {
if (ivec::len(mta) > 0u) {
popen(s);
commasep(s, consistent, mta, print_meta_item);
commasep_ivec(s, consistent, mta, print_meta_item);
pclose(s);
}
}