@@ -34,7 +34,9 @@ fn next_line(file: filemap, chpos: uint, byte_pos: uint) {
34
34
35
35
type lookup_fn = fn @( file_pos ) -> uint ;
36
36
37
- fn lookup_pos ( map : codemap , pos : uint , lookup : lookup_fn ) -> loc {
37
+ fn lookup_line ( map : codemap , pos : uint , lookup : lookup_fn )
38
+ -> option:: t < { fm: filemap , line : uint } >
39
+ {
38
40
let len = vec:: len ( map. files ) ;
39
41
let a = 0 u;
40
42
let b = len;
@@ -43,7 +45,7 @@ fn lookup_pos(map: codemap, pos: uint, lookup: lookup_fn) -> loc {
43
45
if lookup ( map. files [ m] . start_pos ) > pos { b = m; } else { a = m; }
44
46
}
45
47
if ( a >= len) {
46
- ret { filename : "-" , line : 0 u , col : 0 u } ;
48
+ ret none ;
47
49
}
48
50
let f = map. files [ a] ;
49
51
a = 0 u;
@@ -52,7 +54,18 @@ fn lookup_pos(map: codemap, pos: uint, lookup: lookup_fn) -> loc {
52
54
let m = ( a + b) / 2 u;
53
55
if lookup ( f. lines [ m] ) > pos { b = m; } else { a = m; }
54
56
}
55
- ret { filename : f. name , line : a + 1 u, col : pos - lookup ( f. lines [ a] ) } ;
57
+ ret some( { fm: f, line: a} ) ;
58
+ }
59
+
60
+ fn lookup_pos ( map : codemap , pos : uint , lookup : lookup_fn ) -> loc {
61
+ alt lookup_line ( map, pos, lookup) {
62
+ some ( { fm: f, line: a} ) {
63
+ { filename: f. name , line: a + 1 u, col: pos - lookup ( f. lines [ a] ) }
64
+ }
65
+ none {
66
+ { filename : "-" , line : 0 u, col : 0 u }
67
+ }
68
+ }
56
69
}
57
70
58
71
fn lookup_char_pos ( map : codemap , pos : uint ) -> loc {
@@ -125,6 +138,30 @@ fn get_line(fm: filemap, line: int) -> str unsafe {
125
138
ret str:: unsafe:: slice_bytes ( * fm. src , begin, end) ;
126
139
}
127
140
141
+ fn lookup_byte_offset ( cm : codemap:: codemap , chpos : uint )
142
+ -> { fm : filemap , pos : uint }
143
+ {
144
+ fn lookup ( pos : file_pos ) -> uint { ret pos. ch ; }
145
+ let { fm, line} = option:: get ( lookup_line ( cm, chpos, lookup) ) ;
146
+ let line_offset = fm. lines [ line] . byte ;
147
+ let col = chpos - fm. lines [ line] . ch ;
148
+ let col_offset = str:: byte_len_range ( * fm. src , line_offset, col) ;
149
+ ret { fm : fm, pos : line_offset + col_offset} ;
150
+ }
151
+
152
+ fn span_to_snippet ( sp : span , cm : codemap:: codemap ) -> str {
153
+ let begin = lookup_byte_offset ( cm, sp. lo ) ;
154
+ let end = lookup_byte_offset ( cm, sp. hi ) ;
155
+ assert begin. fm == end. fm ;
156
+ ret str:: slice ( * begin. fm . src , begin. pos , end. pos ) ;
157
+ }
158
+
159
+ fn get_snippet ( cm : codemap:: codemap , fidx : uint , lo : uint , hi : uint ) -> str
160
+ {
161
+ let fm = cm. files [ fidx] ;
162
+ ret str:: slice ( * fm. src , lo, hi)
163
+ }
164
+
128
165
fn get_filemap ( cm : codemap , filename : str ) -> filemap {
129
166
for fm: filemap in cm. files { if fm. name == filename { ret fm; } }
130
167
//XXjdm the following triggers a mismatched type bug
0 commit comments