diff options
| author | Graydon Hoare <[email protected]> | 2010-12-30 17:00:59 -0800 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-12-30 17:00:59 -0800 |
| commit | 9676fb2d0ad8867aa90d946deb23fd6c5dd33bce (patch) | |
| tree | 88d50eb2b74f58bd814c7cb0d2f9152238338a36 /src/comp/middle | |
| parent | Teach typeck to check obj field accesses. (diff) | |
| download | rust-9676fb2d0ad8867aa90d946deb23fd6c5dd33bce.tar.xz rust-9676fb2d0ad8867aa90d946deb23fd6c5dd33bce.zip | |
Assign method types properly by sorted-order.
Diffstat (limited to 'src/comp/middle')
| -rw-r--r-- | src/comp/middle/typeck.rs | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index b5cc5e76..229a15bb 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -164,7 +164,8 @@ fn ast_ty_to_ty_crate(@crate_ctxt ccx, &@ast.ty ast_ty) -> @ty.t { // We then annotate the AST with the resulting types and return the annotated // AST, along with a table mapping item IDs to their types. -fn collect_item_types(@ast.crate crate) -> tup(@ast.crate, @ty_table) { +fn collect_item_types(session.session sess, @ast.crate crate) + -> tup(@ast.crate, @ty_table) { type ty_item_table = hashmap[ast.def_id,@ast.item]; @@ -344,9 +345,11 @@ fn collect_item_types(@ast.crate crate) -> tup(@ast.crate, @ty_table) { // Second pass: translate the types of all items. let @ty_table item_to_ty = @common.new_def_hash[@ty.t](); - type env = rec(@ty_item_table id_to_ty_item, + type env = rec(session.session sess, + @ty_item_table id_to_ty_item, @ty_table item_to_ty); - let @env e = @rec(id_to_ty_item=id_to_ty_item, + let @env e = @rec(sess=sess, + id_to_ty_item=id_to_ty_item, item_to_ty=item_to_ty); fn convert(&@env e, @ast.item i) -> @env { @@ -413,9 +416,11 @@ fn collect_item_types(@ast.crate crate) -> tup(@ast.crate, @ty_table) { let vec[@ast.method] methods = vec(); let vec[ast.obj_field] fields = vec(); - let uint n = 0u; - for (method meth_ty in meth_tys) { - let @ast.method meth = ob.methods.(n); + for (@ast.method meth in ob.methods) { + let uint ix = ty.method_idx(e.sess, + sp, meth.node.ident, + meth_tys); + let method meth_ty = meth_tys.(ix); let ast.method_ m_; let @ast.method m; auto meth_tfn = plain_ty(ty.ty_fn(meth_ty.inputs, @@ -423,7 +428,6 @@ fn collect_item_types(@ast.crate crate) -> tup(@ast.crate, @ty_table) { m_ = rec(ann=ast.ann_type(meth_tfn) with meth.node); m = @rec(node=m_ with *meth); append[@ast.method](methods, m); - n += 1u; } auto g = bind getter(e.id_to_ty_item, e.item_to_ty, _); for (ast.obj_field fld in ob.fields) { @@ -1529,7 +1533,7 @@ fn update_obj_fields(&@crate_ctxt ccx, @ast.item i) -> @crate_ctxt { } fn check_crate(session.session sess, @ast.crate crate) -> @ast.crate { - auto result = collect_item_types(crate); + auto result = collect_item_types(sess, crate); let vec[ast.obj_field] fields = vec(); |