Added support for struct-like enum variants in middle::ty::enum_variants().

This commit is contained in:
Michael Woerister 2013-07-02 23:34:35 +02:00
parent ab34864a30
commit 866a5b1c78

View File

@ -3816,41 +3816,62 @@ pub fn enum_variants(cx: ctxt, id: ast::def_id) -> @~[VariantInfo] {
}, _) => { }, _) => {
let mut disr_val = -1; let mut disr_val = -1;
@enum_definition.variants.iter().transform(|variant| { @enum_definition.variants.iter().transform(|variant| {
let ctor_ty = node_id_to_type(cx, variant.node.id);
match variant.node.kind { match variant.node.kind {
ast::tuple_variant_kind(ref args) => { ast::tuple_variant_kind(ref args) => {
let ctor_ty = node_id_to_type(cx, variant.node.id); let arg_tys = if args.len() > 0u {
let arg_tys = { ty_fn_args(ctor_ty).map(|a| *a) }
if args.len() > 0u { else {
ty_fn_args(ctor_ty).map(|a| *a)
} else {
~[] ~[]
} };
};
match variant.node.disr_expr { match variant.node.disr_expr {
Some (ex) => { Some (ex) => {
disr_val = match const_eval::eval_const_expr(cx, disr_val = match const_eval::eval_const_expr(cx,
ex) { ex) {
const_eval::const_int(val) => val as int, const_eval::const_int(val) => val as int,
_ => cx.sess.bug("tag_variants: bad disr expr") _ => cx.sess.bug("enum_variants: bad disr expr")
} }
} }
_ => disr_val += 1 _ => disr_val += 1
} }
@VariantInfo_{args: arg_tys, @VariantInfo_{
ctor_ty: ctor_ty, args: arg_tys,
name: variant.node.name, ctor_ty: ctor_ty,
id: ast_util::local_def(variant.node.id), name: variant.node.name,
disr_val: disr_val, id: ast_util::local_def(variant.node.id),
vis: variant.node.vis disr_val: disr_val,
vis: variant.node.vis
} }
} },
ast::struct_variant_kind(_) => { ast::struct_variant_kind(struct_def) => {
fail!("struct variant kinds unimpl in enum_variants") let arg_tys =
// Is this check needed for structs too, or are they always guaranteed
// to have a valid constructor function?
if struct_def.fields.len() > 0 {
ty_fn_args(ctor_ty).map(|a| *a)
} else {
~[]
};
assert!(variant.node.disr_expr.is_none());
disr_val += 1;
@VariantInfo_{
args: arg_tys,
ctor_ty: ctor_ty,
name: variant.node.name,
id: ast_util::local_def(variant.node.id),
disr_val: disr_val,
vis: variant.node.vis
}
} }
} }
}).collect() }).collect()
} }
_ => cx.sess.bug("tag_variants: id not bound to an enum") _ => cx.sess.bug("enum_variants: id not bound to an enum")
} }
}; };
cx.enum_var_cache.insert(id, result); cx.enum_var_cache.insert(id, result);