4
4
* compiler syntax extension plugin interface.
5
5
*/
6
6
7
+ import front. parser . parser ;
7
8
import util. common ;
8
9
9
10
import std. Str ;
@@ -45,11 +46,12 @@ import std.ExtFmt.CT.parse_fmt_string;
45
46
46
47
export expand_syntax_ext;
47
48
48
- // FIXME: Need to thread parser through here to handle errors correctly
49
- fn expand_syntax_ext ( vec[ @ast. expr] args,
49
+ fn expand_syntax_ext ( parser p ,
50
+ vec[ @ast. expr] args,
50
51
Option . t[ str] body ) -> @ast . expr {
51
52
52
53
if ( Vec . len [ @ast. expr ] ( args) == 0 u) {
54
+ // FIXME: Handle error correctly.
53
55
log_err "malformed #fmt call" ;
54
56
fail;
55
57
}
@@ -62,7 +64,7 @@ fn expand_syntax_ext(vec[@ast.expr] args,
62
64
auto pieces = parse_fmt_string ( fmt) ;
63
65
auto args_len = Vec . len [ @ast. expr ] ( args) ;
64
66
auto fmt_args = Vec . slice [ @ast. expr ] ( args, 1 u, args_len - 1 u) ;
65
- ret pieces_to_expr ( pieces, args) ;
67
+ ret pieces_to_expr ( p , pieces, args) ;
66
68
}
67
69
68
70
fn expr_to_str ( @ast . expr expr) -> str {
@@ -75,6 +77,7 @@ fn expr_to_str(@ast.expr expr) -> str {
75
77
}
76
78
}
77
79
}
80
+ // FIXME: Handle error correctly.
78
81
log_err "malformed #fmt call" ;
79
82
fail;
80
83
}
@@ -83,59 +86,62 @@ fn expr_to_str(@ast.expr expr) -> str {
83
86
// be factored out in common with other code that builds expressions.
84
87
// FIXME: Probably should be using the parser's span functions
85
88
// FIXME: Cleanup the naming of these functions
86
- fn pieces_to_expr( vec[ piece] pieces , vec[ @ast. expr] args) -> @ast . expr {
89
+ fn pieces_to_expr( parser p, vec[ piece] pieces , vec[ @ast. expr] args)
90
+ -> @ast . expr {
87
91
88
- fn make_new_lit ( common . span sp, ast. lit_ lit ) -> @ast . expr {
92
+ fn make_new_lit ( parser p , common . span sp, ast. lit_ lit ) -> @ast . expr {
89
93
auto sp_lit = @rec ( node=lit, span=sp) ;
90
- auto expr = ast. expr_lit ( sp_lit, ast . ann_none ) ;
94
+ auto expr = ast. expr_lit ( sp_lit, p . get_ann ( ) ) ;
91
95
ret @rec( node=expr, span=sp) ;
92
96
}
93
97
94
- fn make_new_str ( common . span sp, str s) -> @ast . expr {
98
+ fn make_new_str ( parser p , common . span sp, str s) -> @ast . expr {
95
99
auto lit = ast. lit_str ( s) ;
96
- ret make_new_lit ( sp, lit) ;
100
+ ret make_new_lit ( p , sp, lit) ;
97
101
}
98
102
99
- fn make_new_int ( common . span sp, int i) -> @ast . expr {
103
+ fn make_new_int ( parser p , common . span sp, int i) -> @ast . expr {
100
104
auto lit = ast. lit_int ( i) ;
101
- ret make_new_lit ( sp, lit) ;
105
+ ret make_new_lit ( p , sp, lit) ;
102
106
}
103
107
104
- fn make_new_uint ( common . span sp, uint u) -> @ast . expr {
108
+ fn make_new_uint ( parser p , common . span sp, uint u) -> @ast . expr {
105
109
auto lit = ast. lit_uint ( u) ;
106
- ret make_new_lit ( sp, lit) ;
110
+ ret make_new_lit ( p , sp, lit) ;
107
111
}
108
112
109
- fn make_add_expr ( common . span sp,
113
+ fn make_add_expr ( parser p , common . span sp,
110
114
@ast. expr lhs , @ast. expr rhs ) -> @ast . expr {
111
- auto binexpr = ast. expr_binary ( ast. add , lhs, rhs, ast . ann_none ) ;
115
+ auto binexpr = ast. expr_binary ( ast. add , lhs, rhs, p . get_ann ( ) ) ;
112
116
ret @rec( node=binexpr, span=sp) ;
113
117
}
114
118
115
- fn make_path_expr ( common . span sp, vec[ ast. ident] idents ) -> @ast . expr {
119
+ fn make_path_expr ( parser p, common . span sp, vec[ ast. ident] idents )
120
+ -> @ast . expr {
116
121
let vec[ @ast. ty] types = vec ( ) ;
117
122
auto path = rec ( idents=idents, types=types) ;
118
123
auto sp_path = rec ( node=path, span=sp) ;
119
- auto pathexpr = ast. expr_path ( sp_path, none[ ast. def ] , ast . ann_none ) ;
124
+ auto pathexpr = ast. expr_path ( sp_path, none[ ast. def ] , p . get_ann ( ) ) ;
120
125
auto sp_pathexpr = @rec ( node=pathexpr, span=sp) ;
121
126
ret sp_pathexpr;
122
127
}
123
128
124
- fn make_vec_expr ( common . span sp, vec[ @ast. expr] exprs) -> @ast . expr {
125
- auto vecexpr = ast. expr_vec ( exprs, ast. imm , ast. ann_none ) ;
129
+ fn make_vec_expr ( parser p, common . span sp, vec[ @ast. expr] exprs)
130
+ -> @ast . expr {
131
+ auto vecexpr = ast. expr_vec ( exprs, ast. imm , p. get_ann ( ) ) ;
126
132
auto sp_vecexpr = @rec ( node=vecexpr, span=sp) ;
127
133
ret sp_vecexpr;
128
134
}
129
135
130
- fn make_call ( common . span sp, vec[ ast. ident] fn_path ,
136
+ fn make_call ( parser p , common . span sp, vec[ ast. ident] fn_path ,
131
137
vec[ @ast. expr] args) -> @ast . expr {
132
- auto pathexpr = make_path_expr ( sp, fn_path) ;
133
- auto callexpr = ast. expr_call ( pathexpr, args, ast . ann_none ) ;
138
+ auto pathexpr = make_path_expr ( p , sp, fn_path) ;
139
+ auto callexpr = ast. expr_call ( pathexpr, args, p . get_ann ( ) ) ;
134
140
auto sp_callexpr = @rec ( node=callexpr, span=sp) ;
135
141
ret sp_callexpr;
136
142
}
137
143
138
- fn make_rec_expr( common . span sp,
144
+ fn make_rec_expr( parser p , common . span sp,
139
145
vec[ tup( ast. ident, @ast. expr) ] fields ) -> @ast . expr {
140
146
let vec[ ast. field ] astfields = vec ( ) ;
141
147
for ( tup( ast. ident, @ast. expr) field in fields) {
@@ -149,7 +155,7 @@ fn pieces_to_expr(vec[piece] pieces, vec[@ast.expr] args) -> @ast.expr {
149
155
150
156
auto recexpr = ast. expr_rec( astfields,
151
157
Option . none[ @ast. expr] ,
152
- ast . ann_none ) ;
158
+ p . get_ann ( ) ) ;
153
159
auto sp_recexpr = @rec( node=recexpr, span=sp) ;
154
160
ret sp_recexpr;
155
161
}
@@ -160,16 +166,17 @@ fn pieces_to_expr(vec[piece] pieces, vec[@ast.expr] args) -> @ast.expr {
160
166
ret vec( "std" , "ExtFmt" , "RT" , ident) ;
161
167
}
162
168
163
- fn make_rt_path_expr( common. span sp, str ident) -> @ast. expr {
169
+ fn make_rt_path_expr( parser p , common. span sp, str ident) -> @ast. expr {
164
170
auto path = make_path_vec( ident) ;
165
- ret make_path_expr( sp, path) ;
171
+ ret make_path_expr( p , sp, path) ;
166
172
}
167
173
168
174
// Produces an AST expression that represents a RT.conv record,
169
175
// which tells the RT.conv* functions how to perform the conversion
170
- fn make_rt_conv_expr( common. span sp, & conv cnv) -> @ast. expr {
176
+ fn make_rt_conv_expr( parser p , common. span sp, & conv cnv) -> @ast. expr {
171
177
172
- fn make_flags( common. span sp, vec[ flag] flags) -> @ast. expr {
178
+ fn make_flags( parser p, common. span sp, vec[ flag] flags)
179
+ -> @ast. expr {
173
180
let vec[ @ast. expr] flagexprs = vec( ) ;
174
181
for ( flag f in flags) {
175
182
auto fstr;
@@ -190,29 +197,29 @@ fn pieces_to_expr(vec[piece] pieces, vec[@ast.expr] args) -> @ast.expr {
190
197
fstr = "flag_alternate" ;
191
198
}
192
199
}
193
- flagexprs += vec( make_rt_path_expr( sp, fstr) ) ;
200
+ flagexprs += vec( make_rt_path_expr( p , sp, fstr) ) ;
194
201
}
195
202
196
203
// FIXME: 0-length vectors can't have their type inferred
197
204
// through the rec that these flags are a member of, so
198
205
// this is a hack placeholder flag
199
206
if ( Vec . len[ @ast. expr] ( flagexprs) == 0 u) {
200
- flagexprs += vec( make_rt_path_expr( sp, "flag_none" ) ) ;
207
+ flagexprs += vec( make_rt_path_expr( p , sp, "flag_none" ) ) ;
201
208
}
202
209
203
- ret make_vec_expr( sp, flagexprs) ;
210
+ ret make_vec_expr( p , sp, flagexprs) ;
204
211
}
205
212
206
- fn make_count( common. span sp, & count cnt) -> @ast. expr {
213
+ fn make_count( parser p , common. span sp, & count cnt) -> @ast. expr {
207
214
alt ( cnt) {
208
215
case ( count_implied) {
209
- ret make_rt_path_expr( sp, "count_implied" ) ;
216
+ ret make_rt_path_expr( p , sp, "count_implied" ) ;
210
217
}
211
218
case ( count_is( ?c) ) {
212
- auto count_lit = make_new_int( sp, c) ;
219
+ auto count_lit = make_new_int( p , sp, c) ;
213
220
auto count_is_path = make_path_vec( "count_is" ) ;
214
221
auto count_is_args = vec( count_lit) ;
215
- ret make_call( sp, count_is_path, count_is_args) ;
222
+ ret make_call( p , sp, count_is_path, count_is_args) ;
216
223
}
217
224
case ( _) {
218
225
log_err "not implemented" ;
@@ -221,7 +228,7 @@ fn pieces_to_expr(vec[piece] pieces, vec[@ast.expr] args) -> @ast.expr {
221
228
}
222
229
}
223
230
224
- fn make_ty( common. span sp, & ty t) -> @ast. expr {
231
+ fn make_ty( parser p , common. span sp, & ty t) -> @ast. expr {
225
232
auto rt_type;
226
233
alt ( t) {
227
234
case ( ty_hex( ?c) ) {
@@ -245,41 +252,43 @@ fn pieces_to_expr(vec[piece] pieces, vec[@ast.expr] args) -> @ast.expr {
245
252
}
246
253
}
247
254
248
- ret make_rt_path_expr( sp, rt_type) ;
255
+ ret make_rt_path_expr( p , sp, rt_type) ;
249
256
}
250
257
251
- fn make_conv_rec( common. span sp,
258
+ fn make_conv_rec( parser p,
259
+ common. span sp,
252
260
@ast. expr flags_expr,
253
261
@ast. expr width_expr,
254
262
@ast. expr precision_expr,
255
263
@ast. expr ty_expr) -> @ast. expr {
256
- ret make_rec_expr( sp, vec( tup( "flags" , flags_expr) ,
257
- tup( "width" , width_expr) ,
258
- tup( "precision" , precision_expr) ,
259
- tup( "ty" , ty_expr) ) ) ;
264
+ ret make_rec_expr( p , sp, vec( tup( "flags" , flags_expr) ,
265
+ tup( "width" , width_expr) ,
266
+ tup( "precision" , precision_expr) ,
267
+ tup( "ty" , ty_expr) ) ) ;
260
268
}
261
269
262
- auto rt_conv_flags = make_flags( sp, cnv. flags) ;
263
- auto rt_conv_width = make_count( sp, cnv. width) ;
264
- auto rt_conv_precision = make_count( sp, cnv. precision) ;
265
- auto rt_conv_ty = make_ty( sp, cnv. ty) ;
266
- ret make_conv_rec( sp,
270
+ auto rt_conv_flags = make_flags( p, sp, cnv. flags) ;
271
+ auto rt_conv_width = make_count( p, sp, cnv. width) ;
272
+ auto rt_conv_precision = make_count( p, sp, cnv. precision) ;
273
+ auto rt_conv_ty = make_ty( p, sp, cnv. ty) ;
274
+ ret make_conv_rec( p,
275
+ sp,
267
276
rt_conv_flags,
268
277
rt_conv_width,
269
278
rt_conv_precision,
270
279
rt_conv_ty) ;
271
280
}
272
281
273
- fn make_conv_call( common. span sp, str conv_type,
282
+ fn make_conv_call( parser p , common. span sp, str conv_type,
274
283
& conv cnv, @ast. expr arg) -> @ast. expr {
275
284
auto fname = "conv_" + conv_type;
276
285
auto path = make_path_vec( fname) ;
277
- auto cnv_expr = make_rt_conv_expr( sp, cnv) ;
286
+ auto cnv_expr = make_rt_conv_expr( p , sp, cnv) ;
278
287
auto args = vec( cnv_expr, arg) ;
279
- ret make_call( arg. span, path, args) ;
288
+ ret make_call( p , arg. span, path, args) ;
280
289
}
281
290
282
- fn make_new_conv( conv cnv, @ast. expr arg) -> @ast. expr {
291
+ fn make_new_conv( parser p , conv cnv, @ast. expr arg) -> @ast. expr {
283
292
284
293
// FIXME: Extract all this validation into ExtFmt.CT
285
294
fn is_signed_type( conv cnv) -> bool {
@@ -361,32 +370,32 @@ fn pieces_to_expr(vec[piece] pieces, vec[@ast.expr] args) -> @ast.expr {
361
370
362
371
alt ( cnv. ty) {
363
372
case ( ty_str) {
364
- ret make_conv_call( arg. span, "str" , cnv, arg) ;
373
+ ret make_conv_call( p , arg. span, "str" , cnv, arg) ;
365
374
}
366
375
case ( ty_int( ?sign) ) {
367
376
alt ( sign) {
368
377
case ( signed) {
369
- ret make_conv_call( arg. span, "int" , cnv, arg) ;
378
+ ret make_conv_call( p , arg. span, "int" , cnv, arg) ;
370
379
}
371
380
case ( unsigned) {
372
- ret make_conv_call( arg. span, "uint" , cnv, arg) ;
381
+ ret make_conv_call( p , arg. span, "uint" , cnv, arg) ;
373
382
}
374
383
}
375
384
}
376
385
case ( ty_bool) {
377
- ret make_conv_call( arg. span, "bool" , cnv, arg) ;
386
+ ret make_conv_call( p , arg. span, "bool" , cnv, arg) ;
378
387
}
379
388
case ( ty_char) {
380
- ret make_conv_call( arg. span, "char" , cnv, arg) ;
389
+ ret make_conv_call( p , arg. span, "char" , cnv, arg) ;
381
390
}
382
391
case ( ty_hex( _) ) {
383
- ret make_conv_call( arg. span, "uint" , cnv, arg) ;
392
+ ret make_conv_call( p , arg. span, "uint" , cnv, arg) ;
384
393
}
385
394
case ( ty_bits) {
386
- ret make_conv_call( arg. span, "uint" , cnv, arg) ;
395
+ ret make_conv_call( p , arg. span, "uint" , cnv, arg) ;
387
396
}
388
397
case ( ty_octal) {
389
- ret make_conv_call( arg. span, "uint" , cnv, arg) ;
398
+ ret make_conv_call( p , arg. span, "uint" , cnv, arg) ;
390
399
}
391
400
case ( _) {
392
401
log_err unsupported;
@@ -489,13 +498,13 @@ fn pieces_to_expr(vec[piece] pieces, vec[@ast.expr] args) -> @ast.expr {
489
498
490
499
auto sp = args. ( 0 ) . span;
491
500
auto n = 0 u;
492
- auto tmp_expr = make_new_str( sp, "" ) ;
501
+ auto tmp_expr = make_new_str( p , sp, "" ) ;
493
502
494
- for ( piece p in pieces) {
495
- alt ( p ) {
503
+ for ( piece pc in pieces) {
504
+ alt ( pc ) {
496
505
case ( piece_string( ?s) ) {
497
- auto s_expr = make_new_str( sp, s) ;
498
- tmp_expr = make_add_expr( sp, tmp_expr, s_expr) ;
506
+ auto s_expr = make_new_str( p , sp, s) ;
507
+ tmp_expr = make_add_expr( p , sp, tmp_expr, s_expr) ;
499
508
}
500
509
case ( piece_conv( ?conv) ) {
501
510
if ( n >= Vec . len[ @ast. expr] ( args) ) {
@@ -509,8 +518,8 @@ fn pieces_to_expr(vec[piece] pieces, vec[@ast.expr] args) -> @ast.expr {
509
518
510
519
n += 1 u;
511
520
auto arg_expr = args. ( n) ;
512
- auto c_expr = make_new_conv( conv, arg_expr) ;
513
- tmp_expr = make_add_expr( sp, tmp_expr, c_expr) ;
521
+ auto c_expr = make_new_conv( p , conv, arg_expr) ;
522
+ tmp_expr = make_add_expr( p , sp, tmp_expr, c_expr) ;
514
523
}
515
524
}
516
525
}
0 commit comments