1 // Copyright 2012 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 // Searching for information from the cstore
13 use metadata::common::*;
15 use metadata::decoder;
17 use middle::{ty, resolve};
19 use reader = std::ebml::reader;
22 use syntax::diagnostic::expect;
24 pub struct ProvidedTraitMethodInfo {
29 pub struct StaticMethodInfo {
35 pub fn get_symbol(cstore: @mut cstore::CStore, def: ast::def_id) -> ~str {
36 let cdata = cstore::get_crate_data(cstore, def.crate).data;
37 return decoder::get_symbol(cdata, def.node);
40 pub fn get_type_param_count(cstore: @mut cstore::CStore, def: ast::def_id)
42 let cdata = cstore::get_crate_data(cstore, def.crate).data;
43 return decoder::get_type_param_count(cdata, def.node);
46 /// Iterates over all the language items in the given crate.
47 pub fn each_lang_item(cstore: @mut cstore::CStore,
49 f: &fn(ast::node_id, uint) -> bool) {
50 let crate_data = cstore::get_crate_data(cstore, cnum);
51 decoder::each_lang_item(crate_data, f)
54 /// Iterates over all the paths in the given crate.
55 pub fn each_path(cstore: @mut cstore::CStore,
57 f: &fn(&str, decoder::def_like) -> bool) {
58 let crate_data = cstore::get_crate_data(cstore, cnum);
59 let get_crate_data: decoder::GetCrateDataCb = |cnum| {
60 cstore::get_crate_data(cstore, cnum)
62 decoder::each_path(cstore.intr, crate_data, get_crate_data, f);
65 pub fn get_item_path(tcx: ty::ctxt, def: ast::def_id) -> ast_map::path {
66 let cstore = tcx.cstore;
67 let cdata = cstore::get_crate_data(cstore, def.crate);
68 let path = decoder::get_item_path(cstore.intr, cdata, def.node);
70 // FIXME #1920: This path is not always correct if the crate is not linked
71 // into the root namespace.
72 vec::append(~[ast_map::path_mod(tcx.sess.ident_of(
73 /*bad*/copy *cdata.name))], path)
77 found(ast::inlined_item),
78 found_parent(ast::def_id, ast::inlined_item),
82 // Finds the AST for this item in the crate metadata, if any. If the item was
83 // not marked for inlining, then the AST will not be present and hence none
85 pub fn maybe_get_item_ast(tcx: ty::ctxt, def: ast::def_id,
86 decode_inlined_item: decoder::decode_inlined_item)
88 let cstore = tcx.cstore;
89 let cdata = cstore::get_crate_data(cstore, def.crate);
90 decoder::maybe_get_item_ast(cstore.intr, cdata, tcx, def.node,
94 pub fn get_enum_variants(tcx: ty::ctxt, def: ast::def_id)
95 -> ~[ty::VariantInfo] {
96 let cstore = tcx.cstore;
97 let cdata = cstore::get_crate_data(cstore, def.crate);
98 return decoder::get_enum_variants(cstore.intr, cdata, def.node, tcx)
101 pub fn get_impls_for_mod(cstore: @mut cstore::CStore, def: ast::def_id,
102 name: Option<ast::ident>)
103 -> @~[@resolve::Impl] {
104 let cdata = cstore::get_crate_data(cstore, def.crate);
105 do decoder::get_impls_for_mod(cstore.intr, cdata, def.node, name) |cnum| {
106 cstore::get_crate_data(cstore, cnum)
110 pub fn get_method(tcx: ty::ctxt,
111 def: ast::def_id) -> ty::method
113 let cdata = cstore::get_crate_data(tcx.cstore, def.crate);
114 decoder::get_method(tcx.cstore.intr, cdata, def.node, tcx)
117 pub fn get_method_name_and_self_ty(cstore: @mut cstore::CStore,
118 def: ast::def_id) -> (ast::ident, ast::self_ty_)
120 let cdata = cstore::get_crate_data(cstore, def.crate);
121 decoder::get_method_name_and_self_ty(cstore.intr, cdata, def.node)
124 pub fn get_trait_method_def_ids(cstore: @mut cstore::CStore,
125 def: ast::def_id) -> ~[ast::def_id] {
126 let cdata = cstore::get_crate_data(cstore, def.crate);
127 decoder::get_trait_method_def_ids(cdata, def.node)
130 pub fn get_provided_trait_methods(tcx: ty::ctxt,
132 -> ~[ProvidedTraitMethodInfo] {
133 let cstore = tcx.cstore;
134 let cdata = cstore::get_crate_data(cstore, def.crate);
135 decoder::get_provided_trait_methods(cstore.intr, cdata, def.node, tcx)
138 pub fn get_supertraits(tcx: ty::ctxt, def: ast::def_id) -> ~[@ty::TraitRef] {
139 let cstore = tcx.cstore;
140 let cdata = cstore::get_crate_data(cstore, def.crate);
141 decoder::get_supertraits(cdata, def.node, tcx)
144 pub fn get_type_name_if_impl(cstore: @mut cstore::CStore, def: ast::def_id)
145 -> Option<ast::ident> {
146 let cdata = cstore::get_crate_data(cstore, def.crate);
147 decoder::get_type_name_if_impl(cstore.intr, cdata, def.node)
150 pub fn get_static_methods_if_impl(cstore: @mut cstore::CStore,
152 -> Option<~[StaticMethodInfo]> {
153 let cdata = cstore::get_crate_data(cstore, def.crate);
154 decoder::get_static_methods_if_impl(cstore.intr, cdata, def.node)
157 pub fn get_item_attrs(cstore: @mut cstore::CStore,
159 f: &fn(~[@ast::meta_item])) {
160 let cdata = cstore::get_crate_data(cstore, def_id.crate);
161 decoder::get_item_attrs(cdata, def_id.node, f)
164 pub fn get_struct_fields(cstore: @mut cstore::CStore,
167 let cdata = cstore::get_crate_data(cstore, def.crate);
168 decoder::get_struct_fields(cstore.intr, cdata, def.node)
171 pub fn get_type(tcx: ty::ctxt,
173 -> ty::ty_param_bounds_and_ty {
174 let cstore = tcx.cstore;
175 let cdata = cstore::get_crate_data(cstore, def.crate);
176 decoder::get_type(cdata, def.node, tcx)
179 pub fn get_trait_def(tcx: ty::ctxt, def: ast::def_id) -> ty::TraitDef {
180 let cstore = tcx.cstore;
181 let cdata = cstore::get_crate_data(cstore, def.crate);
182 decoder::get_trait_def(cdata, def.node, tcx)
185 pub fn get_region_param(cstore: @mut metadata::cstore::CStore,
186 def: ast::def_id) -> Option<ty::region_variance> {
187 let cdata = cstore::get_crate_data(cstore, def.crate);
188 return decoder::get_region_param(cdata, def.node);
191 pub fn get_field_type(tcx: ty::ctxt, class_id: ast::def_id,
192 def: ast::def_id) -> ty::ty_param_bounds_and_ty {
193 let cstore = tcx.cstore;
194 let cdata = cstore::get_crate_data(cstore, class_id.crate);
195 let all_items = reader::get_doc(reader::Doc(cdata.data), tag_items);
196 debug!("Looking up %?", class_id);
197 let class_doc = expect(tcx.diag,
198 decoder::maybe_find_item(class_id.node, all_items),
199 || fmt!("get_field_type: class ID %? not found",
201 debug!("looking up %? : %?", def, class_doc);
202 let the_field = expect(tcx.diag,
203 decoder::maybe_find_item(def.node, class_doc),
204 || fmt!("get_field_type: in class %?, field ID %? not found",
206 debug!("got field data %?", the_field);
207 let ty = decoder::item_type(def, the_field, tcx, cdata);
208 ty::ty_param_bounds_and_ty {
209 generics: ty::Generics {type_param_defs: @~[],
215 // Given a def_id for an impl or class, return the traits it implements,
216 // or the empty vector if it's not for an impl or for a class that implements
218 pub fn get_impl_traits(tcx: ty::ctxt,
219 def: ast::def_id) -> ~[@ty::TraitRef] {
220 let cstore = tcx.cstore;
221 let cdata = cstore::get_crate_data(cstore, def.crate);
222 decoder::get_impl_traits(cdata, def.node, tcx)
225 pub fn get_impl_method(cstore: @mut cstore::CStore,
229 let cdata = cstore::get_crate_data(cstore, def.crate);
230 decoder::get_impl_method(cstore.intr, cdata, def.node, mname)
233 pub fn get_item_visibility(cstore: @mut cstore::CStore,
236 let cdata = cstore::get_crate_data(cstore, def_id.crate);
237 decoder::get_item_visibility(cdata, def_id.node)
240 pub fn get_link_args_for_crate(cstore: @mut cstore::CStore,
241 crate_num: ast::crate_num)
243 let cdata = cstore::get_crate_data(cstore, crate_num);
244 decoder::get_link_args_for_crate(cdata)