rust/src/librustc/metadata/cstore.rs

175 lines
5.1 KiB
Rust
Raw Normal View History

// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
2011-07-07 20:39:44 -05:00
// The crate store - a central repo for information collected about external
// crates and libraries
use core::prelude::*;
use metadata::cstore;
use metadata::decoder;
2013-04-03 07:45:14 -05:00
use core::hashmap::LinearMap;
use core::vec;
use std;
2013-03-26 15:38:07 -05:00
use syntax::ast;
2012-09-04 13:54:36 -05:00
use syntax::parse::token::ident_interner;
// A map from external crate numbers (as decoded from some crate file) to
// local crate numbers (as generated during this session). Each external
// crate may refer to types in other external crates, and each has their
// own crate numbers.
2013-03-22 21:26:41 -05:00
pub type cnum_map = @mut LinearMap<ast::crate_num, ast::crate_num>;
pub struct crate_metadata {
name: @~str,
data: @~[u8],
cnum_map: cnum_map,
cnum: ast::crate_num
}
pub struct CStore {
2013-03-22 21:26:41 -05:00
priv metas: LinearMap <ast::crate_num, @crate_metadata>,
priv extern_mod_crate_map: extern_mod_crate_map,
priv used_crate_files: ~[Path],
priv used_libraries: ~[~str],
priv used_link_args: ~[~str],
intr: @ident_interner
}
// Map from node_id's of local extern mod statements to crate numbers
2013-03-22 21:26:41 -05:00
type extern_mod_crate_map = LinearMap<ast::node_id, ast::crate_num>;
2011-07-07 23:37:56 -05:00
pub fn mk_cstore(intr: @ident_interner) -> CStore {
return CStore {
2013-03-22 21:26:41 -05:00
metas: LinearMap::new(),
extern_mod_crate_map: LinearMap::new(),
used_crate_files: ~[],
used_libraries: ~[],
used_link_args: ~[],
intr: intr
};
}
2013-03-22 21:26:41 -05:00
pub fn get_crate_data(cstore: &CStore, cnum: ast::crate_num)
-> @crate_metadata {
2013-03-22 21:26:41 -05:00
return *cstore.metas.get(&cnum);
}
2013-03-22 21:26:41 -05:00
pub fn get_crate_hash(cstore: &CStore, cnum: ast::crate_num) -> @~str {
let cdata = get_crate_data(cstore, cnum);
2013-02-16 11:48:28 -06:00
decoder::get_crate_hash(cdata.data)
}
2013-03-22 21:26:41 -05:00
pub fn get_crate_vers(cstore: &CStore, cnum: ast::crate_num) -> @~str {
let cdata = get_crate_data(cstore, cnum);
2013-02-16 11:48:28 -06:00
decoder::get_crate_vers(cdata.data)
}
2013-03-22 21:26:41 -05:00
pub fn set_crate_data(cstore: &mut CStore,
cnum: ast::crate_num,
data: @crate_metadata) {
2013-03-22 21:26:41 -05:00
cstore.metas.insert(cnum, data);
}
2013-03-22 21:26:41 -05:00
pub fn have_crate_data(cstore: &CStore, cnum: ast::crate_num) -> bool {
cstore.metas.contains_key(&cnum)
}
2013-03-22 21:26:41 -05:00
pub fn iter_crate_data(cstore: &CStore,
i: &fn(ast::crate_num, @crate_metadata)) {
2013-03-22 21:26:41 -05:00
for cstore.metas.each |&(&k, &v)| {
i(k, v);
}
}
2013-03-22 21:26:41 -05:00
pub fn add_used_crate_file(cstore: &mut CStore, lib: &Path) {
if !vec::contains(cstore.used_crate_files, lib) {
cstore.used_crate_files.push(copy *lib);
}
}
2013-03-22 21:26:41 -05:00
pub fn get_used_crate_files(cstore: &CStore) -> ~[Path] {
return /*bad*/copy cstore.used_crate_files;
}
2013-03-22 21:26:41 -05:00
pub fn add_used_library(cstore: &mut CStore, lib: @~str) -> bool {
2013-03-28 20:39:09 -05:00
assert!(*lib != ~"");
if cstore.used_libraries.contains(&*lib) { return false; }
cstore.used_libraries.push(/*bad*/ copy *lib);
2013-02-16 11:48:28 -06:00
true
}
2013-03-22 21:26:41 -05:00
pub fn get_used_libraries(cstore: &CStore) -> ~[~str] {
2013-02-16 11:48:28 -06:00
/*bad*/copy cstore.used_libraries
}
2013-03-22 21:26:41 -05:00
pub fn add_used_link_args(cstore: &mut CStore, args: &str) {
for args.each_split_char(' ') |s| {
cstore.used_link_args.push(s.to_owned());
}
}
2013-03-22 21:26:41 -05:00
pub fn get_used_link_args(cstore: &CStore) -> ~[~str] {
2013-02-16 11:48:28 -06:00
/*bad*/copy cstore.used_link_args
}
2013-03-22 21:26:41 -05:00
pub fn add_extern_mod_stmt_cnum(cstore: &mut CStore,
emod_id: ast::node_id,
cnum: ast::crate_num) {
2013-03-22 21:26:41 -05:00
cstore.extern_mod_crate_map.insert(emod_id, cnum);
}
2013-03-22 21:26:41 -05:00
pub fn find_extern_mod_stmt_cnum(cstore: &CStore,
emod_id: ast::node_id)
-> Option<ast::crate_num> {
2013-03-22 21:26:41 -05:00
cstore.extern_mod_crate_map.find(&emod_id).map_consume(|x| *x)
2011-07-07 23:37:56 -05:00
}
// returns hashes of crates directly used by this crate. Hashes are sorted by
// (crate name, crate version, crate hash) in lexicographic order (not semver)
2013-03-22 21:26:41 -05:00
pub fn get_dep_hashes(cstore: &CStore) -> ~[~str] {
struct crate_hash { name: @~str, vers: @~str, hash: @~str }
let mut result = ~[];
2013-03-22 21:26:41 -05:00
for cstore.extern_mod_crate_map.each_value |&cnum| {
let cdata = cstore::get_crate_data(cstore, cnum);
let hash = decoder::get_crate_hash(cdata.data);
let vers = decoder::get_crate_vers(cdata.data);
debug!("Add hash[%s]: %s %s", *cdata.name, *vers, *hash);
result.push(crate_hash {
2013-02-20 18:41:21 -06:00
name: cdata.name,
vers: vers,
hash: hash
});
}
let sorted = do std::sort::merge_sort(result) |a, b| {
(a.name, a.vers, a.hash) <= (b.name, b.vers, b.hash)
};
2012-08-22 19:24:52 -05:00
debug!("sorted:");
2012-06-30 18:19:07 -05:00
for sorted.each |x| {
debug!(" hash[%s]: %s", *x.name, *x.hash);
}
sorted.map(|ch| /*bad*/copy *ch.hash)
}
// Local Variables:
// mode: rust
// fill-column: 78;
// indent-tabs-mode: nil
// c-basic-offset: 4
// buffer-file-coding-system: utf-8-unix
// End: