Update compiler
This commit is contained in:
parent
a4cb03ec2f
commit
a2443607da
|
@ -215,7 +215,7 @@ impl<'m, 'b> ModuleContext<'m, 'b> {
|
||||||
"'a",
|
"'a",
|
||||||
seq!["_L: Copy",
|
seq!["_L: Copy",
|
||||||
seq(lts.into_iter().map(|t| item(seq![" + Into<&'a ", t, ">"])).collect())],
|
seq(lts.into_iter().map(|t| item(seq![" + Into<&'a ", t, ">"])).collect())],
|
||||||
seq![self.any_type(), ": preserves::value::NestedValue + 'a"]])
|
seq![self.any_type(), ": _support::preserves::value::NestedValue + 'a"]])
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn extract(&mut self) -> Vec<Item> {
|
pub fn extract(&mut self) -> Vec<Item> {
|
||||||
|
|
|
@ -275,9 +275,8 @@ pub fn compile(config: &CompilerConfig) -> io::Result<()> {
|
||||||
"use _support::Deserialize;",
|
"use _support::Deserialize;",
|
||||||
"use _support::Parse;",
|
"use _support::Parse;",
|
||||||
"use _support::Unparse;",
|
"use _support::Unparse;",
|
||||||
"use _support::preserves;",
|
"use _support::preserves::value::Domain;",
|
||||||
"use preserves::value::Domain;",
|
"use _support::preserves::value::NestedValue;",
|
||||||
"use preserves::value::NestedValue;",
|
|
||||||
""])));
|
""])));
|
||||||
|
|
||||||
let mut emit_items = |items: Vec<Item>| {
|
let mut emit_items = |items: Vec<Item>| {
|
||||||
|
@ -307,18 +306,17 @@ pub fn compile(config: &CompilerConfig) -> io::Result<()> {
|
||||||
lines.push("".to_owned());
|
lines.push("".to_owned());
|
||||||
|
|
||||||
lines.push(format!("use {}::support as _support;", &config.support_crate));
|
lines.push(format!("use {}::support as _support;", &config.support_crate));
|
||||||
lines.push("use _support::preserves;".to_owned());
|
|
||||||
lines.push("".to_owned());
|
lines.push("".to_owned());
|
||||||
|
|
||||||
lines.push("#[allow(non_snake_case)]".to_owned());
|
lines.push("#[allow(non_snake_case)]".to_owned());
|
||||||
lines.push(Formatter::to_string(item(seq![
|
lines.push(Formatter::to_string(item(seq![
|
||||||
"pub struct ", b.language_struct_name(), anglebrackets!["N: preserves::value::NestedValue"], " ",
|
"pub struct ", b.language_struct_name(), anglebrackets!["N: _support::preserves::value::NestedValue"], " ",
|
||||||
vertical(false, braces(b.literals.iter().map(
|
vertical(false, braces(b.literals.iter().map(
|
||||||
|(value, name)| item(format!("pub {}: N /* {:?} */", name, value))).collect()))
|
|(value, name)| item(format!("pub {}: N /* {:?} */", name, value))).collect()))
|
||||||
])));
|
])));
|
||||||
lines.push("".to_owned());
|
lines.push("".to_owned());
|
||||||
lines.push(Formatter::to_string(item(seq![
|
lines.push(Formatter::to_string(item(seq![
|
||||||
"impl", anglebrackets!["N: preserves::value::NestedValue"],
|
"impl", anglebrackets!["N: _support::preserves::value::NestedValue"],
|
||||||
" Default for ", b.language_struct_name(), "<N> ", codeblock![
|
" Default for ", b.language_struct_name(), "<N> ", codeblock![
|
||||||
seq!["fn default() -> Self ", codeblock![
|
seq!["fn default() -> Self ", codeblock![
|
||||||
seq![b.language_struct_name(), " ", vertical(false, braces(b.literals.iter().map(|(value, name)| {
|
seq![b.language_struct_name(), " ", vertical(false, braces(b.literals.iter().map(|(value, name)| {
|
||||||
|
|
|
@ -175,7 +175,7 @@ fn simple_pattern_parser(
|
||||||
let item_dest = simple_pattern_parser(ctxt, pattern, &tmp, None, &mut inner);
|
let item_dest = simple_pattern_parser(ctxt, pattern, &tmp, None, &mut inner);
|
||||||
inner.push(item(seq![dest.to_owned(), ".insert(",
|
inner.push(item(seq![dest.to_owned(), ".insert(",
|
||||||
store_wrap(true, &field_type(pattern), &item_dest), ");"]));
|
store_wrap(true, &field_type(pattern), &item_dest), ");"]));
|
||||||
ctxt.declare_compound(body, &dest, item("preserves::value::Set::new()"));
|
ctxt.declare_compound(body, &dest, item("_support::preserves::value::Set::new()"));
|
||||||
body.push(item(seq!["for ", tmp.to_owned(),
|
body.push(item(seq!["for ", tmp.to_owned(),
|
||||||
" in ", src.to_owned(), ".value().to_set()?",
|
" in ", src.to_owned(), ".value().to_set()?",
|
||||||
" ", codeblock(inner)]));
|
" ", codeblock(inner)]));
|
||||||
|
@ -191,7 +191,7 @@ fn simple_pattern_parser(
|
||||||
dest.to_owned(), ".insert(",
|
dest.to_owned(), ".insert(",
|
||||||
store_wrap(true, &field_type(key), &key_dest), ", ",
|
store_wrap(true, &field_type(key), &key_dest), ", ",
|
||||||
store_wrap(true, &field_type(value), &value_dest), ");"]));
|
store_wrap(true, &field_type(value), &value_dest), ");"]));
|
||||||
ctxt.declare_compound(body, &dest, item("preserves::value::Map::new()"));
|
ctxt.declare_compound(body, &dest, item("_support::preserves::value::Map::new()"));
|
||||||
body.push(item(seq!["for (", tmp_key.to_owned(), ", ", tmp_value.to_owned(), ")",
|
body.push(item(seq!["for (", tmp_key.to_owned(), ", ", tmp_value.to_owned(), ")",
|
||||||
" in ", src.to_owned(), ".value().to_dictionary()?",
|
" in ", src.to_owned(), ".value().to_dictionary()?",
|
||||||
" ", codeblock(inner)]));
|
" ", codeblock(inner)]));
|
||||||
|
|
|
@ -65,12 +65,12 @@ impl BoundaryTracker {
|
||||||
|
|
||||||
fn emit_boundary(&self, body: &mut Vec<Item>) {
|
fn emit_boundary(&self, body: &mut Vec<Item>) {
|
||||||
body.push(item(seq![self.tracker_name.clone(), ".shift(Some(", self.item_expr, "));"]));
|
body.push(item(seq![self.tracker_name.clone(), ".shift(Some(", self.item_expr, "));"]));
|
||||||
body.push(item(seq!["r.boundary(&", self.tracker_name.clone(), ")?;"]));
|
body.push(item(seq!["r.reader.boundary(&", self.tracker_name.clone(), ")?;"]));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_loop(&self, body: &mut Vec<Item>, inner: Vec<Item>) {
|
fn emit_loop(&self, body: &mut Vec<Item>, inner: Vec<Item>) {
|
||||||
body.push(item(seq![
|
body.push(item(seq![
|
||||||
"while !r.close_compound", parens![
|
"while !r.reader.close_compound", parens![
|
||||||
seq!["&mut ", self.tracker_name.clone()],
|
seq!["&mut ", self.tracker_name.clone()],
|
||||||
seq!["&", self.item_expr]], "? ",
|
seq!["&", self.item_expr]], "? ",
|
||||||
codeblock(inner)]))
|
codeblock(inner)]))
|
||||||
|
@ -89,7 +89,7 @@ pub fn gen_definition_reader(m: &mut ModuleContext, n: &str, d: &Definition) {
|
||||||
Definition::Or { pattern_0, pattern_1, pattern_n } => {
|
Definition::Or { pattern_0, pattern_1, pattern_n } => {
|
||||||
let mut ps = vec![&**pattern_0, &**pattern_1];
|
let mut ps = vec![&**pattern_0, &**pattern_1];
|
||||||
ps.extend(pattern_n);
|
ps.extend(pattern_n);
|
||||||
ctxt.define_atom(&mut body, "_mark", item("r.mark()?"));
|
ctxt.define_atom(&mut body, "_mark", item("r.reader.mark()?"));
|
||||||
for NamedAlternative { variant_label: name, pattern: pat } in ps {
|
for NamedAlternative { variant_label: name, pattern: pat } in ps {
|
||||||
let fname = seq!["read_", names::render_fieldname(n), "_", names::render_fieldname(name)];
|
let fname = seq!["read_", names::render_fieldname(n), "_", names::render_fieldname(name)];
|
||||||
let ctorname = item(name![names::render_constructor(n), names::render_constructor(name)]);
|
let ctorname = item(name![names::render_constructor(n), names::render_constructor(name)]);
|
||||||
|
@ -103,9 +103,10 @@ pub fn gen_definition_reader(m: &mut ModuleContext, n: &str, d: &Definition) {
|
||||||
item(seq![
|
item(seq![
|
||||||
"fn ", fname.clone(), anglebrackets![
|
"fn ", fname.clone(), anglebrackets![
|
||||||
"'de",
|
"'de",
|
||||||
seq![ctxt.m.any_type(), ": preserves::value::NestedValue"],
|
seq![ctxt.m.any_type(), ": _support::preserves::value::NestedValue"],
|
||||||
seq!["R: _support::Reader<'de, ", ctxt.m.any_type(), ">"]],
|
seq!["_Dec: _support::DomainDecode<", ctxt.m.any_type(), "::Embedded>"],
|
||||||
"(r: &mut R) -> ",
|
"_R: _support::Reader<'de>"],
|
||||||
|
seq!["(r: &mut _support::preserves::value::ConfiguredReader<'de, ", ctxt.m.any_type(), ", _Dec, _R>) -> "],
|
||||||
"std::result::Result<",
|
"std::result::Result<",
|
||||||
names::render_constructor(n), ty.generic_arg(ctxt.m),
|
names::render_constructor(n), ty.generic_arg(ctxt.m),
|
||||||
", _support::ParseError> ",
|
", _support::ParseError> ",
|
||||||
|
@ -113,7 +114,7 @@ pub fn gen_definition_reader(m: &mut ModuleContext, n: &str, d: &Definition) {
|
||||||
});
|
});
|
||||||
body.push(item(seq![
|
body.push(item(seq![
|
||||||
"match ", fname, "(r) { ",
|
"match ", fname, "(r) { ",
|
||||||
"Err(e) if e.is_conformance_error() => r.restore(&_mark)?, ",
|
"Err(e) if e.is_conformance_error() => r.reader.restore(&_mark)?, ",
|
||||||
"result => return result }"]));
|
"result => return result }"]));
|
||||||
}
|
}
|
||||||
body.push(item(seq![ctxt.err_code()]));
|
body.push(item(seq![ctxt.err_code()]));
|
||||||
|
@ -122,10 +123,10 @@ pub fn gen_definition_reader(m: &mut ModuleContext, n: &str, d: &Definition) {
|
||||||
let mut ps = vec![&**pattern_0, &**pattern_1];
|
let mut ps = vec![&**pattern_0, &**pattern_1];
|
||||||
let mut need_restore = false;
|
let mut need_restore = false;
|
||||||
ps.extend(pattern_n);
|
ps.extend(pattern_n);
|
||||||
ctxt.define_atom(&mut body, "_mark", item("r.mark()?"));
|
ctxt.define_atom(&mut body, "_mark", item("r.reader.mark()?"));
|
||||||
for e in &ps {
|
for e in &ps {
|
||||||
if need_restore {
|
if need_restore {
|
||||||
body.push(item("r.restore(&_mark)?;"));
|
body.push(item("r.reader.restore(&_mark)?;"));
|
||||||
} else {
|
} else {
|
||||||
need_restore = true;
|
need_restore = true;
|
||||||
}
|
}
|
||||||
|
@ -143,11 +144,12 @@ pub fn gen_definition_reader(m: &mut ModuleContext, n: &str, d: &Definition) {
|
||||||
item(seq![
|
item(seq![
|
||||||
"impl", anglebrackets![
|
"impl", anglebrackets![
|
||||||
"'de",
|
"'de",
|
||||||
seq![ctxt.m.any_type(), ": preserves::value::NestedValue"],
|
seq![ctxt.m.any_type(), ": _support::preserves::value::NestedValue"],
|
||||||
seq!["R: _support::Reader<'de, ", ctxt.m.any_type(), ">"]], " ",
|
seq!["_Dec: _support::DomainDecode<", ctxt.m.any_type(), "::Embedded>"],
|
||||||
"_support::Deserialize", anglebrackets!["'de", ctxt.m.any_type(), "R"], " ",
|
"_R: _support::Reader<'de>"], " ",
|
||||||
|
"_support::Deserialize", anglebrackets!["'de", ctxt.m.any_type(), "_Dec", "_R"], " ",
|
||||||
"for ", names::render_constructor(n), ty.generic_arg(ctxt.m), " ", codeblock![
|
"for ", names::render_constructor(n), ty.generic_arg(ctxt.m), " ", codeblock![
|
||||||
seq!["fn deserialize(r: &mut R) -> ",
|
seq!["fn deserialize(r: &mut _support::preserves::value::ConfiguredReader<'de, ", ctxt.m.any_type(), ", _Dec, _R>) -> ",
|
||||||
"std::result::Result<Self, _support::ParseError> ",
|
"std::result::Result<Self, _support::ParseError> ",
|
||||||
codeblock(body)]]])
|
codeblock(body)]]])
|
||||||
});
|
});
|
||||||
|
@ -239,7 +241,7 @@ fn read_expected_literal_seqs(
|
||||||
None => {
|
None => {
|
||||||
let mut inner = Vec::new();
|
let mut inner = Vec::new();
|
||||||
group.into_iter().next().unwrap().1(ctxt, &mut inner);
|
group.into_iter().next().unwrap().1(ctxt, &mut inner);
|
||||||
cases.push(item(seq!["preserves::value::Token::End => ", codeblock(inner)]));
|
cases.push(item(seq!["_support::preserves::value::Token::End => ", codeblock(inner)]));
|
||||||
},
|
},
|
||||||
Some(h) => {
|
Some(h) => {
|
||||||
let tails = group.into_iter().map(|(mut vs, f)| {
|
let tails = group.into_iter().map(|(mut vs, f)| {
|
||||||
|
@ -253,7 +255,7 @@ fn read_expected_literal_seqs(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cases.extend(read_expected_literals_cases(ctxt, nested));
|
cases.extend(read_expected_literals_cases(ctxt, nested));
|
||||||
body.push(item(seq!["match r.next_token(true)? ", codeblock(cases)]));
|
body.push(item(seq!["match r.next_token()? ", codeblock(cases)]));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_expected_literals_cases(
|
fn read_expected_literals_cases(
|
||||||
|
@ -269,7 +271,7 @@ fn read_expected_literals_cases(
|
||||||
let mut inner = Vec::new();
|
let mut inner = Vec::new();
|
||||||
p.1(ctxt, &mut inner);
|
p.1(ctxt, &mut inner);
|
||||||
subcases.push(item(seq![
|
subcases.push(item(seq![
|
||||||
format!("preserves::value::Value::{:?}(w)", cls),
|
format!("_support::preserves::value::Value::{:?}(w)", cls),
|
||||||
match cls {
|
match cls {
|
||||||
AtomClass::Boolean => match p.0.value().to_boolean().unwrap() {
|
AtomClass::Boolean => match p.0.value().to_boolean().unwrap() {
|
||||||
true => " if *w".to_owned(),
|
true => " if *w".to_owned(),
|
||||||
|
@ -291,7 +293,7 @@ fn read_expected_literals_cases(
|
||||||
codeblock(inner)]));
|
codeblock(inner)]));
|
||||||
}
|
}
|
||||||
subcases.push(item(seq!["_ => return ", ctxt.err_code(), "?,"]));
|
subcases.push(item(seq!["_ => return ", ctxt.err_code(), "?,"]));
|
||||||
item(seq!["preserves::value::Token::Atom(v) => match v.value() ", codeblock(subcases)])
|
item(seq!["_support::preserves::value::Token::Atom(v) => match v.value() ", codeblock(subcases)])
|
||||||
}
|
}
|
||||||
ValueClass::Compound(CompoundClass::Record) => {
|
ValueClass::Compound(CompoundClass::Record) => {
|
||||||
let mut subcases = Vec::new();
|
let mut subcases = Vec::new();
|
||||||
|
@ -300,7 +302,7 @@ fn read_expected_literals_cases(
|
||||||
(r.0.clone(), f)
|
(r.0.clone(), f)
|
||||||
}).collect());
|
}).collect());
|
||||||
item(seq![
|
item(seq![
|
||||||
"preserves::value::Token::Compound(preserves::value::CompoundClass::Record) => ",
|
"_support::preserves::value::Token::Compound(_support::preserves::value::CompoundClass::Record) => ",
|
||||||
codeblock(subcases)])
|
codeblock(subcases)])
|
||||||
}
|
}
|
||||||
ValueClass::Compound(CompoundClass::Sequence) => {
|
ValueClass::Compound(CompoundClass::Sequence) => {
|
||||||
|
@ -310,7 +312,7 @@ fn read_expected_literals_cases(
|
||||||
(s, f)
|
(s, f)
|
||||||
}).collect());
|
}).collect());
|
||||||
item(seq![
|
item(seq![
|
||||||
"preserves::value::Token::Compound(preserves::value::CompoundClass::Sequence) => ",
|
"_support::preserves::value::Token::Compound(_support::preserves::value::CompoundClass::Sequence) => ",
|
||||||
codeblock(subcases)])
|
codeblock(subcases)])
|
||||||
}
|
}
|
||||||
ValueClass::Compound(CompoundClass::Set) => {
|
ValueClass::Compound(CompoundClass::Set) => {
|
||||||
|
@ -334,7 +336,7 @@ fn read_expected_literals(
|
||||||
possibilities: LiteralCases,
|
possibilities: LiteralCases,
|
||||||
) {
|
) {
|
||||||
let cases = read_expected_literals_cases(ctxt, possibilities);
|
let cases = read_expected_literals_cases(ctxt, possibilities);
|
||||||
body.push(item(seq!["match r.next_token(true)? ", codeblock(cases)]));
|
body.push(item(seq!["match r.next_token()? ", codeblock(cases)]));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn simple_pattern_reader(
|
fn simple_pattern_reader(
|
||||||
|
@ -346,27 +348,27 @@ fn simple_pattern_reader(
|
||||||
let dest = ctxt.gentempname();
|
let dest = ctxt.gentempname();
|
||||||
match p {
|
match p {
|
||||||
SimplePattern::Any => {
|
SimplePattern::Any => {
|
||||||
ctxt.define_atom(body, &dest, item("r.demand_next(true)?"));
|
ctxt.define_atom(body, &dest, item("r.demand_next()?"));
|
||||||
dest
|
dest
|
||||||
},
|
},
|
||||||
SimplePattern::Atom { atom_kind: k } => {
|
SimplePattern::Atom { atom_kind: k } => {
|
||||||
let reader = match &**k {
|
let reader = match &**k {
|
||||||
AtomKind::Boolean => "r.next_boolean()?",
|
AtomKind::Boolean => "r.reader.next_boolean()?",
|
||||||
AtomKind::Float => "r.next_float()?",
|
AtomKind::Float => "r.reader.next_float()?",
|
||||||
AtomKind::Double => "r.next_double()?",
|
AtomKind::Double => "r.reader.next_double()?",
|
||||||
AtomKind::SignedInteger => "r.next_signedinteger()?",
|
AtomKind::SignedInteger => "r.reader.next_signedinteger()?",
|
||||||
AtomKind::String => "r.next_str()?.into_owned()",
|
AtomKind::String => "r.reader.next_str()?.into_owned()",
|
||||||
AtomKind::ByteString => "r.next_bytestring()?.into_owned()",
|
AtomKind::ByteString => "r.reader.next_bytestring()?.into_owned()",
|
||||||
AtomKind::Symbol => "r.next_symbol()?.into_owned()",
|
AtomKind::Symbol => "r.reader.next_symbol()?.into_owned()",
|
||||||
};
|
};
|
||||||
ctxt.define_atom(body, &dest, item(reader.to_owned()));
|
ctxt.define_atom(body, &dest, item(reader.to_owned()));
|
||||||
dest
|
dest
|
||||||
},
|
},
|
||||||
SimplePattern::Embedded { .. } => {
|
SimplePattern::Embedded { .. } => {
|
||||||
// TODO: Is this right? If so, why doesn't it expect *two* Embedded tags in a row??
|
// TODO: Is this right? If so, why doesn't it expect *two* Embedded tags in a row??
|
||||||
body.push(item("r.open_embedded()?;"));
|
body.push(item("r.reader.open_embedded()?;"));
|
||||||
ctxt.define_atom(body, &dest, item("r.demand_next(true)?.value().to_embedded()?.clone()"));
|
ctxt.define_atom(body, &dest, item("r.demand_next()?.value().to_embedded()?.clone()"));
|
||||||
body.push(item("r.close_embedded()?;"));
|
body.push(item("r.reader.close_embedded()?;"));
|
||||||
dest
|
dest
|
||||||
},
|
},
|
||||||
SimplePattern::Lit { value } => {
|
SimplePattern::Lit { value } => {
|
||||||
|
@ -379,7 +381,7 @@ fn simple_pattern_reader(
|
||||||
let compound_dest = ctxt.gentempname();
|
let compound_dest = ctxt.gentempname();
|
||||||
ctxt.with_definite_mode(|ctxt| {
|
ctxt.with_definite_mode(|ctxt| {
|
||||||
let boundary_tracker = BoundaryTracker::unwrap(
|
let boundary_tracker = BoundaryTracker::unwrap(
|
||||||
ctxt, body, "r.open_sequence()?;", boundary_tracker);
|
ctxt, body, "r.reader.open_sequence()?;", boundary_tracker);
|
||||||
let mut inner = Vec::new();
|
let mut inner = Vec::new();
|
||||||
boundary_tracker.emit_boundary(&mut inner);
|
boundary_tracker.emit_boundary(&mut inner);
|
||||||
let item_dest = simple_pattern_reader(ctxt, pattern, None, &mut inner);
|
let item_dest = simple_pattern_reader(ctxt, pattern, None, &mut inner);
|
||||||
|
@ -395,13 +397,13 @@ fn simple_pattern_reader(
|
||||||
let compound_dest = ctxt.gentempname();
|
let compound_dest = ctxt.gentempname();
|
||||||
ctxt.with_definite_mode(|ctxt| {
|
ctxt.with_definite_mode(|ctxt| {
|
||||||
let boundary_tracker = BoundaryTracker::new(
|
let boundary_tracker = BoundaryTracker::new(
|
||||||
ctxt, body, "r.open_set()?;", "_support::B::Item::SetValue");
|
ctxt, body, "r.reader.open_set()?;", "_support::B::Item::SetValue");
|
||||||
let mut inner = Vec::new();
|
let mut inner = Vec::new();
|
||||||
boundary_tracker.emit_boundary(&mut inner);
|
boundary_tracker.emit_boundary(&mut inner);
|
||||||
let item_dest = simple_pattern_reader(ctxt, pattern, None, &mut inner);
|
let item_dest = simple_pattern_reader(ctxt, pattern, None, &mut inner);
|
||||||
inner.push(item(seq![compound_dest.to_owned(), ".insert(",
|
inner.push(item(seq![compound_dest.to_owned(), ".insert(",
|
||||||
store_wrap(true, &field_type(pattern), &item_dest), ");"]));
|
store_wrap(true, &field_type(pattern), &item_dest), ");"]));
|
||||||
ctxt.declare_compound(body, &compound_dest, item("preserves::value::Set::new()"));
|
ctxt.declare_compound(body, &compound_dest, item("_support::preserves::value::Set::new()"));
|
||||||
boundary_tracker.emit_loop(body, inner);
|
boundary_tracker.emit_loop(body, inner);
|
||||||
});
|
});
|
||||||
ctxt.define_atom(body, &dest, item(compound_dest));
|
ctxt.define_atom(body, &dest, item(compound_dest));
|
||||||
|
@ -411,7 +413,7 @@ fn simple_pattern_reader(
|
||||||
let compound_dest = ctxt.gentempname();
|
let compound_dest = ctxt.gentempname();
|
||||||
ctxt.with_definite_mode(|ctxt| {
|
ctxt.with_definite_mode(|ctxt| {
|
||||||
let mut boundary_tracker = BoundaryTracker::new(
|
let mut boundary_tracker = BoundaryTracker::new(
|
||||||
ctxt, body, "r.open_dictionary()?;", "_support::B::Item::DictionaryKey");
|
ctxt, body, "r.reader.open_dictionary()?;", "_support::B::Item::DictionaryKey");
|
||||||
let mut inner = Vec::new();
|
let mut inner = Vec::new();
|
||||||
boundary_tracker.emit_boundary(&mut inner);
|
boundary_tracker.emit_boundary(&mut inner);
|
||||||
let key_dest = simple_pattern_reader(ctxt, key, None, &mut inner);
|
let key_dest = simple_pattern_reader(ctxt, key, None, &mut inner);
|
||||||
|
@ -422,7 +424,7 @@ fn simple_pattern_reader(
|
||||||
compound_dest.to_owned(), ".insert(",
|
compound_dest.to_owned(), ".insert(",
|
||||||
store_wrap(true, &field_type(key), &key_dest), ", ",
|
store_wrap(true, &field_type(key), &key_dest), ", ",
|
||||||
store_wrap(true, &field_type(value), &value_dest), ");"]));
|
store_wrap(true, &field_type(value), &value_dest), ");"]));
|
||||||
ctxt.declare_compound(body, &compound_dest, item("preserves::value::Map::new()"));
|
ctxt.declare_compound(body, &compound_dest, item("_support::preserves::value::Map::new()"));
|
||||||
boundary_tracker.item_expr = "_support::B::Item::DictionaryKey";
|
boundary_tracker.item_expr = "_support::B::Item::DictionaryKey";
|
||||||
boundary_tracker.emit_loop(body, inner);
|
boundary_tracker.emit_loop(body, inner);
|
||||||
});
|
});
|
||||||
|
@ -469,7 +471,7 @@ fn pattern_reader(
|
||||||
match &**c {
|
match &**c {
|
||||||
CompoundPattern::Rec { label, fields } => {
|
CompoundPattern::Rec { label, fields } => {
|
||||||
let mut boundary_tracker = BoundaryTracker::new(
|
let mut boundary_tracker = BoundaryTracker::new(
|
||||||
ctxt, body, "r.open_record(None)?;", "_support::B::Item::RecordLabel");
|
ctxt, body, "r.reader.open_record()?;", "_support::B::Item::RecordLabel");
|
||||||
boundary_tracker.emit_boundary(body);
|
boundary_tracker.emit_boundary(body);
|
||||||
boundary_tracker.item_expr = "_support::B::Item::RecordField";
|
boundary_tracker.item_expr = "_support::B::Item::RecordField";
|
||||||
named_pattern_reader(ctxt, &**label, None, body);
|
named_pattern_reader(ctxt, &**label, None, body);
|
||||||
|
@ -477,18 +479,18 @@ fn pattern_reader(
|
||||||
},
|
},
|
||||||
CompoundPattern::Tuple { patterns } => {
|
CompoundPattern::Tuple { patterns } => {
|
||||||
let boundary_tracker = BoundaryTracker::unwrap(
|
let boundary_tracker = BoundaryTracker::unwrap(
|
||||||
ctxt, body, "r.open_sequence()?;", boundary_tracker);
|
ctxt, body, "r.reader.open_sequence()?;", boundary_tracker);
|
||||||
for p in patterns {
|
for p in patterns {
|
||||||
boundary_tracker.emit_boundary(body);
|
boundary_tracker.emit_boundary(body);
|
||||||
named_pattern_reader(ctxt, p, None, body);
|
named_pattern_reader(ctxt, p, None, body);
|
||||||
}
|
}
|
||||||
body.push(item(seq!["r.ensure_complete", parens![
|
body.push(item(seq!["r.reader.ensure_complete", parens![
|
||||||
boundary_tracker.tracker_name.clone(),
|
boundary_tracker.tracker_name.clone(),
|
||||||
seq!["&", boundary_tracker.item_expr]], "?;"]));
|
seq!["&", boundary_tracker.item_expr]], "?;"]));
|
||||||
},
|
},
|
||||||
CompoundPattern::TuplePrefix { fixed, variable } => {
|
CompoundPattern::TuplePrefix { fixed, variable } => {
|
||||||
let boundary_tracker = BoundaryTracker::unwrap(
|
let boundary_tracker = BoundaryTracker::unwrap(
|
||||||
ctxt, body, "r.open_sequence()?;", boundary_tracker);
|
ctxt, body, "r.reader.open_sequence()?;", boundary_tracker);
|
||||||
for p in fixed {
|
for p in fixed {
|
||||||
boundary_tracker.emit_boundary(body);
|
boundary_tracker.emit_boundary(body);
|
||||||
named_pattern_reader(ctxt, p, None, body);
|
named_pattern_reader(ctxt, p, None, body);
|
||||||
|
@ -497,7 +499,7 @@ fn pattern_reader(
|
||||||
},
|
},
|
||||||
CompoundPattern::Dict { entries } => {
|
CompoundPattern::Dict { entries } => {
|
||||||
let boundary_tracker = BoundaryTracker::new(
|
let boundary_tracker = BoundaryTracker::new(
|
||||||
ctxt, body, "r.open_dictionary()?;", "_support::B::Item::DictionaryKey");
|
ctxt, body, "r.reader.open_dictionary()?;", "_support::B::Item::DictionaryKey");
|
||||||
let mut inner = Vec::new();
|
let mut inner = Vec::new();
|
||||||
boundary_tracker.emit_boundary(&mut inner);
|
boundary_tracker.emit_boundary(&mut inner);
|
||||||
let mut val_boundary_tracker = boundary_tracker.clone();
|
let mut val_boundary_tracker = boundary_tracker.clone();
|
||||||
|
|
|
@ -53,7 +53,7 @@ impl compiler::Plugin for TypePlugin {
|
||||||
m.define_type(item(vertical(false, seq![
|
m.define_type(item(vertical(false, seq![
|
||||||
seq!["pub type _Dom = ", m.render_ref(&*r, RefRenderStyle::Bare), ";"],
|
seq!["pub type _Dom = ", m.render_ref(&*r, RefRenderStyle::Bare), ";"],
|
||||||
seq!["pub type _Ptr = std::sync::Arc<_Dom>;"],
|
seq!["pub type _Ptr = std::sync::Arc<_Dom>;"],
|
||||||
seq!["pub type _Any = preserves::value::ArcValue<_Ptr>;"]
|
seq!["pub type _Any = _support::preserves::value::ArcValue<_Ptr>;"]
|
||||||
])));
|
])));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,7 @@ impl compiler::Plugin for TypePlugin {
|
||||||
let ty = definition_type(&m.module_path, n, d);
|
let ty = definition_type(&m.module_path, n, d);
|
||||||
m.define_type(item(ty.render(m, n)));
|
m.define_type(item(ty.render(m, n)));
|
||||||
m.define_type(item(seq![
|
m.define_type(item(seq![
|
||||||
"impl", ty.generic_decl(m), " preserves::value::Domain for ",
|
"impl", ty.generic_decl(m), " _support::preserves::value::Domain for ",
|
||||||
names::render_constructor(n), ty.generic_arg(m), " {}"]));
|
names::render_constructor(n), ty.generic_arg(m), " {}"]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -174,9 +174,9 @@ pub fn field_type(p: &SimplePattern) -> TField {
|
||||||
SimplePattern::Atom { atom_kind: k } =>
|
SimplePattern::Atom { atom_kind: k } =>
|
||||||
match **k {
|
match **k {
|
||||||
AtomKind::Boolean => TField::Base("bool".to_owned()),
|
AtomKind::Boolean => TField::Base("bool".to_owned()),
|
||||||
AtomKind::Float => TField::Base("preserves::value::Float".to_owned()),
|
AtomKind::Float => TField::Base("_support::preserves::value::Float".to_owned()),
|
||||||
AtomKind::Double => TField::Base("preserves::value::Double".to_owned()),
|
AtomKind::Double => TField::Base("_support::preserves::value::Double".to_owned()),
|
||||||
AtomKind::SignedInteger => TField::Base("preserves::value::signed_integer::SignedInteger".to_owned()),
|
AtomKind::SignedInteger => TField::Base("_support::preserves::value::signed_integer::SignedInteger".to_owned()),
|
||||||
AtomKind::String => TField::Base("std::string::String".to_owned()),
|
AtomKind::String => TField::Base("std::string::String".to_owned()),
|
||||||
AtomKind::ByteString => TField::Base("std::vec::Vec<u8>".to_owned()),
|
AtomKind::ByteString => TField::Base("std::vec::Vec<u8>".to_owned()),
|
||||||
AtomKind::Symbol => TField::Base("std::string::String".to_owned()),
|
AtomKind::Symbol => TField::Base("std::string::String".to_owned()),
|
||||||
|
@ -200,8 +200,8 @@ impl TField {
|
||||||
TField::Any => seq![ctxt.any_type()],
|
TField::Any => seq![ctxt.any_type()],
|
||||||
TField::Embedded => seq![ctxt.any_type(), "::Embedded"],
|
TField::Embedded => seq![ctxt.any_type(), "::Embedded"],
|
||||||
TField::Array(t) => seq!["std::vec::Vec<", t.render(ctxt, false), ">"],
|
TField::Array(t) => seq!["std::vec::Vec<", t.render(ctxt, false), ">"],
|
||||||
TField::Set(t) => seq!["preserves::value::Set<", t.render(ctxt, false), ">"],
|
TField::Set(t) => seq!["_support::preserves::value::Set<", t.render(ctxt, false), ">"],
|
||||||
TField::Map(k, v) => seq!["preserves::value::Map",
|
TField::Map(k, v) => seq!["_support::preserves::value::Map",
|
||||||
anglebrackets![k.render(ctxt, false),
|
anglebrackets![k.render(ctxt, false),
|
||||||
v.render(ctxt, false)]],
|
v.render(ctxt, false)]],
|
||||||
TField::Ref(r) =>
|
TField::Ref(r) =>
|
||||||
|
@ -294,7 +294,7 @@ impl TDefinition {
|
||||||
pub fn generic_decl(&self, ctxt: &ModuleContext) -> Item {
|
pub fn generic_decl(&self, ctxt: &ModuleContext) -> Item {
|
||||||
if self.has_embedded(ctxt.bundle) {
|
if self.has_embedded(ctxt.bundle) {
|
||||||
item(anglebrackets![
|
item(anglebrackets![
|
||||||
seq![ctxt.any_type(), ": preserves::value::NestedValue"]])
|
seq![ctxt.any_type(), ": _support::preserves::value::NestedValue"]])
|
||||||
} else {
|
} else {
|
||||||
item("")
|
item("")
|
||||||
}
|
}
|
||||||
|
@ -303,9 +303,9 @@ impl TDefinition {
|
||||||
pub fn generic_decl_with_defaults(&self, ctxt: &ModuleContext) -> Item {
|
pub fn generic_decl_with_defaults(&self, ctxt: &ModuleContext) -> Item {
|
||||||
if self.has_embedded(ctxt.bundle) {
|
if self.has_embedded(ctxt.bundle) {
|
||||||
item(anglebrackets![
|
item(anglebrackets![
|
||||||
seq![ctxt.any_type(), ": preserves::value::NestedValue = ",
|
seq![ctxt.any_type(), ": _support::preserves::value::NestedValue = ",
|
||||||
match ctxt.schema.embedded_type {
|
match ctxt.schema.embedded_type {
|
||||||
EmbeddedTypeName::False => "preserves::value::IOValue",
|
EmbeddedTypeName::False => "_support::preserves::value::IOValue",
|
||||||
EmbeddedTypeName::Ref(_) => "_Any",
|
EmbeddedTypeName::Ref(_) => "_Any",
|
||||||
}]])
|
}]])
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -85,7 +85,7 @@ pub fn gen_definition_unparser(m: &mut ModuleContext, n: &str, d: &Definition) {
|
||||||
let (patpat, vc) = destruct(&mut ctxt, item(names::render_constructor(n)), true, &record_type(&ps));
|
let (patpat, vc) = destruct(&mut ctxt, item(names::render_constructor(n)), true, &record_type(&ps));
|
||||||
body.push(item(seq!["let ", patpat, " = self;"]));
|
body.push(item(seq!["let ", patpat, " = self;"]));
|
||||||
body.push(item(seq![
|
body.push(item(seq![
|
||||||
"preserves::value::merge(vec!", brackets(ps.iter().map(
|
"_support::preserves::value::merge(vec!", brackets(ps.iter().map(
|
||||||
|p| named_pattern_unparser(&mut ctxt, p, &vc)).collect()
|
|p| named_pattern_unparser(&mut ctxt, p, &vc)).collect()
|
||||||
), ").expect", parens![escape_string(&(
|
), ").expect", parens![escape_string(&(
|
||||||
"merge of ".to_owned() + &ctxt.fully_qualified_error_context()))]]));
|
"merge of ".to_owned() + &ctxt.fully_qualified_error_context()))]]));
|
||||||
|
@ -144,15 +144,15 @@ fn simple_pattern_unparser(
|
||||||
SimplePattern::Atom { atom_kind: k } => {
|
SimplePattern::Atom { atom_kind: k } => {
|
||||||
match &**k {
|
match &**k {
|
||||||
AtomKind::Symbol =>
|
AtomKind::Symbol =>
|
||||||
item(seq!["preserves::value::Value::symbol(", src.as_ref().unwrap().to_owned(), ").wrap()"]),
|
item(seq!["_support::preserves::value::Value::symbol(", src.as_ref().unwrap().to_owned(), ").wrap()"]),
|
||||||
AtomKind::ByteString =>
|
AtomKind::ByteString =>
|
||||||
item(seq!["preserves::value::Value::ByteString(", src.as_ref().unwrap().to_owned(), ".clone()).wrap()"]),
|
item(seq!["_support::preserves::value::Value::ByteString(", src.as_ref().unwrap().to_owned(), ".clone()).wrap()"]),
|
||||||
_ =>
|
_ =>
|
||||||
item(seq!["preserves::value::Value::from(", src.as_ref().unwrap().to_owned(), ").wrap()"])
|
item(seq!["_support::preserves::value::Value::from(", src.as_ref().unwrap().to_owned(), ").wrap()"])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SimplePattern::Embedded { .. } =>
|
SimplePattern::Embedded { .. } =>
|
||||||
item(seq!["preserves::value::Value::Embedded(", src.as_ref().unwrap().to_owned(), ".clone()).wrap()"]),
|
item(seq!["_support::preserves::value::Value::Embedded(", src.as_ref().unwrap().to_owned(), ".clone()).wrap()"]),
|
||||||
SimplePattern::Lit { value } =>
|
SimplePattern::Lit { value } =>
|
||||||
item(seq![parens![ctxt.m.define_literal(value)], ".clone()"]),
|
item(seq![parens![ctxt.m.define_literal(value)], ".clone()"]),
|
||||||
SimplePattern::Seqof { pattern } => {
|
SimplePattern::Seqof { pattern } => {
|
||||||
|
@ -169,7 +169,7 @@ fn simple_pattern_unparser(
|
||||||
}
|
}
|
||||||
SimplePattern::Setof { pattern } => {
|
SimplePattern::Setof { pattern } => {
|
||||||
let tmp = ctxt.gentempname();
|
let tmp = ctxt.gentempname();
|
||||||
item(seq!["preserves::value::Value::Set(",
|
item(seq!["_support::preserves::value::Value::Set(",
|
||||||
src.as_ref().unwrap().to_owned(), ".iter().map(|", tmp.to_owned(), "| ",
|
src.as_ref().unwrap().to_owned(), ".iter().map(|", tmp.to_owned(), "| ",
|
||||||
simple_pattern_unparser(ctxt, pattern, &normal_src(tmp, true)),
|
simple_pattern_unparser(ctxt, pattern, &normal_src(tmp, true)),
|
||||||
").collect()).wrap()"])
|
").collect()).wrap()"])
|
||||||
|
@ -177,7 +177,7 @@ fn simple_pattern_unparser(
|
||||||
SimplePattern::Dictof { key, value } => {
|
SimplePattern::Dictof { key, value } => {
|
||||||
let tmp_key = ctxt.gentempname();
|
let tmp_key = ctxt.gentempname();
|
||||||
let tmp_value = ctxt.gentempname();
|
let tmp_value = ctxt.gentempname();
|
||||||
item(seq!["preserves::value::Value::Dictionary(",
|
item(seq!["_support::preserves::value::Value::Dictionary(",
|
||||||
src.as_ref().unwrap().to_owned(),
|
src.as_ref().unwrap().to_owned(),
|
||||||
".iter().map(|(", tmp_key.to_owned(), ", ", tmp_value.to_owned(), ")| ",
|
".iter().map(|(", tmp_key.to_owned(), ", ", tmp_value.to_owned(), ")| ",
|
||||||
parens![simple_pattern_unparser(ctxt, key, &normal_src(tmp_key, true)),
|
parens![simple_pattern_unparser(ctxt, key, &normal_src(tmp_key, true)),
|
||||||
|
@ -225,7 +225,7 @@ fn pattern_unparser(
|
||||||
let rtmp = ctxt.gentempname();
|
let rtmp = ctxt.gentempname();
|
||||||
let mut body = Vec::new();
|
let mut body = Vec::new();
|
||||||
let init_expr = item(seq![
|
let init_expr = item(seq![
|
||||||
"preserves::value::Record(vec![",
|
"_support::preserves::value::Record(vec![",
|
||||||
named_pattern_unparser(ctxt, label, &normal_none(vc.is_struct)),
|
named_pattern_unparser(ctxt, label, &normal_none(vc.is_struct)),
|
||||||
"])"]);
|
"])"]);
|
||||||
ctxt.declare_compound(&mut body, &rtmp, init_expr);
|
ctxt.declare_compound(&mut body, &rtmp, init_expr);
|
||||||
|
@ -256,13 +256,13 @@ fn pattern_unparser(
|
||||||
CompoundPattern::Dict { entries } => {
|
CompoundPattern::Dict { entries } => {
|
||||||
let dtmp = ctxt.gentempname();
|
let dtmp = ctxt.gentempname();
|
||||||
let mut body = Vec::new();
|
let mut body = Vec::new();
|
||||||
ctxt.declare_compound(&mut body, &dtmp, item("preserves::value::Map::new()"));
|
ctxt.declare_compound(&mut body, &dtmp, item("_support::preserves::value::Map::new()"));
|
||||||
for (key_lit, value_pat) in entries.0.iter() {
|
for (key_lit, value_pat) in entries.0.iter() {
|
||||||
body.push(item(seq![dtmp.clone(), ".insert", parens![
|
body.push(item(seq![dtmp.clone(), ".insert", parens![
|
||||||
seq![parens![ctxt.m.define_literal(key_lit)], ".clone()"],
|
seq![parens![ctxt.m.define_literal(key_lit)], ".clone()"],
|
||||||
named_pattern_unparser(ctxt, &promote(value_pat), &normal_none(vc.is_struct))], ";"]));
|
named_pattern_unparser(ctxt, &promote(value_pat), &normal_none(vc.is_struct))], ";"]));
|
||||||
}
|
}
|
||||||
body.push(item(seq!["preserves::value::Value::Dictionary(", dtmp, ").wrap()"]));
|
body.push(item(seq!["_support::preserves::value::Value::Dictionary(", dtmp, ").wrap()"]));
|
||||||
item(codeblock(body))
|
item(codeblock(body))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -283,7 +283,7 @@ fn sequenceify<'a>(
|
||||||
ctxt.declare_compound(&mut body, &rtmp, item("std::vec::Vec::new()"));
|
ctxt.declare_compound(&mut body, &rtmp, item("std::vec::Vec::new()"));
|
||||||
FieldsSink {
|
FieldsSink {
|
||||||
finish: item(seq![
|
finish: item(seq![
|
||||||
"preserves::value::Value::Sequence", parens![rtmp.clone()], ".wrap()"]),
|
"_support::preserves::value::Value::Sequence", parens![rtmp.clone()], ".wrap()"]),
|
||||||
vec_expr: item(rtmp),
|
vec_expr: item(rtmp),
|
||||||
body: body,
|
body: body,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue