Skip to content

Commit f3ab67e

Browse files
committed
syntax: add {read,emit}_enum_struct_variant{,_field}
1 parent e31f7b7 commit f3ab67e

File tree

4 files changed

+75
-4
lines changed

4 files changed

+75
-4
lines changed

src/libstd/ebml.rs

+24
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,20 @@ pub mod reader {
335335
f()
336336
}
337337
338+
fn read_enum_struct_variant<T>(&self, _names: &[&str], f: &fn(uint) -> T) -> T {
339+
debug!("read_enum_struct_variant()");
340+
let idx = self._next_uint(EsEnumVid);
341+
debug!(" idx=%u", idx);
342+
do self.push_doc(self.next_doc(EsEnumBody)) {
343+
f(idx)
344+
}
345+
}
346+
347+
fn read_enum_struct_variant_field<T>(&self, name: &str, idx: uint, f: &fn() -> T) -> T {
348+
debug!("read_enum_struct_variant_arg(name=%?, idx=%u)", name, idx);
349+
f()
350+
}
351+
338352
fn read_struct<T>(&self, name: &str, _len: uint, f: &fn() -> T) -> T {
339353
debug!("read_struct(name=%s)", name);
340354
f()
@@ -636,13 +650,23 @@ pub mod writer {
636650
self._emit_label(name);
637651
self.wr_tag(EsEnum as uint, f)
638652
}
653+
639654
fn emit_enum_variant(&self, _v_name: &str, v_id: uint, _cnt: uint,
640655
f: &fn()) {
641656
self._emit_tagged_uint(EsEnumVid, v_id);
642657
self.wr_tag(EsEnumBody as uint, f)
643658
}
659+
644660
fn emit_enum_variant_arg(&self, _idx: uint, f: &fn()) { f() }
645661
662+
fn emit_enum_struct_variant(&self, v_name: &str, v_id: uint, cnt: uint, f: &fn()) {
663+
self.emit_enum_variant(v_name, v_id, cnt, f)
664+
}
665+
666+
fn emit_enum_struct_variant_field(&self, _f_name: &str, idx: uint, f: &fn()) {
667+
self.emit_enum_variant_arg(idx, f)
668+
}
669+
646670
fn emit_struct(&self, _name: &str, _len: uint, f: &fn()) { f() }
647671
#[cfg(stage0)]
648672
fn emit_field(&self, name: &str, _idx: uint, f: &fn()) {

src/libstd/json.rs

+32-1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ impl serialize::Encoder for Encoder {
109109
fn emit_str(&self, v: &str) { self.wr.write_str(escape_str(v)) }
110110

111111
fn emit_enum(&self, _name: &str, f: &fn()) { f() }
112+
112113
fn emit_enum_variant(&self, name: &str, _id: uint, cnt: uint, f: &fn()) {
113114
// enums are encoded as strings or vectors:
114115
// Bunny => "Bunny"
@@ -126,10 +127,18 @@ impl serialize::Encoder for Encoder {
126127
}
127128

128129
fn emit_enum_variant_arg(&self, idx: uint, f: &fn()) {
129-
if (idx != 0) {self.wr.write_char(',');}
130+
if idx != 0 {self.wr.write_char(',');}
130131
f();
131132
}
132133

134+
fn emit_enum_struct_variant(&self, name: &str, id: uint, cnt: uint, f: &fn()) {
135+
self.emit_enum_variant(name, id, cnt, f)
136+
}
137+
138+
fn emit_enum_struct_variant_field(&self, _field: &str, idx: uint, f: &fn()) {
139+
self.emit_enum_variant_arg(idx, f)
140+
}
141+
133142
fn emit_struct(&self, _name: &str, _len: uint, f: &fn()) {
134143
self.wr.write_char('{');
135144
f();
@@ -232,6 +241,7 @@ impl serialize::Encoder for PrettyEncoder {
232241
fn emit_str(&self, v: &str) { self.wr.write_str(escape_str(v)); }
233242

234243
fn emit_enum(&self, _name: &str, f: &fn()) { f() }
244+
235245
fn emit_enum_variant(&self, name: &str, _id: uint, cnt: uint, f: &fn()) {
236246
if cnt == 0 {
237247
self.wr.write_str(escape_str(name));
@@ -249,6 +259,7 @@ impl serialize::Encoder for PrettyEncoder {
249259
self.wr.write_char(']');
250260
}
251261
}
262+
252263
fn emit_enum_variant_arg(&self, idx: uint, f: &fn()) {
253264
if idx != 0 {
254265
self.wr.write_str(",\n");
@@ -257,6 +268,15 @@ impl serialize::Encoder for PrettyEncoder {
257268
f()
258269
}
259270

271+
fn emit_enum_struct_variant(&self, name: &str, id: uint, cnt: uint, f: &fn()) {
272+
self.emit_enum_variant(name, id, cnt, f)
273+
}
274+
275+
fn emit_enum_struct_variant_field(&self, _field: &str, idx: uint, f: &fn()) {
276+
self.emit_enum_variant_arg(idx, f)
277+
}
278+
279+
260280
fn emit_struct(&self, _name: &str, len: uint, f: &fn()) {
261281
if len == 0 {
262282
self.wr.write_str("{}");
@@ -864,6 +884,17 @@ impl serialize::Decoder for Decoder {
864884
f()
865885
}
866886
887+
fn read_enum_struct_variant<T>(&self, names: &[&str], f: &fn(uint) -> T) -> T {
888+
debug!("read_enum_struct_variant(names=%?)", names);
889+
self.read_enum_variant(names, f)
890+
}
891+
892+
893+
fn read_enum_struct_variant_field<T>(&self, name: &str, idx: uint, f: &fn() -> T) -> T {
894+
debug!("read_enum_struct_variant_field(name=%?, idx=%u)", name, idx);
895+
self.read_enum_variant_arg(idx, f)
896+
}
897+
867898
fn read_struct<T>(&self, name: &str, len: uint, f: &fn() -> T) -> T {
868899
debug!("read_struct(name=%s, len=%u)", name, len);
869900
let value = f();

src/libstd/serialize.rs

+11-3
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,12 @@ pub trait Encoder {
4545

4646
// Compound types:
4747
fn emit_enum(&self, name: &str, f: &fn());
48-
fn emit_enum_variant(&self, v_name: &str, v_id: uint, sz: uint, f: &fn());
49-
fn emit_enum_variant_arg(&self, idx: uint, f: &fn());
48+
49+
fn emit_enum_variant(&self, v_name: &str, v_id: uint, len: uint, f: &fn());
50+
fn emit_enum_variant_arg(&self, a_idx: uint, f: &fn());
51+
52+
fn emit_enum_struct_variant(&self, v_name: &str, v_id: uint, len: uint, f: &fn());
53+
fn emit_enum_struct_variant_field(&self, f_name: &str, f_idx: uint, f: &fn());
5054

5155
fn emit_struct(&self, name: &str, len: uint, f: &fn());
5256
#[cfg(stage0)]
@@ -97,8 +101,12 @@ pub trait Decoder {
97101

98102
// Compound types:
99103
fn read_enum<T>(&self, name: &str, f: &fn() -> T) -> T;
104+
100105
fn read_enum_variant<T>(&self, names: &[&str], f: &fn(uint) -> T) -> T;
101-
fn read_enum_variant_arg<T>(&self, idx: uint, f: &fn() -> T) -> T;
106+
fn read_enum_variant_arg<T>(&self, a_idx: uint, f: &fn() -> T) -> T;
107+
108+
fn read_enum_struct_variant<T>(&self, names: &[&str], f: &fn(uint) -> T) -> T;
109+
fn read_enum_struct_variant_field<T>(&self, &f_name: &str, f_idx: uint, f: &fn() -> T) -> T;
102110

103111
fn read_struct<T>(&self, s_name: &str, len: uint, f: &fn() -> T) -> T;
104112
#[cfg(stage0)]

src/libsyntax/ext/auto_encode.rs

+8
Original file line numberDiff line numberDiff line change
@@ -1253,6 +1253,14 @@ mod test {
12531253
self.add_to_log(CallToEmitEnumVariantArg (idx)); f();
12541254
}
12551255
1256+
fn emit_enum_struct_variant(&self, name: &str, id: uint, cnt: uint, f: &fn()) {
1257+
self.emit_enum_variant(name, id, cnt, f)
1258+
}
1259+
1260+
fn emit_enum_struct_variant_field(&self, _name: &str, idx: uint, f: &fn()) {
1261+
self.emit_enum_variant_arg(idx, f)
1262+
}
1263+
12561264
fn emit_struct(&self, name: &str, +len: uint, f: &fn()) {
12571265
self.add_to_log(CallToEmitStruct (name.to_str(),len)); f();
12581266
}

0 commit comments

Comments
 (0)