about summary refs log tree commit diff
path: root/src/rustdoc
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-01-16 16:55:26 -0800
committerBrian Anderson <banderson@mozilla.com>2012-01-16 21:12:35 -0800
commit439a28abe0d5d18a17ec194ea0155a43786cdb9b (patch)
treecde74b87b3b1972d128db937c4e2702a16c301d5 /src/rustdoc
parentd455d46b150d261b627afbc32ed809aaf6770ed5 (diff)
rustdoc: Add module astsrv to provide access to the (non-sendable) AST
Diffstat (limited to 'src/rustdoc')
-rw-r--r--src/rustdoc/astsrv.rs66
-rw-r--r--src/rustdoc/rustdoc.rc3
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;