@@ -111,24 +111,86 @@ fn pieces_to_expr(vec[piece] pieces, vec[@ast.expr] args) -> @ast.expr {
111
111
ret @rec( node=binexpr, span=sp) ;
112
112
}
113
113
114
- fn make_call ( common . span sp, vec[ ast. ident] fn_path ,
115
- vec[ @ast. expr] args) -> @ast . expr {
116
- let vec[ ast. ident ] path_idents = fn_path;
117
- let vec[ @ast. ty] path_types = vec ( ) ;
118
- auto path = rec ( idents = path_idents, types = path_types) ;
114
+ fn make_path_expr ( common . span sp, vec[ ast. ident] idents ) -> @ast . expr {
115
+ let vec[ @ast. ty] types = vec ( ) ;
116
+ auto path = rec ( idents=idents, types=types) ;
119
117
auto sp_path = rec ( node=path, span=sp) ;
120
118
auto pathexpr = ast. expr_path ( sp_path, none[ ast. def ] , ast. ann_none ) ;
121
119
auto sp_pathexpr = @rec ( node=pathexpr, span=sp) ;
122
- auto callexpr = ast. expr_call ( sp_pathexpr, args, ast. ann_none ) ;
120
+ ret sp_pathexpr;
121
+ }
122
+
123
+ fn make_call ( common . span sp, vec[ ast. ident] fn_path ,
124
+ vec[ @ast. expr] args) -> @ast . expr {
125
+ auto pathexpr = make_path_expr ( sp, fn_path) ;
126
+ auto callexpr = ast. expr_call ( pathexpr, args, ast. ann_none ) ;
123
127
auto sp_callexpr = @rec ( node=callexpr, span=sp) ;
124
128
ret sp_callexpr;
125
129
}
126
130
131
+ fn make_rec_expr( common . span sp,
132
+ vec[ tup( ast. ident, @ast. expr) ] fields ) -> @ast . expr {
133
+ let vec[ ast. field ] astfields = vec ( ) ;
134
+ for ( tup( ast. ident, @ast. expr) field in fields) {
135
+ auto ident = field. _0;
136
+ auto val = field. _1;
137
+ auto astfield = rec( mut = ast. imm,
138
+ ident = ident,
139
+ expr = val) ;
140
+ astfields += vec( astfield) ;
141
+ }
142
+
143
+ auto recexpr = ast. expr_rec( astfields,
144
+ option. none[ @ast. expr] ,
145
+ ast. ann_none) ;
146
+ auto sp_recexpr = @rec( node=recexpr, span=sp) ;
147
+ ret sp_recexpr;
148
+ }
149
+
150
+ fn make_path_vec( str ident) -> vec[ str] {
151
+ ret vec( "std" , "ExtFmt" , "RT" , ident) ;
152
+ }
153
+
154
+ fn make_rt_conv_expr( common. span sp, & conv cnv) -> @ast. expr {
155
+ fn make_ty( common. span sp, & ty t) -> @ast. expr {
156
+ auto rt_type;
157
+ alt ( t) {
158
+ case ( ty_hex( ?c) ) {
159
+ alt ( c) {
160
+ case ( case_upper) {
161
+ rt_type = "ty_hex_upper" ;
162
+ }
163
+ case ( case_lower) {
164
+ rt_type = "ty_hex_lower" ;
165
+ }
166
+ }
167
+ }
168
+ case ( ty_bits) {
169
+ rt_type = "ty_bits" ;
170
+ }
171
+ case ( _) {
172
+ rt_type = "ty_default" ;
173
+ }
174
+ }
175
+
176
+ auto idents = make_path_vec( rt_type) ;
177
+ ret make_path_expr( sp, idents) ;
178
+ }
179
+
180
+ fn make_conv_rec( common. span sp, & @ast. expr ty_expr) -> @ast. expr {
181
+ ret make_rec_expr( sp, vec( tup( "ty" , ty_expr) ) ) ;
182
+ }
183
+
184
+ auto rt_conv_ty = make_ty( sp, cnv. ty) ;
185
+ ret make_conv_rec( sp, rt_conv_ty) ;
186
+ }
187
+
127
188
fn make_conv_call( common. span sp, str conv_type,
128
- @ast. expr arg ) -> @ast . expr {
189
+ & conv cnv , @ast. expr arg) -> @ast. expr {
129
190
auto fname = "conv_" + conv_type;
130
- let vec[ str] path = vec ( "std" , "ExtFmt" , "RT" , fname) ;
131
- let vec[ @ast. expr] args = vec ( arg) ;
191
+ auto path = make_path_vec( fname) ;
192
+ auto cnv_expr = make_rt_conv_expr( sp, cnv) ;
193
+ auto args = vec( cnv_expr, arg) ;
132
194
ret make_call( arg. span, path, args) ;
133
195
}
134
196
@@ -175,18 +237,21 @@ fn pieces_to_expr(vec[piece] pieces, vec[@ast.expr] args) -> @ast.expr {
175
237
case ( ty_int( ?sign) ) {
176
238
alt ( sign) {
177
239
case ( signed) {
178
- ret make_conv_call ( arg. span , "int" , arg) ;
240
+ ret make_conv_call( arg. span, "int" , cnv , arg) ;
179
241
}
180
242
case ( unsigned) {
181
- ret make_conv_call ( arg. span , "uint" , arg) ;
243
+ ret make_conv_call( arg. span, "uint" , cnv , arg) ;
182
244
}
183
245
}
184
246
}
185
247
case ( ty_bool) {
186
- ret make_conv_call ( arg. span , "bool" , arg) ;
248
+ ret make_conv_call( arg. span, "bool" , cnv , arg) ;
187
249
}
188
250
case ( ty_char) {
189
- ret make_conv_call ( arg. span , "char" , arg) ;
251
+ ret make_conv_call( arg. span, "char" , cnv, arg) ;
252
+ }
253
+ case ( ty_hex( _) ) {
254
+ ret make_conv_call( arg. span, "uint" , cnv, arg) ;
190
255
}
191
256
case ( _) {
192
257
log unsupported;
0 commit comments