about summary refs log tree commit diff
path: root/src/rustc/metadata/decoder.rs
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2012-03-21 12:42:34 -0700
committerTim Chevalier <chevalier@alum.wellesley.edu>2012-03-21 13:53:21 -0700
commit30c272cb3a42cfd842736ddb90133362fe899290 (patch)
tree5daa1ceb5c4570640b5d0a587b89cd350c985d6d /src/rustc/metadata/decoder.rs
parent3e474424714f8e24fd1237d77cf88a3b35a495e5 (diff)
downloadrust-30c272cb3a42cfd842736ddb90133362fe899290.tar.gz
rust-30c272cb3a42cfd842736ddb90133362fe899290.zip
methods work
Cross-crate method calls don't work yet. Added
run-pass/class-method-cross-crate to test that, but it's xfailed

References to fields within methods don't work yet. Added
run-pass/class-methods to test that, but it's also xfailed
Diffstat (limited to 'src/rustc/metadata/decoder.rs')
-rw-r--r--src/rustc/metadata/decoder.rs38
1 files changed, 24 insertions, 14 deletions
diff --git a/src/rustc/metadata/decoder.rs b/src/rustc/metadata/decoder.rs
index 8916d32d393..f4e213e5157 100644
--- a/src/rustc/metadata/decoder.rs
+++ b/src/rustc/metadata/decoder.rs
@@ -17,6 +17,7 @@ import middle::trans::common::maps;
 import util::ppaux::ty_to_str;
 
 export get_class_fields;
+// export get_class_method_ids;
 export get_symbol;
 export get_enum_variants;
 export get_type;
@@ -113,7 +114,7 @@ fn item_parent_item(d: ebml::doc) -> option<ast::def_id> {
     found
 }
 
-fn class_field_id(d: ebml::doc, cdata: cmd) -> ast::def_id {
+fn class_member_id(d: ebml::doc, cdata: cmd) -> ast::def_id {
     let tagdoc = ebml::get_doc(d, tag_def_id);
     ret translate_def_id(cdata, parse_def_id(ebml::doc_data(tagdoc)));
 }
@@ -408,27 +409,36 @@ fn get_iface_methods(cdata: cmd, id: ast::node_id, tcx: ty::ctxt)
     @result
 }
 
-/* Take a node ID for a class, return a vector of the class's
-   field names/IDs */
-fn get_class_fields(tcx: ty::ctxt,
-               cdata: cmd, id: ast::node_id) -> [ty::field_ty] {
+// Helper function that gets either fields or methods
+fn get_class_members(cdata: cmd, id: ast::node_id,
+                     family: char) -> [ty::field_ty] {
     let data = cdata.data;
     let item = lookup_item(id, data), result = [];
     ebml::tagged_docs(item, tag_items_data_item) {|an_item|
-        let fam = item_family(an_item);
-        alt fam {
-         'g' {
-             let name = item_name(an_item);
-             let _ty = doc_type(an_item, tcx, cdata);
-             let did = class_field_id(an_item, cdata);
-             result += [{ident: name, id: did}];
-         }
-        _ { /* this only handles fields */}
+       if item_family(an_item) == family {
+          let name = item_name(an_item);
+          let did = class_member_id(an_item, cdata);
+          result += [{ident: name, id: did}];
        }
     }
     result
 }
 
+
+/* Take a node ID for a class, return a vector of the class's
+   field names/IDs */
+fn get_class_fields(cdata: cmd, id: ast::node_id) -> [ty::field_ty] {
+    get_class_members(cdata, id, 'g')
+}
+
+/*
+/* Take a node ID for a class, return a vector of the class's
+   method names/IDs */
+fn get_class_method_ids(cdata: cmd, id: ast::node_id) -> [ty::field_ty] {
+    get_class_members(cdata, id, 'h')
+}
+*/
+
 fn family_has_type_params(fam_ch: char) -> bool {
     alt check fam_ch {
       'c' | 'T' | 'm' | 'n' | 'g' | 'h' { false }