diff options
| author | Brian Anderson <banderson@mozilla.com> | 2011-06-21 14:23:16 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-06-22 13:55:58 -0700 |
| commit | adc18bb24ae6dacf6bfd9ca9742d47e6d4187a6b (patch) | |
| tree | 59624c339dda1e3da0dd1a6ba72f577e39fa095d /src/comp/front/parser.rs | |
| parent | 64513808cadb809e324084687d94aa763b36c925 (diff) | |
| download | rust-adc18bb24ae6dacf6bfd9ca9742d47e6d4187a6b.tar.gz rust-adc18bb24ae6dacf6bfd9ca9742d47e6d4187a6b.zip | |
rustc: Introduce and parse additional meta_item forms
Examples: #[test], #[link(name = "vers")] Issue #487
Diffstat (limited to 'src/comp/front/parser.rs')
| -rw-r--r-- | src/comp/front/parser.rs | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs index 94ea7e7b69c..c6e256ac03f 100644 --- a/src/comp/front/parser.rs +++ b/src/comp/front/parser.rs @@ -2113,26 +2113,41 @@ fn parse_inner_attrs(&parser p) -> vec[ast::attribute] { fn parse_meta_item(&parser p) -> @ast::meta_item { auto lo = p.get_lo_pos(); auto ident = parse_ident(p); - expect(p, token::EQ); alt (p.peek()) { - case (token::LIT_STR(?s)) { - auto hi = p.get_hi_pos(); + case (token::EQ) { p.bump(); - ret @spanned(lo, hi, rec(key=ident, value=p.get_str(s))); + alt (p.peek()) { + case (token::LIT_STR(?s)) { + p.bump(); + auto value = p.get_str(s); + auto hi = p.get_hi_pos(); + ret @spanned(lo, hi, ast::meta_key_value(ident, value)); + } + case (_) { + p.fatal("Metadata items must be string literals"); + } + } + } + case (token::LPAREN) { + auto inner_items = parse_meta_seq(p); + auto hi = p.get_hi_pos(); + ret @spanned(lo, hi, ast::meta_list(ident, inner_items)); + } + case (_) { + auto hi = p.get_hi_pos(); + ret @spanned(lo, hi, ast::meta_word(ident)); } - case (_) { p.fatal("Metadata items must be string literals"); } } - fail; } -fn parse_meta(&parser p) -> vec[@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_optional_meta(&parser p) -> vec[@ast::meta_item] { alt (p.peek()) { - case (token::LPAREN) { ret parse_meta(p); } + case (token::LPAREN) { ret parse_meta_seq(p); } case (_) { let vec[@ast::meta_item] v = []; ret v; } } } |
