2011-03-15 16:30:43 -07:00
|
|
|
// -*- rust -*-
|
|
|
|
|
|
|
|
import driver.session;
|
|
|
|
import front.ast;
|
|
|
|
import middle.fold;
|
|
|
|
import util.common;
|
|
|
|
import util.common.span;
|
2011-03-15 17:33:05 -07:00
|
|
|
|
|
|
|
import std.fs;
|
2011-03-15 16:30:43 -07:00
|
|
|
import std.map.hashmap;
|
|
|
|
|
|
|
|
// TODO: map to a real type here.
|
2011-03-15 17:33:05 -07:00
|
|
|
type env = @rec(
|
|
|
|
@hashmap[str, @ast.external_crate_info] crate_cache,
|
|
|
|
vec[str] library_search_paths
|
|
|
|
);
|
|
|
|
|
|
|
|
// TODO: return something
|
|
|
|
fn load_crate(ast.ident ident, vec[str] library_search_paths) -> @() {
|
|
|
|
for (str library_search_path in library_search_paths) {
|
|
|
|
auto path = fs.connect(library_search_path, ident);
|
|
|
|
// TODO
|
|
|
|
}
|
|
|
|
|
|
|
|
ret @();
|
|
|
|
}
|
2011-03-15 16:30:43 -07:00
|
|
|
|
|
|
|
fn fold_view_item_use(&env e, &span sp, ast.ident ident,
|
2011-03-15 17:33:05 -07:00
|
|
|
vec[@ast.meta_item] meta_items, ast.def_id id, ast.ann orig_ann)
|
|
|
|
-> @ast.view_item {
|
|
|
|
auto external_crate;
|
|
|
|
if (!e.crate_cache.contains_key(ident)) {
|
|
|
|
external_crate = load_crate(ident, e.library_search_paths);
|
|
|
|
e.crate_cache.insert(ident, external_crate);
|
|
|
|
} else {
|
|
|
|
external_crate = e.crate_cache.get(ident);
|
|
|
|
}
|
2011-03-15 16:30:43 -07:00
|
|
|
|
2011-03-15 17:33:05 -07:00
|
|
|
auto ann = ast.ann_crate(external_crate);
|
|
|
|
auto viu = ast.view_item_use(ident, meta_items, id, ann);
|
2011-03-15 16:30:43 -07:00
|
|
|
ret @fold.respan[ast.view_item_](sp, viu);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Reads external crates referenced by "use" directives.
|
2011-03-15 17:33:05 -07:00
|
|
|
fn read_crates(session.session sess,
|
|
|
|
@ast.crate crate,
|
|
|
|
vec[str] library_search_paths) -> @ast.crate {
|
|
|
|
auto e = @rec(
|
|
|
|
crate_cache=@common.new_str_hash[@ast.external_crate_info](),
|
|
|
|
library_search_paths=library_search_paths
|
|
|
|
);
|
|
|
|
|
2011-03-15 16:30:43 -07:00
|
|
|
auto f = fold_view_item_use;
|
|
|
|
auto fld = @rec(fold_view_item_use=f with *fold.new_identity_fold[env]());
|
2011-03-15 17:33:05 -07:00
|
|
|
ret fold.fold_crate[env](e, fld, crate);
|
2011-03-15 16:30:43 -07:00
|
|
|
}
|
|
|
|
|