diff options
| author | Patrick Walton <[email protected]> | 2010-12-03 18:12:51 -0800 |
|---|---|---|
| committer | Patrick Walton <[email protected]> | 2010-12-03 18:13:15 -0800 |
| commit | 2e119698b7354b6fd2b96dccfeea821bc538d8f1 (patch) | |
| tree | 7a828b7929bde526d650d4c822b406fa75fa634a /src | |
| parent | Parse layer and effect annotations. (diff) | |
| download | rust-2e119698b7354b6fd2b96dccfeea821bc538d8f1.tar.xz rust-2e119698b7354b6fd2b96dccfeea821bc538d8f1.zip | |
rustc: Add def ids to variant arguments so we can turn them into function arguments later
Diffstat (limited to 'src')
| -rw-r--r-- | src/comp/front/ast.rs | 3 | ||||
| -rw-r--r-- | src/comp/front/parser.rs | 18 | ||||
| -rw-r--r-- | src/comp/middle/fold.rs | 7 | ||||
| -rw-r--r-- | src/comp/middle/trans.rs | 4 | ||||
| -rw-r--r-- | src/comp/middle/typeck.rs | 6 |
5 files changed, 20 insertions, 18 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs index f4bfc7a2..e7695e0b 100644 --- a/src/comp/front/ast.rs +++ b/src/comp/front/ast.rs @@ -198,7 +198,8 @@ tag mod_index_entry { type _mod = rec(vec[@item] items, hashmap[ident,mod_index_entry] index); -type variant = rec(str name, vec[@ty] args, def_id id, ann ann); +type variant_arg = rec(@ty ty, def_id id); +type variant = rec(str name, vec[variant_arg] args, def_id id, ann ann); type item = spanned[item_]; tag item_ { diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs index ba0631ed..879cb2c0 100644 --- a/src/comp/front/parser.rs +++ b/src/comp/front/parser.rs @@ -1271,19 +1271,19 @@ impure fn parse_item_tag(parser p) -> @ast.item { case (token.IDENT(?name)) { p.bump(); - auto args; + let vec[ast.variant_arg] args = vec(); alt (p.peek()) { case (token.LPAREN) { auto f = parse_ty; - auto tys = parse_seq[@ast.ty](token.LPAREN, - token.RPAREN, - some(token.COMMA), - f, p); - args = tys.node; - } - case (_) { - args = vec(); + auto arg_tys = parse_seq[@ast.ty](token.LPAREN, + token.RPAREN, + some(token.COMMA), + f, p); + for (@ast.ty ty in arg_tys.node) { + args += vec(rec(ty=ty, id=p.next_def_id())); + } } + case (_) { /* empty */ } } expect(p, token.SEMI); diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs index 60c5f44b..24e23e92 100644 --- a/src/comp/middle/fold.rs +++ b/src/comp/middle/fold.rs @@ -602,9 +602,10 @@ fn fold_item[ENV](&ENV env, ast_fold[ENV] fld, @item i) -> @item { case (ast.item_tag(?ident, ?variants, ?ty_params, ?id)) { let vec[ast.variant] new_variants = vec(); for (ast.variant v in variants) { - let vec[@ast.ty] new_args = vec(); - for (@ast.ty t in v.args) { - new_args += vec(fold_ty[ENV](env_, fld, t)); + let vec[ast.variant_arg] new_args = vec(); + for (ast.variant_arg va in v.args) { + auto new_ty = fold_ty[ENV](env_, fld, va.ty); + new_args += vec(rec(ty=new_ty, id=va.id)); } new_variants += rec(name=v.name, args=new_args, id=v.id, ann=v.ann); diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index ae8408c2..c658bbca 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -1861,7 +1861,7 @@ impure fn trans_fn(@crate_ctxt cx, &ast._fn f, ast.def_id fid, fn trans_tag_variant(@crate_ctxt cx, ast.def_id tag_id, &ast.variant variant) { - if (_vec.len[@ast.ty](variant.args) == 0u) { + if (_vec.len[ast.variant_arg](variant.args) == 0u) { ret; // nullary constructors are just constants } @@ -1951,7 +1951,7 @@ fn resolve_tag_types_for_item(&@crate_ctxt cx, @ast.item i) -> @crate_ctxt { for (ast.variant variant in variants) { auto arity_info; - if (_vec.len[@ast.ty](variant.args) > 0u) { + if (_vec.len[ast.variant_arg](variant.args) > 0u) { auto llvariantty = type_of_variant(cx, variant); auto align = llvm.LLVMPreferredAlignmentOfType(cx.td.lltd, llvariantty); diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index 208c395a..9353204f 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -418,7 +418,7 @@ fn collect_item_types(@ast.crate crate) -> tup(@ast.crate, @ty_table) { // Nullary tag constructors get turned into constants; n-ary tag // constructors get turned into functions. auto result_ty; - if (_vec.len[@ast.ty](variant.args) == 0u) { + if (_vec.len[ast.variant_arg](variant.args) == 0u) { result_ty = plain_ty(ty_tag(tag_id)); } else { // As above, tell ast_ty_to_ty() that trans_ty_item_to_ty() @@ -427,8 +427,8 @@ fn collect_item_types(@ast.crate crate) -> tup(@ast.crate, @ty_table) { item_to_ty, _); let vec[arg] args = vec(); - for (@ast.ty arg_ast_ty in variant.args) { - auto arg_ty = ast_ty_to_ty(f, arg_ast_ty); + for (ast.variant_arg va in variant.args) { + auto arg_ty = ast_ty_to_ty(f, va.ty); args += vec(rec(mode=ast.alias, ty=arg_ty)); } result_ty = plain_ty(ty_fn(args, plain_ty(ty_tag(tag_id)))); |