diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-01-16 16:55:26 -0800 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-01-16 21:12:35 -0800 |
| commit | 439a28abe0d5d18a17ec194ea0155a43786cdb9b (patch) | |
| tree | cde74b87b3b1972d128db937c4e2702a16c301d5 /src/rustdoc | |
| parent | d455d46b150d261b627afbc32ed809aaf6770ed5 (diff) | |
rustdoc: Add module astsrv to provide access to the (non-sendable) AST
Diffstat (limited to 'src/rustdoc')
| -rw-r--r-- | src/rustdoc/astsrv.rs | 66 | ||||
| -rw-r--r-- | src/rustdoc/rustdoc.rc | 3 |
2 files changed, 68 insertions, 1 deletions
diff --git a/src/rustdoc/astsrv.rs b/src/rustdoc/astsrv.rs new file mode 100644 index 00000000000..ec371a093b3 --- /dev/null +++ b/src/rustdoc/astsrv.rs @@ -0,0 +1,66 @@ +#[doc = "Provides all access to AST-related, non-sendable info"]; + +import rustc::syntax::ast; +import rustc::middle::ast_map; + +export ctxt; +export ctxt_handler; +export srv, seq_srv; +export mk_seq_srv_from_str; +export mk_seq_srv_from_file; + +type ctxt = { + ast: @ast::crate, + map: ast_map::map +}; + +type ctxt_handler<T> = fn~(ctxt: ctxt) -> T; + +iface srv { + fn exec<T>(f: ctxt_handler<T>) -> T; +} + +#[doc = "The single-task service"] +tag seq_srv = ctxt; + +impl seq_srv of srv for seq_srv { + fn exec<T>(f: ctxt_handler<T>) -> T { + f(*self) + } +} + +fn mk_seq_srv_from_str(source: str) -> seq_srv { + seq_srv(build_ctxt(parse::from_str(source))) +} + +fn mk_seq_srv_from_file(file: str) -> seq_srv { + seq_srv(build_ctxt(parse::from_file(file))) +} + +fn build_ctxt(ast: @ast::crate) -> ctxt { + { + ast: ast, + map: ast_map::map_crate(*ast) + } +} + +#[cfg(test)] +mod tests { + + #[test] + fn seq_srv_should_build_ast_map() { + let source = "fn a() { }"; + let srv = mk_seq_srv_from_str(source); + srv.exec {|ctxt| + assert ctxt.map.size() != 0u + }; + } + + #[test] + fn seq_srv_should_return_request_result() { + let source = "fn a() { }"; + let srv = mk_seq_srv_from_str(source); + let result = srv.exec {|_ctxt| 1000}; + assert result == 1000; + } +} \ No newline at end of file diff --git a/src/rustdoc/rustdoc.rc b/src/rustdoc/rustdoc.rc index 4a0db874bc1..cb377fa2369 100644 --- a/src/rustdoc/rustdoc.rc +++ b/src/rustdoc/rustdoc.rc @@ -14,4 +14,5 @@ mod doc; mod gen; mod fold; mod attr_pass; -mod tystr_pass; \ No newline at end of file +mod tystr_pass; +mod astsrv; |
