about summary refs log tree commit diff
path: root/src/libsyntax/ext/source_util.rs
diff options
context:
space:
mode:
authorKevin Cantu <me@kevincantu.org>2012-05-29 21:35:12 -0700
committerBrian Anderson <banderson@mozilla.com>2012-05-31 11:15:00 -0700
commit7dcbaedd329295e1f2692bb2d9eae860a820d0a8 (patch)
treebe0272a0ec2e259da231f9147aaf1dc09b5758c5 /src/libsyntax/ext/source_util.rs
parentff6cde788229484e128849d67e4f32b178b18c84 (diff)
downloadrust-7dcbaedd329295e1f2692bb2d9eae860a820d0a8.tar.gz
rust-7dcbaedd329295e1f2692bb2d9eae860a820d0a8.zip
Rename librustsyntax to libsyntax
Per issue #2418.
Diffstat (limited to 'src/libsyntax/ext/source_util.rs')
-rw-r--r--src/libsyntax/ext/source_util.rs115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/libsyntax/ext/source_util.rs b/src/libsyntax/ext/source_util.rs
new file mode 100644
index 00000000000..99b928cfb9c
--- /dev/null
+++ b/src/libsyntax/ext/source_util.rs
@@ -0,0 +1,115 @@
+import base::*;
+import ast;
+import codemap::span;
+import print::pprust;
+
+export expand_line;
+export expand_col;
+export expand_file;
+export expand_stringify;
+export expand_mod;
+export expand_include;
+export expand_include_str;
+export expand_include_bin;
+
+/* #line(): expands to the current line number */
+fn expand_line(cx: ext_ctxt, sp: span, arg: ast::mac_arg,
+               _body: ast::mac_body) -> @ast::expr {
+    get_mac_args(cx, sp, arg, 0u, option::some(0u), "line");
+    let loc = codemap::lookup_char_pos(cx.codemap(), sp.lo);
+    ret make_new_lit(cx, sp, ast::lit_uint(loc.line as u64, ast::ty_u));
+}
+
+/* #col(): expands to the current column number */
+fn expand_col(cx: ext_ctxt, sp: span, arg: ast::mac_arg,
+              _body: ast::mac_body) -> @ast::expr {
+    get_mac_args(cx, sp, arg, 0u, option::some(0u), "col");
+    let loc = codemap::lookup_char_pos(cx.codemap(), sp.lo);
+    ret make_new_lit(cx, sp, ast::lit_uint(loc.col as u64, ast::ty_u));
+}
+
+/* #file(): expands to the current filename */
+/* The filemap (`loc.file`) contains a bunch more information we could spit
+ * out if we wanted. */
+fn expand_file(cx: ext_ctxt, sp: span, arg: ast::mac_arg,
+               _body: ast::mac_body) -> @ast::expr {
+    get_mac_args(cx, sp, arg, 0u, option::some(0u), "file");
+    let loc = codemap::lookup_char_pos(cx.codemap(), sp.lo);
+    ret make_new_lit(cx, sp, ast::lit_str(loc.file.name));
+}
+
+fn expand_stringify(cx: ext_ctxt, sp: span, arg: ast::mac_arg,
+                    _body: ast::mac_body) -> @ast::expr {
+    let args = get_mac_args(cx, sp, arg, 1u, option::some(1u), "stringify");
+    ret make_new_lit(cx, sp, ast::lit_str(pprust::expr_to_str(args[0])));
+}
+
+fn expand_mod(cx: ext_ctxt, sp: span, arg: ast::mac_arg, _body: ast::mac_body)
+    -> @ast::expr {
+    get_mac_args(cx, sp, arg, 0u, option::some(0u), "file");
+    ret make_new_lit(cx, sp, ast::lit_str(str::connect(cx.mod_path(), "::")));
+}
+
+fn expand_include(cx: ext_ctxt, sp: span, arg: ast::mac_arg,
+                  _body: ast::mac_body) -> @ast::expr {
+    let args = get_mac_args(cx, sp, arg, 1u, option::some(1u), "include");
+    let file = expr_to_str(cx, args[0], "#include_str requires a string");
+    let p = parse::new_parser_from_file(cx.parse_sess(), cx.cfg(),
+                                        res_rel_file(cx, sp, file),
+                                        parse::parser::SOURCE_FILE);
+    ret parse::parser::parse_expr(p)
+}
+
+fn expand_include_str(cx: ext_ctxt, sp: codemap::span, arg: ast::mac_arg,
+                      _body: ast::mac_body) -> @ast::expr {
+    let args = get_mac_args(cx,sp,arg,1u,option::some(1u),"include_str");
+
+    let file = expr_to_str(cx, args[0], "#include_str requires a string");
+
+    alt io::read_whole_file_str(res_rel_file(cx, sp, file)) {
+      result::ok(src) { ret make_new_lit(cx, sp, ast::lit_str(src)); }
+      result::err(e) {
+        cx.parse_sess().span_diagnostic.handler().fatal(e)
+      }
+    }
+}
+
+fn expand_include_bin(cx: ext_ctxt, sp: codemap::span, arg: ast::mac_arg,
+                      _body: ast::mac_body) -> @ast::expr {
+    let args = get_mac_args(cx,sp,arg,1u,option::some(1u),"include_bin");
+
+    let file = expr_to_str(cx, args[0], "#include_bin requires a string");
+
+    alt io::read_whole_file(res_rel_file(cx, sp, file)) {
+      result::ok(src) {
+        let u8_exprs = vec::map(src) { |char: u8|
+            make_new_lit(cx, sp, ast::lit_uint(char as u64, ast::ty_u8))
+        };
+        ret make_new_expr(cx, sp, ast::expr_vec(u8_exprs, ast::m_imm));
+      }
+      result::err(e) {
+        cx.parse_sess().span_diagnostic.handler().fatal(e)
+      }
+    }
+}
+
+fn res_rel_file(cx: ext_ctxt, sp: codemap::span, arg: path) -> path {
+    // NB: relative paths are resolved relative to the compilation unit
+    if !path::path_is_absolute(arg) {
+        let cu = codemap::span_to_filename(sp, cx.codemap());
+        let dir = path::dirname(cu);
+        ret path::connect(dir, arg);
+    } else {
+        ret arg;
+    }
+}
+
+//
+// Local Variables:
+// mode: rust
+// fill-column: 78;
+// indent-tabs-mode: nil
+// c-basic-offset: 4
+// buffer-file-coding-system: utf-8-unix
+// End:
+//