@@ -33,7 +33,7 @@ pub struct MacroDef {
33
33
ext : SyntaxExtension
34
34
}
35
35
36
- pub type ItemDecorator = @fn ( @ExtCtxt ,
36
+ pub type ItemDecorator = @fn ( @ext_ctxt ,
37
37
span ,
38
38
@ast:: meta_item ,
39
39
~[ @ast:: item ] )
@@ -44,7 +44,7 @@ pub struct SyntaxExpanderTT {
44
44
span : Option < span >
45
45
}
46
46
47
- pub type SyntaxExpanderTTFun = @fn ( @ExtCtxt ,
47
+ pub type SyntaxExpanderTTFun = @fn ( @ext_ctxt ,
48
48
span ,
49
49
& [ ast:: token_tree ] )
50
50
-> MacResult ;
@@ -54,7 +54,7 @@ pub struct SyntaxExpanderTTItem {
54
54
span : Option < span >
55
55
}
56
56
57
- pub type SyntaxExpanderTTItemFun = @fn ( @ExtCtxt ,
57
+ pub type SyntaxExpanderTTItemFun = @fn ( @ext_ctxt ,
58
58
span ,
59
59
ast:: ident ,
60
60
~[ ast:: token_tree ] )
@@ -202,109 +202,134 @@ pub fn syntax_expander_table() -> SyntaxEnv {
202
202
// One of these is made during expansion and incrementally updated as we go;
203
203
// when a macro expansion occurs, the resulting nodes have the backtrace()
204
204
// -> expn_info of their expansion context stored into their span.
205
- pub struct ExtCtxt {
206
- parse_sess : @mut parse:: ParseSess ,
207
- cfg : ast:: crate_cfg ,
208
- backtrace : @mut Option < @ExpnInfo > ,
209
-
210
- // These two @mut's should really not be here,
211
- // but the self types for CtxtRepr are all wrong
212
- // and there are bugs in the code for object
213
- // types that make this hard to get right at the
214
- // moment. - nmatsakis
215
- mod_path : @mut ~[ ast:: ident ] ,
216
- trace_mac : @mut bool
205
+ pub trait ext_ctxt {
206
+ fn codemap ( & self ) -> @CodeMap ;
207
+ fn parse_sess ( & self ) -> @mut parse:: ParseSess ;
208
+ fn cfg ( & self ) -> ast:: crate_cfg ;
209
+ fn call_site ( & self ) -> span ;
210
+ fn print_backtrace ( & self ) ;
211
+ fn backtrace ( & self ) -> Option < @ExpnInfo > ;
212
+ fn mod_push ( & self , mod_name : ast:: ident ) ;
213
+ fn mod_pop ( & self ) ;
214
+ fn mod_path ( & self ) -> ~[ ast:: ident ] ;
215
+ fn bt_push ( & self , ei : codemap:: ExpnInfo ) ;
216
+ fn bt_pop ( & self ) ;
217
+ fn span_fatal ( & self , sp : span , msg : & str ) -> !;
218
+ fn span_err ( & self , sp : span , msg : & str ) ;
219
+ fn span_warn ( & self , sp : span , msg : & str ) ;
220
+ fn span_unimpl ( & self , sp : span , msg : & str ) -> !;
221
+ fn span_bug ( & self , sp : span , msg : & str ) -> !;
222
+ fn bug ( & self , msg : & str ) -> !;
223
+ fn next_id ( & self ) -> ast:: node_id ;
224
+ fn trace_macros ( & self ) -> bool ;
225
+ fn set_trace_macros ( & self , x : bool ) ;
226
+ /* for unhygienic identifier transformation */
227
+ fn str_of ( & self , id : ast:: ident ) -> ~str ;
228
+ fn ident_of ( & self , st : & str ) -> ast:: ident ;
217
229
}
218
230
219
- pub impl ExtCtxt {
220
- fn new ( parse_sess : @mut parse:: ParseSess , cfg : ast:: crate_cfg ) -> @ExtCtxt {
221
- @ExtCtxt {
222
- parse_sess : parse_sess,
223
- cfg : cfg,
224
- backtrace : @mut None ,
225
- mod_path : @mut ~[ ] ,
226
- trace_mac : @mut false
227
- }
228
- }
229
-
230
- fn codemap ( & self ) -> @CodeMap { self . parse_sess . cm }
231
- fn parse_sess ( & self ) -> @mut parse:: ParseSess { self . parse_sess }
232
- fn cfg ( & self ) -> ast:: crate_cfg { copy self . cfg }
233
- fn call_site ( & self ) -> span {
234
- match * self . backtrace {
235
- Some ( @ExpandedFrom ( CallInfo { call_site : cs, _} ) ) => cs,
236
- None => self . bug ( "missing top span" )
231
+ pub fn mk_ctxt ( parse_sess : @mut parse:: ParseSess , cfg : ast:: crate_cfg )
232
+ -> @ext_ctxt {
233
+ struct CtxtRepr {
234
+ parse_sess : @mut parse:: ParseSess ,
235
+ cfg : ast:: crate_cfg ,
236
+ backtrace : @mut Option < @ExpnInfo > ,
237
+
238
+ // These two @mut's should really not be here,
239
+ // but the self types for CtxtRepr are all wrong
240
+ // and there are bugs in the code for object
241
+ // types that make this hard to get right at the
242
+ // moment. - nmatsakis
243
+ mod_path : @mut ~[ ast:: ident ] ,
244
+ trace_mac : @mut bool
245
+ }
246
+ impl ext_ctxt for CtxtRepr {
247
+ fn codemap ( & self ) -> @CodeMap { self . parse_sess . cm }
248
+ fn parse_sess ( & self ) -> @mut parse:: ParseSess { self . parse_sess }
249
+ fn cfg ( & self ) -> ast:: crate_cfg { copy self . cfg }
250
+ fn call_site ( & self ) -> span {
251
+ match * self . backtrace {
252
+ Some ( @ExpandedFrom ( CallInfo { call_site : cs, _} ) ) => cs,
253
+ None => self . bug ( "missing top span" )
254
+ }
237
255
}
238
- }
239
- fn print_backtrace ( & self ) { }
240
- fn backtrace ( & self ) -> Option < @ExpnInfo > { * self . backtrace }
241
- fn mod_push ( & self , i : ast:: ident ) { self . mod_path . push ( i) ; }
242
- fn mod_pop ( & self ) { self . mod_path . pop ( ) ; }
243
- fn mod_path ( & self ) -> ~[ ast:: ident ] { copy * self . mod_path }
244
- fn bt_push ( & self , ei : codemap:: ExpnInfo ) {
245
- match ei {
246
- ExpandedFrom ( CallInfo { call_site : cs, callee : ref callee} ) => {
256
+ fn print_backtrace ( & self ) { }
257
+ fn backtrace ( & self ) -> Option < @ExpnInfo > { * self . backtrace }
258
+ fn mod_push ( & self , i : ast:: ident ) { self . mod_path . push ( i) ; }
259
+ fn mod_pop ( & self ) { self . mod_path . pop ( ) ; }
260
+ fn mod_path ( & self ) -> ~[ ast:: ident ] { copy * self . mod_path }
261
+ fn bt_push ( & self , ei : codemap:: ExpnInfo ) {
262
+ match ei {
263
+ ExpandedFrom ( CallInfo { call_site : cs, callee : ref callee} ) => {
247
264
* self . backtrace =
248
265
Some ( @ExpandedFrom ( CallInfo {
249
266
call_site : span { lo : cs. lo , hi : cs. hi ,
250
267
expn_info : * self . backtrace } ,
251
268
callee : copy * callee} ) ) ;
269
+ }
252
270
}
253
271
}
254
- }
255
- fn bt_pop ( & self ) {
256
- match * self . backtrace {
257
- Some ( @ExpandedFrom (
258
- CallInfo {
259
- call_site : span { expn_info : prev, _} , _
260
- } ) ) => {
272
+ fn bt_pop ( & self ) {
273
+ match * self . backtrace {
274
+ Some ( @ExpandedFrom ( CallInfo {
275
+ call_site : span { expn_info : prev, _} , _
276
+ } ) ) => {
261
277
* self . backtrace = prev
278
+ }
279
+ _ => self . bug ( "tried to pop without a push" )
262
280
}
263
- _ => self . bug ( "tried to pop without a push" )
281
+ }
282
+ fn span_fatal ( & self , sp : span , msg : & str ) -> ! {
283
+ self . print_backtrace ( ) ;
284
+ self . parse_sess . span_diagnostic . span_fatal ( sp, msg) ;
285
+ }
286
+ fn span_err ( & self , sp : span , msg : & str ) {
287
+ self . print_backtrace ( ) ;
288
+ self . parse_sess . span_diagnostic . span_err ( sp, msg) ;
289
+ }
290
+ fn span_warn ( & self , sp : span , msg : & str ) {
291
+ self . print_backtrace ( ) ;
292
+ self . parse_sess . span_diagnostic . span_warn ( sp, msg) ;
293
+ }
294
+ fn span_unimpl ( & self , sp : span , msg : & str ) -> ! {
295
+ self . print_backtrace ( ) ;
296
+ self . parse_sess . span_diagnostic . span_unimpl ( sp, msg) ;
297
+ }
298
+ fn span_bug ( & self , sp : span , msg : & str ) -> ! {
299
+ self . print_backtrace ( ) ;
300
+ self . parse_sess . span_diagnostic . span_bug ( sp, msg) ;
301
+ }
302
+ fn bug ( & self , msg : & str ) -> ! {
303
+ self . print_backtrace ( ) ;
304
+ self . parse_sess . span_diagnostic . handler ( ) . bug ( msg) ;
305
+ }
306
+ fn next_id ( & self ) -> ast:: node_id {
307
+ return parse:: next_node_id ( self . parse_sess ) ;
308
+ }
309
+ fn trace_macros ( & self ) -> bool {
310
+ * self . trace_mac
311
+ }
312
+ fn set_trace_macros ( & self , x : bool ) {
313
+ * self . trace_mac = x
314
+ }
315
+ fn str_of ( & self , id : ast:: ident ) -> ~str {
316
+ copy * self . parse_sess . interner . get ( id)
317
+ }
318
+ fn ident_of ( & self , st : & str ) -> ast:: ident {
319
+ self . parse_sess . interner . intern ( st)
264
320
}
265
321
}
266
- fn span_fatal ( & self , sp : span , msg : & str ) -> ! {
267
- self . print_backtrace ( ) ;
268
- self . parse_sess . span_diagnostic . span_fatal ( sp, msg) ;
269
- }
270
- fn span_err ( & self , sp : span , msg : & str ) {
271
- self . print_backtrace ( ) ;
272
- self . parse_sess . span_diagnostic . span_err ( sp, msg) ;
273
- }
274
- fn span_warn ( & self , sp : span , msg : & str ) {
275
- self . print_backtrace ( ) ;
276
- self . parse_sess . span_diagnostic . span_warn ( sp, msg) ;
277
- }
278
- fn span_unimpl ( & self , sp : span , msg : & str ) -> ! {
279
- self . print_backtrace ( ) ;
280
- self . parse_sess . span_diagnostic . span_unimpl ( sp, msg) ;
281
- }
282
- fn span_bug ( & self , sp : span , msg : & str ) -> ! {
283
- self . print_backtrace ( ) ;
284
- self . parse_sess . span_diagnostic . span_bug ( sp, msg) ;
285
- }
286
- fn bug ( & self , msg : & str ) -> ! {
287
- self . print_backtrace ( ) ;
288
- self . parse_sess . span_diagnostic . handler ( ) . bug ( msg) ;
289
- }
290
- fn next_id ( & self ) -> ast:: node_id {
291
- parse:: next_node_id ( self . parse_sess )
292
- }
293
- fn trace_macros ( & self ) -> bool {
294
- * self . trace_mac
295
- }
296
- fn set_trace_macros ( & self , x : bool ) {
297
- * self . trace_mac = x
298
- }
299
- fn str_of ( & self , id : ast:: ident ) -> ~str {
300
- copy * self . parse_sess . interner . get ( id)
301
- }
302
- fn ident_of ( & self , st : & str ) -> ast:: ident {
303
- self . parse_sess . interner . intern ( st)
304
- }
322
+ let imp: @CtxtRepr = @CtxtRepr {
323
+ parse_sess : parse_sess,
324
+ cfg : cfg,
325
+ backtrace : @mut None ,
326
+ mod_path : @mut ~[ ] ,
327
+ trace_mac : @mut false
328
+ } ;
329
+ ( ( imp) as @ext_ctxt )
305
330
}
306
331
307
- pub fn expr_to_str ( cx : @ExtCtxt , expr : @ast:: expr , err_msg : ~str ) -> ~str {
332
+ pub fn expr_to_str ( cx : @ext_ctxt , expr : @ast:: expr , err_msg : ~str ) -> ~str {
308
333
match expr. node {
309
334
ast:: expr_lit( l) => match l. node {
310
335
ast:: lit_str( s) => copy * s,
@@ -314,7 +339,7 @@ pub fn expr_to_str(cx: @ExtCtxt, expr: @ast::expr, err_msg: ~str) -> ~str {
314
339
}
315
340
}
316
341
317
- pub fn expr_to_ident ( cx : @ExtCtxt ,
342
+ pub fn expr_to_ident ( cx : @ext_ctxt ,
318
343
expr : @ast:: expr ,
319
344
err_msg : & str ) -> ast:: ident {
320
345
match expr. node {
@@ -328,14 +353,14 @@ pub fn expr_to_ident(cx: @ExtCtxt,
328
353
}
329
354
}
330
355
331
- pub fn check_zero_tts ( cx : @ExtCtxt , sp : span , tts : & [ ast:: token_tree ] ,
356
+ pub fn check_zero_tts ( cx : @ext_ctxt , sp : span , tts : & [ ast:: token_tree ] ,
332
357
name : & str ) {
333
358
if tts. len ( ) != 0 {
334
359
cx. span_fatal ( sp, fmt ! ( "%s takes no arguments" , name) ) ;
335
360
}
336
361
}
337
362
338
- pub fn get_single_str_from_tts ( cx : @ExtCtxt ,
363
+ pub fn get_single_str_from_tts ( cx : @ext_ctxt ,
339
364
sp : span ,
340
365
tts : & [ ast:: token_tree ] ,
341
366
name : & str ) -> ~str {
@@ -350,7 +375,7 @@ pub fn get_single_str_from_tts(cx: @ExtCtxt,
350
375
}
351
376
}
352
377
353
- pub fn get_exprs_from_tts ( cx : @ExtCtxt , tts : & [ ast:: token_tree ] )
378
+ pub fn get_exprs_from_tts ( cx : @ext_ctxt , tts : & [ ast:: token_tree ] )
354
379
-> ~[ @ast:: expr ] {
355
380
let p = parse:: new_parser_from_tts ( cx. parse_sess ( ) ,
356
381
cx. cfg ( ) ,
0 commit comments