Skip to content

Commit 6818b96

Browse files
committed
extra: json::Encoder should take a &mut io::Writer
1 parent f7b739c commit 6818b96

File tree

3 files changed

+62
-61
lines changed

3 files changed

+62
-61
lines changed

src/libextra/json.rs

+50-50
Original file line numberDiff line numberDiff line change
@@ -84,19 +84,19 @@ fn spaces(n: uint) -> ~str {
8484
}
8585

8686
/// A structure for implementing serialization to JSON.
87-
pub struct Encoder {
88-
priv wr: @mut io::Writer,
87+
pub struct Encoder<'self> {
88+
priv wr: &'self mut io::Writer,
8989
}
9090

91-
impl Encoder {
91+
impl<'self> Encoder<'self> {
9292
/// Creates a new JSON encoder whose output will be written to the writer
9393
/// specified.
94-
pub fn init(wr: @mut io::Writer) -> Encoder {
94+
pub fn init<'a>(wr: &'a mut io::Writer) -> Encoder<'a> {
9595
Encoder { wr: wr }
9696
}
9797
}
9898

99-
impl serialize::Encoder for Encoder {
99+
impl<'self> serialize::Encoder for Encoder<'self> {
100100
fn emit_nil(&mut self) { write!(self.wr, "null") }
101101

102102
fn emit_uint(&mut self, v: uint) { self.emit_f64(v as f64); }
@@ -129,13 +129,13 @@ impl serialize::Encoder for Encoder {
129129
write!(self.wr, "{}", escape_str(v))
130130
}
131131

132-
fn emit_enum(&mut self, _name: &str, f: |&mut Encoder|) { f(self) }
132+
fn emit_enum(&mut self, _name: &str, f: |&mut Encoder<'self>|) { f(self) }
133133

134134
fn emit_enum_variant(&mut self,
135135
name: &str,
136136
_id: uint,
137137
cnt: uint,
138-
f: |&mut Encoder|) {
138+
f: |&mut Encoder<'self>|) {
139139
// enums are encoded as strings or objects
140140
// Bunny => "Bunny"
141141
// Kangaroo(34,"William") => {"variant": "Kangaroo", "fields": [34,"William"]}
@@ -150,7 +150,7 @@ impl serialize::Encoder for Encoder {
150150
}
151151
}
152152

153-
fn emit_enum_variant_arg(&mut self, idx: uint, f: |&mut Encoder|) {
153+
fn emit_enum_variant_arg(&mut self, idx: uint, f: |&mut Encoder<'self>|) {
154154
if idx != 0 {
155155
write!(self.wr, ",");
156156
}
@@ -161,18 +161,18 @@ impl serialize::Encoder for Encoder {
161161
name: &str,
162162
id: uint,
163163
cnt: uint,
164-
f: |&mut Encoder|) {
164+
f: |&mut Encoder<'self>|) {
165165
self.emit_enum_variant(name, id, cnt, f)
166166
}
167167

168168
fn emit_enum_struct_variant_field(&mut self,
169169
_: &str,
170170
idx: uint,
171-
f: |&mut Encoder|) {
171+
f: |&mut Encoder<'self>|) {
172172
self.emit_enum_variant_arg(idx, f)
173173
}
174174

175-
fn emit_struct(&mut self, _: &str, _: uint, f: |&mut Encoder|) {
175+
fn emit_struct(&mut self, _: &str, _: uint, f: |&mut Encoder<'self>|) {
176176
write!(self.wr, r"\{");
177177
f(self);
178178
write!(self.wr, r"\}");
@@ -181,81 +181,81 @@ impl serialize::Encoder for Encoder {
181181
fn emit_struct_field(&mut self,
182182
name: &str,
183183
idx: uint,
184-
f: |&mut Encoder|) {
184+
f: |&mut Encoder<'self>|) {
185185
if idx != 0 { write!(self.wr, ",") }
186186
write!(self.wr, "{}:", escape_str(name));
187187
f(self);
188188
}
189189

190-
fn emit_tuple(&mut self, len: uint, f: |&mut Encoder|) {
190+
fn emit_tuple(&mut self, len: uint, f: |&mut Encoder<'self>|) {
191191
self.emit_seq(len, f)
192192
}
193-
fn emit_tuple_arg(&mut self, idx: uint, f: |&mut Encoder|) {
193+
fn emit_tuple_arg(&mut self, idx: uint, f: |&mut Encoder<'self>|) {
194194
self.emit_seq_elt(idx, f)
195195
}
196196

197197
fn emit_tuple_struct(&mut self,
198198
_name: &str,
199199
len: uint,
200-
f: |&mut Encoder|) {
200+
f: |&mut Encoder<'self>|) {
201201
self.emit_seq(len, f)
202202
}
203-
fn emit_tuple_struct_arg(&mut self, idx: uint, f: |&mut Encoder|) {
203+
fn emit_tuple_struct_arg(&mut self, idx: uint, f: |&mut Encoder<'self>|) {
204204
self.emit_seq_elt(idx, f)
205205
}
206206

207-
fn emit_option(&mut self, f: |&mut Encoder|) { f(self); }
207+
fn emit_option(&mut self, f: |&mut Encoder<'self>|) { f(self); }
208208
fn emit_option_none(&mut self) { self.emit_nil(); }
209-
fn emit_option_some(&mut self, f: |&mut Encoder|) { f(self); }
209+
fn emit_option_some(&mut self, f: |&mut Encoder<'self>|) { f(self); }
210210

211-
fn emit_seq(&mut self, _len: uint, f: |&mut Encoder|) {
211+
fn emit_seq(&mut self, _len: uint, f: |&mut Encoder<'self>|) {
212212
write!(self.wr, "[");
213213
f(self);
214214
write!(self.wr, "]");
215215
}
216216

217-
fn emit_seq_elt(&mut self, idx: uint, f: |&mut Encoder|) {
217+
fn emit_seq_elt(&mut self, idx: uint, f: |&mut Encoder<'self>|) {
218218
if idx != 0 {
219219
write!(self.wr, ",");
220220
}
221221
f(self)
222222
}
223223

224-
fn emit_map(&mut self, _len: uint, f: |&mut Encoder|) {
224+
fn emit_map(&mut self, _len: uint, f: |&mut Encoder<'self>|) {
225225
write!(self.wr, r"\{");
226226
f(self);
227227
write!(self.wr, r"\}");
228228
}
229229

230-
fn emit_map_elt_key(&mut self, idx: uint, f: |&mut Encoder|) {
230+
fn emit_map_elt_key(&mut self, idx: uint, f: |&mut Encoder<'self>|) {
231231
if idx != 0 { write!(self.wr, ",") }
232232
f(self)
233233
}
234234

235-
fn emit_map_elt_val(&mut self, _idx: uint, f: |&mut Encoder|) {
235+
fn emit_map_elt_val(&mut self, _idx: uint, f: |&mut Encoder<'self>|) {
236236
write!(self.wr, ":");
237237
f(self)
238238
}
239239
}
240240

241241
/// Another encoder for JSON, but prints out human-readable JSON instead of
242242
/// compact data
243-
pub struct PrettyEncoder {
244-
priv wr: @mut io::Writer,
243+
pub struct PrettyEncoder<'self> {
244+
priv wr: &'self mut io::Writer,
245245
priv indent: uint,
246246
}
247247

248-
impl PrettyEncoder {
248+
impl<'self> PrettyEncoder<'self> {
249249
/// Creates a new encoder whose output will be written to the specified writer
250-
pub fn init(wr: @mut io::Writer) -> PrettyEncoder {
250+
pub fn init<'a>(wr: &'a mut io::Writer) -> PrettyEncoder<'a> {
251251
PrettyEncoder {
252252
wr: wr,
253253
indent: 0,
254254
}
255255
}
256256
}
257257

258-
impl serialize::Encoder for PrettyEncoder {
258+
impl<'self> serialize::Encoder for PrettyEncoder<'self> {
259259
fn emit_nil(&mut self) { write!(self.wr, "null") }
260260

261261
fn emit_uint(&mut self, v: uint) { self.emit_f64(v as f64); }
@@ -286,15 +286,15 @@ impl serialize::Encoder for PrettyEncoder {
286286
fn emit_char(&mut self, v: char) { self.emit_str(str::from_char(v)) }
287287
fn emit_str(&mut self, v: &str) { write!(self.wr, "{}", escape_str(v)); }
288288

289-
fn emit_enum(&mut self, _name: &str, f: |&mut PrettyEncoder|) {
289+
fn emit_enum(&mut self, _name: &str, f: |&mut PrettyEncoder<'self>|) {
290290
f(self)
291291
}
292292

293293
fn emit_enum_variant(&mut self,
294294
name: &str,
295295
_: uint,
296296
cnt: uint,
297-
f: |&mut PrettyEncoder|) {
297+
f: |&mut PrettyEncoder<'self>|) {
298298
if cnt == 0 {
299299
write!(self.wr, "{}", escape_str(name));
300300
} else {
@@ -308,7 +308,7 @@ impl serialize::Encoder for PrettyEncoder {
308308

309309
fn emit_enum_variant_arg(&mut self,
310310
idx: uint,
311-
f: |&mut PrettyEncoder|) {
311+
f: |&mut PrettyEncoder<'self>|) {
312312
if idx != 0 {
313313
write!(self.wr, ",\n");
314314
}
@@ -320,22 +320,22 @@ impl serialize::Encoder for PrettyEncoder {
320320
name: &str,
321321
id: uint,
322322
cnt: uint,
323-
f: |&mut PrettyEncoder|) {
323+
f: |&mut PrettyEncoder<'self>|) {
324324
self.emit_enum_variant(name, id, cnt, f)
325325
}
326326

327327
fn emit_enum_struct_variant_field(&mut self,
328328
_: &str,
329329
idx: uint,
330-
f: |&mut PrettyEncoder|) {
330+
f: |&mut PrettyEncoder<'self>|) {
331331
self.emit_enum_variant_arg(idx, f)
332332
}
333333

334334

335335
fn emit_struct(&mut self,
336336
_: &str,
337337
len: uint,
338-
f: |&mut PrettyEncoder|) {
338+
f: |&mut PrettyEncoder<'self>|) {
339339
if len == 0 {
340340
write!(self.wr, "\\{\\}");
341341
} else {
@@ -350,7 +350,7 @@ impl serialize::Encoder for PrettyEncoder {
350350
fn emit_struct_field(&mut self,
351351
name: &str,
352352
idx: uint,
353-
f: |&mut PrettyEncoder|) {
353+
f: |&mut PrettyEncoder<'self>|) {
354354
if idx == 0 {
355355
write!(self.wr, "\n");
356356
} else {
@@ -360,30 +360,30 @@ impl serialize::Encoder for PrettyEncoder {
360360
f(self);
361361
}
362362

363-
fn emit_tuple(&mut self, len: uint, f: |&mut PrettyEncoder|) {
363+
fn emit_tuple(&mut self, len: uint, f: |&mut PrettyEncoder<'self>|) {
364364
self.emit_seq(len, f)
365365
}
366-
fn emit_tuple_arg(&mut self, idx: uint, f: |&mut PrettyEncoder|) {
366+
fn emit_tuple_arg(&mut self, idx: uint, f: |&mut PrettyEncoder<'self>|) {
367367
self.emit_seq_elt(idx, f)
368368
}
369369

370370
fn emit_tuple_struct(&mut self,
371371
_: &str,
372372
len: uint,
373-
f: |&mut PrettyEncoder|) {
373+
f: |&mut PrettyEncoder<'self>|) {
374374
self.emit_seq(len, f)
375375
}
376376
fn emit_tuple_struct_arg(&mut self,
377377
idx: uint,
378-
f: |&mut PrettyEncoder|) {
378+
f: |&mut PrettyEncoder<'self>|) {
379379
self.emit_seq_elt(idx, f)
380380
}
381381

382-
fn emit_option(&mut self, f: |&mut PrettyEncoder|) { f(self); }
382+
fn emit_option(&mut self, f: |&mut PrettyEncoder<'self>|) { f(self); }
383383
fn emit_option_none(&mut self) { self.emit_nil(); }
384-
fn emit_option_some(&mut self, f: |&mut PrettyEncoder|) { f(self); }
384+
fn emit_option_some(&mut self, f: |&mut PrettyEncoder<'self>|) { f(self); }
385385

386-
fn emit_seq(&mut self, len: uint, f: |&mut PrettyEncoder|) {
386+
fn emit_seq(&mut self, len: uint, f: |&mut PrettyEncoder<'self>|) {
387387
if len == 0 {
388388
write!(self.wr, "[]");
389389
} else {
@@ -395,7 +395,7 @@ impl serialize::Encoder for PrettyEncoder {
395395
}
396396
}
397397

398-
fn emit_seq_elt(&mut self, idx: uint, f: |&mut PrettyEncoder|) {
398+
fn emit_seq_elt(&mut self, idx: uint, f: |&mut PrettyEncoder<'self>|) {
399399
if idx == 0 {
400400
write!(self.wr, "\n");
401401
} else {
@@ -405,7 +405,7 @@ impl serialize::Encoder for PrettyEncoder {
405405
f(self)
406406
}
407407

408-
fn emit_map(&mut self, len: uint, f: |&mut PrettyEncoder|) {
408+
fn emit_map(&mut self, len: uint, f: |&mut PrettyEncoder<'self>|) {
409409
if len == 0 {
410410
write!(self.wr, "\\{\\}");
411411
} else {
@@ -417,7 +417,7 @@ impl serialize::Encoder for PrettyEncoder {
417417
}
418418
}
419419

420-
fn emit_map_elt_key(&mut self, idx: uint, f: |&mut PrettyEncoder|) {
420+
fn emit_map_elt_key(&mut self, idx: uint, f: |&mut PrettyEncoder<'self>|) {
421421
if idx == 0 {
422422
write!(self.wr, "\n");
423423
} else {
@@ -427,7 +427,7 @@ impl serialize::Encoder for PrettyEncoder {
427427
f(self);
428428
}
429429

430-
fn emit_map_elt_val(&mut self, _idx: uint, f: |&mut PrettyEncoder|) {
430+
fn emit_map_elt_val(&mut self, _idx: uint, f: |&mut PrettyEncoder<'self>|) {
431431
write!(self.wr, ": ");
432432
f(self);
433433
}
@@ -448,22 +448,22 @@ impl<E: serialize::Encoder> serialize::Encodable<E> for Json {
448448

449449
impl Json{
450450
/// Encodes a json value into a io::writer. Uses a single line.
451-
pub fn to_writer(&self, wr: @mut io::Writer) {
451+
pub fn to_writer(&self, wr: &mut io::Writer) {
452452
let mut encoder = Encoder::init(wr);
453453
self.encode(&mut encoder)
454454
}
455455

456456
/// Encodes a json value into a io::writer.
457457
/// Pretty-prints in a more readable format.
458-
pub fn to_pretty_writer(&self, wr: @mut io::Writer) {
458+
pub fn to_pretty_writer(&self, wr: &mut io::Writer) {
459459
let mut encoder = PrettyEncoder::init(wr);
460460
self.encode(&mut encoder)
461461
}
462462

463463
/// Encodes a json value into a string
464464
pub fn to_pretty_str(&self) -> ~str {
465-
let s = @mut MemWriter::new();
466-
self.to_pretty_writer(s as @mut io::Writer);
465+
let mut s = MemWriter::new();
466+
self.to_pretty_writer(&mut s as &mut io::Writer);
467467
str::from_utf8(s.inner_ref().as_slice())
468468
}
469469
}

src/libextra/workcache.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,9 @@ enum Work<'self, T> {
256256
WorkFromTask(&'self Prep<'self>, PortOne<(Exec, T)>),
257257
}
258258

259-
fn json_encode<T:Encodable<json::Encoder>>(t: &T) -> ~str {
260-
let writer = @mut MemWriter::new();
261-
let mut encoder = json::Encoder::init(writer as @mut io::Writer);
259+
fn json_encode<'self, T:Encodable<json::Encoder<'self>>>(t: &T) -> ~str {
260+
let mut writer = MemWriter::new();
261+
let mut encoder = json::Encoder::init(&mut writer as &mut io::Writer);
262262
t.encode(&mut encoder);
263263
str::from_utf8(writer.inner_ref().as_slice())
264264
}
@@ -396,15 +396,15 @@ impl<'self> Prep<'self> {
396396
return true;
397397
}
398398

399-
pub fn exec<T:Send +
400-
Encodable<json::Encoder> +
399+
pub fn exec<'self, T:Send +
400+
Encodable<json::Encoder<'self>> +
401401
Decodable<json::Decoder>>(
402402
&'self self, blk: proc(&mut Exec) -> T) -> T {
403403
self.exec_work(blk).unwrap()
404404
}
405405

406-
fn exec_work<T:Send +
407-
Encodable<json::Encoder> +
406+
fn exec_work<'self, T:Send +
407+
Encodable<json::Encoder<'self>> +
408408
Decodable<json::Decoder>>( // FIXME(#5121)
409409
&'self self, blk: proc(&mut Exec) -> T) -> Work<'self, T> {
410410
let mut bo = Some(blk);
@@ -449,7 +449,7 @@ impl<'self> Prep<'self> {
449449
}
450450

451451
impl<'self, T:Send +
452-
Encodable<json::Encoder> +
452+
Encodable<json::Encoder<'self>> +
453453
Decodable<json::Decoder>>
454454
Work<'self, T> { // FIXME(#5121)
455455

src/libsyntax/parse/mod.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -341,9 +341,10 @@ mod test {
341341
use util::parser_testing::{string_to_expr, string_to_item};
342342
use util::parser_testing::string_to_stmt;
343343

344-
#[cfg(test)] fn to_json_str<E : Encodable<extra::json::Encoder>>(val: @E) -> ~str {
345-
let writer = @mut MemWriter::new();
346-
let mut encoder = extra::json::Encoder::init(writer as @mut io::Writer);
344+
#[cfg(test)]
345+
fn to_json_str<'a, E: Encodable<extra::json::Encoder<'a>>>(val: &E) -> ~str {
346+
let mut writer = MemWriter::new();
347+
let mut encoder = extra::json::Encoder::init(&mut writer as &mut io::Writer);
347348
val.encode(&mut encoder);
348349
str::from_utf8(*writer.inner_ref())
349350
}

0 commit comments

Comments
 (0)