Repair zero-variant tags
The parser no longer parsed them.
This commit is contained in:
parent
2f0f6c782a
commit
8420f8c52e
@ -2047,64 +2047,37 @@ fn parse_item_tag(p: parser, attrs: [ast::attribute]) -> @ast::item {
|
||||
ast::item_tag([variant], ty_params), attrs);
|
||||
}
|
||||
expect(p, token::LBRACE);
|
||||
let all_nullary = true;
|
||||
let have_disr = false;
|
||||
let done = false;
|
||||
while !done {
|
||||
let tok = p.token;
|
||||
alt tok {
|
||||
token::IDENT(name, _) {
|
||||
check_bad_word(p);
|
||||
let vlo = p.span.lo;
|
||||
p.bump();
|
||||
let args: [ast::variant_arg] = [];
|
||||
let vhi = p.span.hi;
|
||||
let disr_expr = none;
|
||||
alt p.token {
|
||||
token::LPAREN {
|
||||
all_nullary = false;
|
||||
let arg_tys = parse_seq(token::LPAREN, token::RPAREN,
|
||||
seq_sep(token::COMMA),
|
||||
{|p| parse_ty(p, false)}, p);
|
||||
for ty: @ast::ty in arg_tys.node {
|
||||
args += [{ty: ty, id: p.get_id()}];
|
||||
}
|
||||
vhi = arg_tys.span.hi;
|
||||
}
|
||||
token::EQ {
|
||||
have_disr = true;
|
||||
p.bump();
|
||||
disr_expr = some(parse_expr(p));
|
||||
}
|
||||
_ {/* empty */ }
|
||||
}
|
||||
let all_nullary = true, have_disr = false;
|
||||
|
||||
alt p.token {
|
||||
token::COMMA {
|
||||
p.bump();
|
||||
if p.token == token::RBRACE { done = true; }
|
||||
}
|
||||
token::RBRACE { done = true; }
|
||||
_ { /* fall through */ }
|
||||
while p.token != token::RBRACE {
|
||||
let vlo = p.span.lo;
|
||||
let ident = parse_value_ident(p);
|
||||
let args = [], disr_expr = none;
|
||||
if p.token == token::LPAREN {
|
||||
all_nullary = false;
|
||||
let arg_tys = parse_seq(token::LPAREN, token::RPAREN,
|
||||
seq_sep(token::COMMA),
|
||||
{|p| parse_ty(p, false)}, p);
|
||||
for ty in arg_tys.node {
|
||||
args += [{ty: ty, id: p.get_id()}];
|
||||
}
|
||||
|
||||
p.get_id();
|
||||
let vr = {name: p.get_str(name), args: args, id: p.get_id(),
|
||||
disr_expr: disr_expr};
|
||||
variants += [spanned(vlo, vhi, vr)];
|
||||
}
|
||||
_ {
|
||||
p.fatal("expected name of variant or '}' but found '" +
|
||||
token::to_str(p.reader, tok) + "'");
|
||||
}
|
||||
} else if eat(p, token::EQ) {
|
||||
have_disr = true;
|
||||
disr_expr = some(parse_expr(p));
|
||||
}
|
||||
|
||||
let vr = {name: ident, args: args, id: p.get_id(),
|
||||
disr_expr: disr_expr};
|
||||
variants += [spanned(vlo, p.last_span.hi, vr)];
|
||||
|
||||
if !eat(p, token::COMMA) { break; }
|
||||
}
|
||||
let hi = p.span.hi;
|
||||
expect(p, token::RBRACE);
|
||||
if (have_disr && !all_nullary) {
|
||||
p.fatal("discriminator values can only be used with a c-like enum");
|
||||
}
|
||||
p.bump();
|
||||
ret mk_item(p, lo, hi, id, ast::item_tag(variants, ty_params), attrs);
|
||||
ret mk_item(p, lo, p.last_span.hi, id,
|
||||
ast::item_tag(variants, ty_params), attrs);
|
||||
}
|
||||
|
||||
fn parse_fn_ty_proto(p: parser) -> ast::proto {
|
||||
|
Loading…
x
Reference in New Issue
Block a user