diff options
| author | Kevin Atkinson <kevina@cs.utah.edu> | 2012-02-10 12:23:40 -0700 |
|---|---|---|
| committer | Kevin Atkinson <kevina@cs.utah.edu> | 2012-02-10 12:32:51 -0700 |
| commit | d808df893a085205cb6e113ce98ac09accbc595a (patch) | |
| tree | 37c564cda6bbeda7473db2e22da535e4e123a197 /src/comp/syntax | |
| parent | 4026053e99b6554bd7d996839e04dfeb9d40aa4d (diff) | |
| download | rust-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.rs | 8 | ||||
| -rw-r--r-- | src/comp/syntax/ext/expand.rs | 2 | ||||
| -rw-r--r-- | src/comp/syntax/ext/qquote.rs | 39 |
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; |
