diff options
| author | Kevin Atkinson <kevina@cs.utah.edu> | 2012-02-10 11:28:43 -0700 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2012-02-14 19:37:33 -0800 |
| commit | 0e44133e7c4d098f2f5ac342b717128adef07dfe (patch) | |
| tree | 0b37593c5bb190382b9b36ac93975278802a3b34 /src/comp/syntax | |
| parent | 74b4345a38412af92aa7a8bcfabcf143e407c79e (diff) | |
| download | rust-0e44133e7c4d098f2f5ac342b717128adef07dfe.tar.gz rust-0e44133e7c4d098f2f5ac342b717128adef07dfe.zip | |
Do a better job of reporting source location for files (i.e. filemap)
that are really a substr of another file.
Diffstat (limited to 'src/comp/syntax')
| -rw-r--r-- | src/comp/syntax/codemap.rs | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/src/comp/syntax/codemap.rs b/src/comp/syntax/codemap.rs index d95d1cdecc0..18038c262a2 100644 --- a/src/comp/syntax/codemap.rs +++ b/src/comp/syntax/codemap.rs @@ -46,6 +46,8 @@ fn get_substr_info(cm: codemap, sp: span) 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})); } fn next_line(file: filemap, chpos: uint, byte_pos: uint) { @@ -92,6 +94,40 @@ fn lookup_byte_pos(map: codemap, pos: uint) -> loc { ret lookup_pos(map, pos, lookup); } +fn lookup_char_pos_adj(map: codemap, pos: uint) + -> {filename: str, line: uint, col: uint, file: option<filemap>} +{ + let loc = lookup_char_pos(map, pos); + alt (loc.file.substr) { + fss_none { + {filename: loc.file.name, line: loc.line, col: loc.col, + file: some(loc.file)} + } + fss_internal(sp) { + lookup_char_pos_adj(map, sp.lo + (pos - loc.file.start_pos.ch)) + } + fss_external(eloc) { + {filename: eloc.filename, + line: eloc.line + loc.line - 1u, + col: if loc.line == 1u {eloc.col + loc.col} else {loc.col}, + file: none} + } + } +} + +fn adjust_span(map: codemap, sp: span) -> span { + fn lookup(pos: file_pos) -> uint { ret pos.ch; } + let line = lookup_line(map, sp.lo, lookup); + alt (line.fm.substr) { + fss_none {sp} + fss_internal(s) { + adjust_span(map, {lo: s.lo + (sp.lo - line.fm.start_pos.ch), + hi: s.lo + (sp.hi - line.fm.start_pos.ch), + expn_info: sp.expn_info})} + fss_external(_) {sp} + } +} + enum expn_info_ { expanded_from({call_site: span, callie: {name: str, span: option<span>}}) @@ -99,19 +135,25 @@ enum expn_info_ { type expn_info = option<@expn_info_>; type span = {lo: uint, hi: uint, expn_info: expn_info}; -fn span_to_str(sp: span, cm: codemap) -> str { +fn span_to_str_no_adj(sp: span, cm: codemap) -> str { let lo = lookup_char_pos(cm, sp.lo); let hi = lookup_char_pos(cm, sp.hi); ret #fmt("%s:%u:%u: %u:%u", lo.file.name, lo.line, lo.col, hi.line, hi.col) } +fn span_to_str(sp: span, cm: codemap) -> str { + let lo = lookup_char_pos_adj(cm, sp.lo); + let hi = lookup_char_pos_adj(cm, sp.hi); + ret #fmt("%s:%u:%u: %u:%u", lo.filename, + lo.line, lo.col, hi.line, hi.col) +} + type file_lines = {file: filemap, lines: [uint]}; fn span_to_lines(sp: span, cm: codemap::codemap) -> @file_lines { let lo = lookup_char_pos(cm, sp.lo); let hi = lookup_char_pos(cm, sp.hi); - // FIXME: Check for filemap? let lines = []; uint::range(lo.line - 1u, hi.line as uint) {|i| lines += [i]; }; ret @{file: lo.file, lines: lines}; |
