@@ -46,6 +46,8 @@ fn get_substr_info(cm: codemap, sp: span)
46
46
let pos = lookup_char_pos ( cm, sp. lo ) ;
47
47
let name = #fmt ( "<%s:%u:%u>" , pos. file . name , pos. line , pos. col ) ;
48
48
ret ( name, fss_internal ( sp) ) ;
49
+ //ret (name, fss_external({filename: pos.file.name,
50
+ // line: pos.line, col: pos.col}));
49
51
}
50
52
51
53
fn next_line ( file : filemap , chpos : uint , byte_pos : uint ) {
@@ -92,26 +94,66 @@ fn lookup_byte_pos(map: codemap, pos: uint) -> loc {
92
94
ret lookup_pos( map, pos, lookup) ;
93
95
}
94
96
97
+ fn lookup_char_pos_adj ( map : codemap , pos : uint )
98
+ -> { filename : str , line : uint , col : uint , file : option < filemap > }
99
+ {
100
+ let loc = lookup_char_pos ( map, pos) ;
101
+ alt ( loc. file . substr ) {
102
+ fss_none {
103
+ { filename : loc. file . name , line : loc. line , col : loc. col ,
104
+ file : some ( loc. file ) }
105
+ }
106
+ fss_internal ( sp) {
107
+ lookup_char_pos_adj ( map, sp. lo + ( pos - loc. file . start_pos . ch ) )
108
+ }
109
+ fss_external ( eloc) {
110
+ { filename: eloc. filename ,
111
+ line: eloc. line + loc. line - 1 u,
112
+ col: if loc. line == 1 u { eloc. col + loc. col } else { loc. col } ,
113
+ file: none}
114
+ }
115
+ }
116
+ }
117
+
118
+ fn adjust_span ( map : codemap , sp : span ) -> span {
119
+ fn lookup ( pos : file_pos ) -> uint { ret pos. ch ; }
120
+ let line = lookup_line ( map, sp. lo , lookup) ;
121
+ alt ( line. fm . substr ) {
122
+ fss_none { sp}
123
+ fss_internal ( s) {
124
+ adjust_span ( map, { lo: s. lo + ( sp. lo - line. fm . start_pos . ch ) ,
125
+ hi: s. lo + ( sp. hi - line. fm . start_pos . ch ) ,
126
+ expn_info: sp. expn_info } ) }
127
+ fss_external ( _) { sp}
128
+ }
129
+ }
130
+
95
131
enum expn_info_ {
96
132
expanded_from( { call_site : span ,
97
133
callie: { name : str , span : option < span > } } )
98
134
}
99
135
type expn_info = option < @expn_info_ > ;
100
136
type span = { lo : uint , hi : uint , expn_info : expn_info } ;
101
137
102
- fn span_to_str ( sp : span , cm : codemap ) -> str {
138
+ fn span_to_str_no_adj ( sp : span , cm : codemap ) -> str {
103
139
let lo = lookup_char_pos ( cm, sp. lo ) ;
104
140
let hi = lookup_char_pos ( cm, sp. hi ) ;
105
141
ret #fmt( "%s:%u:%u: %u:%u" , lo. file . name ,
106
142
lo. line , lo. col , hi. line , hi. col )
107
143
}
108
144
145
+ fn span_to_str ( sp : span , cm : codemap ) -> str {
146
+ let lo = lookup_char_pos_adj ( cm, sp. lo ) ;
147
+ let hi = lookup_char_pos_adj ( cm, sp. hi ) ;
148
+ ret #fmt( "%s:%u:%u: %u:%u" , lo. filename ,
149
+ lo. line , lo. col , hi. line , hi. col )
150
+ }
151
+
109
152
type file_lines = { file : filemap , lines : [ uint ] } ;
110
153
111
154
fn span_to_lines ( sp : span , cm : codemap:: codemap ) -> @file_lines {
112
155
let lo = lookup_char_pos ( cm, sp. lo ) ;
113
156
let hi = lookup_char_pos ( cm, sp. hi ) ;
114
- // FIXME: Check for filemap?
115
157
let lines = [ ] ;
116
158
uint:: range ( lo. line - 1 u, hi. line as uint ) { |i| lines += [ i] ; } ;
117
159
ret @{ file : lo. file , lines : lines} ;
0 commit comments