From 86e1d4ecbd7564ad2e2c95c260a92b2ce3f7860f Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Mon, 20 Feb 2012 16:56:56 -0800 Subject: [PATCH] rustdoc: astsrv::exec should return sendable types In order to make it parallelizable someday. --- src/rustdoc/astsrv.rs | 2 +- src/rustdoc/attr_pass.rs | 2 +- src/rustdoc/reexport_pass.rs | 79 ++++++++++++++++++++++-------------- 3 files changed, 51 insertions(+), 32 deletions(-) diff --git a/src/rustdoc/astsrv.rs b/src/rustdoc/astsrv.rs index 750e3a2aeafe..3397691d5e3e 100644 --- a/src/rustdoc/astsrv.rs +++ b/src/rustdoc/astsrv.rs @@ -232,7 +232,7 @@ fn should_ignore_external_import_paths_that_dont_exist() { mk_srv_from_str(source); } -fn exec( +fn exec( srv: srv, f: fn~(ctxt: ctxt) -> T ) -> T { diff --git a/src/rustdoc/attr_pass.rs b/src/rustdoc/attr_pass.rs index a0201cbcd042..2d0db9cf4726 100644 --- a/src/rustdoc/attr_pass.rs +++ b/src/rustdoc/attr_pass.rs @@ -86,7 +86,7 @@ fn fold_item( } } -fn parse_item_attrs( +fn parse_item_attrs( srv: astsrv::srv, id: doc::ast_id, parse_attrs: fn~([ast::attribute]) -> T) -> T { diff --git a/src/rustdoc/reexport_pass.rs b/src/rustdoc/reexport_pass.rs index 21074cc46f87..6e199d88c4b4 100644 --- a/src/rustdoc/reexport_pass.rs +++ b/src/rustdoc/reexport_pass.rs @@ -31,8 +31,46 @@ fn run(srv: astsrv::srv, doc: doc::cratedoc) -> doc::cratedoc { merge_reexports(doc, path_map) } +// Hash maps are not sendable so converting them back and forth +// to association lists. Yuck. +fn to_assoc_list( + map: map::hashmap +) -> [(K, V)] { + + let vec = []; + map.items {|k, v| + vec += [(k, v)]; + } + ret vec; +} + +fn from_assoc_list( + list: [(K, V)], + new_hash: fn() -> map::hashmap +) -> map::hashmap { + + let map = new_hash(); + vec::iter(list) {|elt| + let (k, v) = elt; + map.insert(k, v); + } + ret map; +} + +fn from_def_assoc_list( + list: [(ast::def_id, V)] +) -> map::hashmap { + from_assoc_list(list, bind common::new_def_hash()) +} + +fn from_str_assoc_list( + list: [(str, V)] +) -> map::hashmap { + from_assoc_list(list, bind map::new_str_hash()) +} + fn build_reexport_def_set(srv: astsrv::srv) -> def_set { - astsrv::exec(srv) {|ctxt| + let assoc_list = astsrv::exec(srv) {|ctxt| let def_set = common::new_def_hash(); ctxt.exp_map.items {|_path, defs| for def in *defs { @@ -40,8 +78,10 @@ fn build_reexport_def_set(srv: astsrv::srv) -> def_set { def_set.insert(def_id, ()); } } - def_set - } + to_assoc_list(def_set) + }; + + from_def_assoc_list(assoc_list) } fn build_reexport_def_map( @@ -85,38 +125,15 @@ fn build_reexport_def_map( } } -fn to_assoc_list( - map: map::hashmap -) -> [(ast::def_id, V)] { - - let vec = []; - map.items {|k, v| - vec += [(k, v)]; - } - ret vec; -} - -fn from_assoc_list( - list: [(ast::def_id, V)] -) -> map::hashmap { - - let map = common::new_def_hash(); - vec::iter(list) {|elt| - let (k, v) = elt; - map.insert(k, v); - } - ret map; -} - fn build_reexport_path_map(srv: astsrv::srv, -def_map: def_map) -> path_map { // This is real unfortunate. Lots of copying going on here let def_assoc_list = to_assoc_list(def_map); #debug("def_map: %?", def_assoc_list); - astsrv::exec(srv) {|ctxt| + let assoc_list = astsrv::exec(srv) {|ctxt| - let def_map = from_assoc_list(def_assoc_list); + let def_map = from_def_assoc_list(def_assoc_list); let path_map = map::new_str_hash(); ctxt.exp_map.items {|path, defs| @@ -149,8 +166,10 @@ fn build_reexport_path_map(srv: astsrv::srv, -def_map: def_map) -> path_map { } } - path_map - } + to_assoc_list(path_map) + }; + + from_str_assoc_list(assoc_list) } fn merge_reexports(