@@ -143,18 +143,6 @@ fn expand_ast(ecx: ext_ctxt, _sp: span,
143
143
}
144
144
}
145
145
let body = get_mac_body ( ecx, _sp, body) ;
146
- fn finish < T : qq_helper > ( ecx : ext_ctxt , body : ast:: mac_body_ ,
147
- f : fn ( p : parser ) -> T )
148
- -> @ast:: expr
149
- {
150
- let cm = ecx. session ( ) . parse_sess . cm ;
151
- let str = @codemap:: span_to_snippet ( body. span , cm) ;
152
- let ( fname, ss) = codemap:: get_substr_info ( cm, body. span ) ;
153
- let node = parse_from_source_str
154
- ( f, fname, ss, str,
155
- ecx. session ( ) . opts . cfg , ecx. session ( ) . parse_sess ) ;
156
- ret expand_qquote ( ecx, node. span ( ) , * str, node) ;
157
- }
158
146
159
147
ret alt what {
160
148
"expr" { finish ( ecx, body, parser:: parse_expr) }
@@ -181,10 +169,19 @@ fn parse_item(p: parser) -> @ast::item {
181
169
}
182
170
}
183
171
184
- fn expand_qquote < N : qq_helper >
185
- ( ecx : ext_ctxt , sp : span , str : str , node : N )
172
+ fn finish < T : qq_helper >
173
+ ( ecx : ext_ctxt , body : ast :: mac_body_ , f : fn ( p : parser ) -> T )
186
174
-> @ast:: expr
187
175
{
176
+ let cm = ecx. session ( ) . parse_sess . cm ;
177
+ let str = @codemap:: span_to_snippet ( body. span , cm) ;
178
+ let fname = codemap:: mk_substr_filename ( cm, body. span ) ;
179
+ let node = parse_from_source_str
180
+ ( f, fname, codemap:: fss_internal ( body. span ) , str,
181
+ ecx. session ( ) . opts . cfg , ecx. session ( ) . parse_sess ) ;
182
+ let loc = codemap:: lookup_char_pos ( cm, body. span . lo ) ;
183
+
184
+ let sp = node. span ( ) ;
188
185
let qcx = gather_anti_quotes ( sp. lo , node) ;
189
186
let cx = qcx;
190
187
let prev = 0 u;
@@ -197,7 +194,7 @@ fn expand_qquote<N: qq_helper>
197
194
let state = active;
198
195
let i = 0 u, j = 0 u;
199
196
let g_len = vec:: len ( cx. gather ) ;
200
- str:: chars_iter ( str) { |ch|
197
+ str:: chars_iter ( * str) { |ch|
201
198
if ( j < g_len && i == cx. gather [ j] . lo ) {
202
199
assert ch == '$' ;
203
200
let repl = #fmt ( "$%u " , j) ;
@@ -227,8 +224,12 @@ fn expand_qquote<N: qq_helper>
227
224
[ "syntax" , "parse" , "parser" ,
228
225
"parse_from_source_str" ] ,
229
226
[ node. mk_parse_fn ( cx, sp) ,
230
- mk_str ( cx, sp, "<anon>" ) ,
231
- mk_path ( cx, sp, [ "syntax" , "codemap" , "fss_none" ] ) ,
227
+ mk_str ( cx, sp, fname) ,
228
+ mk_call ( cx, sp,
229
+ [ "syntax" , "ext" , "qquote" , "mk_file_substr" ] ,
230
+ [ mk_str ( cx, sp, loc. file . name ) ,
231
+ mk_uint ( cx, sp, loc. line ) ,
232
+ mk_uint ( cx, sp, loc. col ) ] ) ,
232
233
mk_unary ( cx, sp, ast:: box ( ast:: imm) ,
233
234
mk_str ( cx, sp, str2) ) ,
234
235
mk_access_ ( cx, sp,
@@ -305,6 +306,10 @@ fn print_expr(expr: @ast::expr) {
305
306
stdout. write_str ( "\n " ) ;
306
307
}
307
308
309
+ fn mk_file_substr ( fname : str , line : uint , col : uint ) -> codemap:: file_substr {
310
+ codemap:: fss_external ( { filename: fname, line: line, col: col} )
311
+ }
312
+
308
313
// Local Variables:
309
314
// mode: rust
310
315
// fill-column: 78;
0 commit comments