diff --git a/src/comp/syntax/ast.rs b/src/comp/syntax/ast.rs index 7f7f6d76bc1caa75c467092e2fbc2a1d9c573b57..e37116d53f5cb62ca4d79c43a5a98a402b84d698 100644 --- a/src/comp/syntax/ast.rs +++ b/src/comp/syntax/ast.rs @@ -418,8 +418,8 @@ enum native_abi { type variant_arg = {ty: @ty, id: node_id}; -type variant_ = {name: ident, args: [variant_arg], id: node_id, - disr_expr: option::t<@expr>}; +type variant_ = {name: ident, attrs: [attribute], args: [variant_arg], + id: node_id, disr_expr: option::t<@expr>}; type variant = spanned; diff --git a/src/comp/syntax/fold.rs b/src/comp/syntax/fold.rs index d2019930b4a1bbde49822730b69254d9df3a3d7f..7e2cd136a28873da0e053e6c890195f8cf9ed9cf 100644 --- a/src/comp/syntax/fold.rs +++ b/src/comp/syntax/fold.rs @@ -441,11 +441,18 @@ fn fold_variant_arg_(va: variant_arg, fld: ast_fold) -> variant_arg { } let fold_variant_arg = bind fold_variant_arg_(_, fld); let args = vec::map(v.args, fold_variant_arg); + + let fold_meta_item = bind fold_meta_item_(_, fld); + let fold_attribute = bind fold_attribute_(_, fold_meta_item); + let attrs = vec::map(v.attrs, fold_attribute); + let de = alt v.disr_expr { some(e) {some(fld.fold_expr(e))} none {none} }; - ret {name: v.name, args: args, id: v.id, + ret {name: v.name, + attrs: attrs, + args: args, id: v.id, disr_expr: de}; } diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs index 4d8acc6fa44783c516a1151a7eec7d9df4f7b054..a66b223175c7fd86691e9d6503e5a19346352d68 100644 --- a/src/comp/syntax/parse/parser.rs +++ b/src/comp/syntax/parse/parser.rs @@ -2042,6 +2042,7 @@ fn parse_item_enum(p: parser, attrs: [ast::attribute]) -> @ast::item { let variant = spanned(ty.span.lo, ty.span.hi, {name: id, + attrs: [], args: [{ty: ty, id: p.get_id()}], id: p.get_id(), disr_expr: none}); @@ -2049,9 +2050,11 @@ fn parse_item_enum(p: parser, attrs: [ast::attribute]) -> @ast::item { ast::item_enum([variant], ty_params), attrs); } expect(p, token::LBRACE); + let all_nullary = true, have_disr = false; while p.token != token::RBRACE { + let variant_attrs = parse_outer_attributes(p); let vlo = p.span.lo; let ident = parse_value_ident(p); let args = [], disr_expr = none; @@ -2068,7 +2071,8 @@ fn parse_item_enum(p: parser, attrs: [ast::attribute]) -> @ast::item { disr_expr = some(parse_expr(p)); } - let vr = {name: ident, args: args, id: p.get_id(), + let vr = {name: ident, attrs: variant_attrs, + args: args, id: p.get_id(), disr_expr: disr_expr}; variants += [spanned(vlo, p.last_span.hi, vr)]; diff --git a/src/comp/syntax/print/pprust.rs b/src/comp/syntax/print/pprust.rs index bdfc06b403b6e47c33a5cb8237f1d04d7fa75d1a..9e6b25aa2fca6bed308cfc60d956c7b86e8a4ca3 100644 --- a/src/comp/syntax/print/pprust.rs +++ b/src/comp/syntax/print/pprust.rs @@ -434,6 +434,7 @@ fn print_item(s: ps, &&item: @ast::item) { for v: ast::variant in variants { space_if_not_bol(s); maybe_print_comment(s, v.span.lo); + print_outer_attributes(s, v.node.attrs); ibox(s, indent_unit); word(s.s, v.node.name); if vec::len(v.node.args) > 0u { diff --git a/src/test/run-pass/variant-attributes.rs b/src/test/run-pass/variant-attributes.rs new file mode 100644 index 0000000000000000000000000000000000000000..45d79c835325f6c55eef447c7bb3cfe1eefd5410 --- /dev/null +++ b/src/test/run-pass/variant-attributes.rs @@ -0,0 +1,29 @@ +// pp-exact - Make sure we actually print the attributes + +enum crew_of_enterprise_d { + + #[captain] + jean_luc_picard, + + #[commander] + william_t_riker, + + #[chief_medical_officer] + beverly_crusher, + + #[ships_councellor] + deanna_troi, + + #[lieutenant_commander] + data, + + #[chief_of_security] + worf, + + #[chief_engineer] + geordi_la_forge, +} + +fn boldly_go(_crew_member: crew_of_enterprise_d, _where: str) { } + +fn main() { boldly_go(worf, "where no one has gone before"); }