about summary refs log tree commit diff
path: root/src/comp/syntax
diff options
context:
space:
mode:
authorKevin Atkinson <kevina@cs.utah.edu>2012-02-10 12:23:40 -0700
committerKevin Atkinson <kevina@cs.utah.edu>2012-02-10 12:32:51 -0700
commitd808df893a085205cb6e113ce98ac09accbc595a (patch)
tree37c564cda6bbeda7473db2e22da535e4e123a197 /src/comp/syntax
parent4026053e99b6554bd7d996839e04dfeb9d40aa4d (diff)
downloadrust-d808df893a085205cb6e113ce98ac09accbc595a.tar.gz
rust-d808df893a085205cb6e113ce98ac09accbc595a.zip
Use file_substr rather than <anon> when re-parsing quasi-quotes
for better error messages.
Diffstat (limited to 'src/comp/syntax')
-rw-r--r--src/comp/syntax/codemap.rs8
-rw-r--r--src/comp/syntax/ext/expand.rs2
-rw-r--r--src/comp/syntax/ext/qquote.rs39
3 files changed, 25 insertions, 24 deletions
diff --git a/src/comp/syntax/codemap.rs b/src/comp/syntax/codemap.rs
index 3f848cc893c..d96ed502258 100644
--- a/src/comp/syntax/codemap.rs
+++ b/src/comp/syntax/codemap.rs
@@ -40,14 +40,10 @@ fn new_filemap(filename: filename, src: @str,
                              start_pos_ch, start_pos_byte);
 }
 
-fn get_substr_info(cm: codemap, sp: span)
-    -> (filename, file_substr)
+fn mk_substr_filename(cm: codemap, sp: span) -> str
 {
     let pos = lookup_char_pos(cm, sp.lo);
-    let name = #fmt("<%s:%u:%u>", pos.file.name, pos.line, pos.col);
-    ret (name, fss_internal(sp));
-    //ret (name, fss_external({filename: pos.file.name,
-    //                         line: pos.line, col: pos.col}));
+    ret #fmt("<%s:%u:%u>", pos.file.name, pos.line, pos.col);
 }
 
 fn next_line(file: filemap, chpos: uint, byte_pos: uint) {
diff --git a/src/comp/syntax/ext/expand.rs b/src/comp/syntax/ext/expand.rs
index 8fc0fdcdf23..104f49aebac 100644
--- a/src/comp/syntax/ext/expand.rs
+++ b/src/comp/syntax/ext/expand.rs
@@ -5,7 +5,7 @@ import std::map::hashmap;
 import syntax::ast::{crate, expr_, expr_mac, mac_invoc};
 import syntax::fold::*;
 import syntax::ext::base::*;
-import syntax::ext::qquote::{expand_qquote,qq_helper};
+import syntax::ext::qquote::{qq_helper};
 import syntax::parse::parser::parse_expr_from_source_str;
 
 import codemap::{span, expanded_from};
diff --git a/src/comp/syntax/ext/qquote.rs b/src/comp/syntax/ext/qquote.rs
index d983ff94f15..8899ff64f57 100644
--- a/src/comp/syntax/ext/qquote.rs
+++ b/src/comp/syntax/ext/qquote.rs
@@ -143,18 +143,6 @@ fn expand_ast(ecx: ext_ctxt, _sp: span,
         }
     }
     let body = get_mac_body(ecx,_sp,body);
-    fn finish<T: qq_helper>(ecx: ext_ctxt, body: ast::mac_body_,
-                            f: fn (p: parser) -> T)
-        -> @ast::expr
-    {
-        let cm = ecx.session().parse_sess.cm;
-        let str = @codemap::span_to_snippet(body.span, cm);
-        let (fname, ss) = codemap::get_substr_info(cm, body.span);
-        let node = parse_from_source_str
-            (f, fname, ss, str,
-             ecx.session().opts.cfg, ecx.session().parse_sess);
-        ret expand_qquote(ecx, node.span(), *str, node);
-    }
 
     ret alt what {
       "expr" {finish(ecx, body, parser::parse_expr)}
@@ -181,10 +169,19 @@ fn parse_item(p: parser) -> @ast::item {
     }
 }
 
-fn expand_qquote<N: qq_helper>
-    (ecx: ext_ctxt, sp: span, str: str, node: N)
+fn finish<T: qq_helper>
+    (ecx: ext_ctxt, body: ast::mac_body_, f: fn (p: parser) -> T)
     -> @ast::expr
 {
+    let cm = ecx.session().parse_sess.cm;
+    let str = @codemap::span_to_snippet(body.span, cm);
+    let fname = codemap::mk_substr_filename(cm, body.span);
+    let node = parse_from_source_str
+        (f, fname, codemap::fss_internal(body.span), str,
+         ecx.session().opts.cfg, ecx.session().parse_sess);
+    let loc = codemap::lookup_char_pos(cm, body.span.lo);
+
+    let sp = node.span();
     let qcx = gather_anti_quotes(sp.lo, node);
     let cx = qcx;
     let prev = 0u;
@@ -197,7 +194,7 @@ fn expand_qquote<N: qq_helper>
     let state = active;
     let i = 0u, j = 0u;
     let g_len = vec::len(cx.gather);
-    str::chars_iter(str) {|ch|
+    str::chars_iter(*str) {|ch|
         if (j < g_len && i == cx.gather[j].lo) {
             assert ch == '$';
             let repl = #fmt("$%u ", j);
@@ -227,8 +224,12 @@ fn expand_qquote<N: qq_helper>
                        ["syntax", "parse", "parser",
                         "parse_from_source_str"],
                        [node.mk_parse_fn(cx,sp),
-                        mk_str(cx,sp, "<anon>"),
-                        mk_path(cx,sp, ["syntax", "codemap", "fss_none"]),
+                        mk_str(cx,sp, fname),
+                        mk_call(cx,sp,
+                                ["syntax","ext","qquote", "mk_file_substr"],
+                                [mk_str(cx,sp, loc.file.name),
+                                 mk_uint(cx,sp, loc.line),
+                                 mk_uint(cx,sp, loc.col)]),
                         mk_unary(cx,sp, ast::box(ast::imm),
                                  mk_str(cx,sp, str2)),
                         mk_access_(cx,sp,
@@ -305,6 +306,10 @@ fn print_expr(expr: @ast::expr) {
     stdout.write_str("\n");
 }
 
+fn mk_file_substr(fname: str, line: uint, col: uint) -> codemap::file_substr {
+    codemap::fss_external({filename: fname, line: line, col: col})
+}
+
 // Local Variables:
 // mode: rust
 // fill-column: 78;