Add generation for node ast file.
This commit is contained in:
parent
b75e51ee41
commit
300e65a8d3
@ -104,8 +104,12 @@ fn get_single_child_to_build(
|
|||||||
Some(s) => SingleChildToBuild::Type(SingleTypeChildToBuild::from_build_or_rule(
|
Some(s) => SingleChildToBuild::Type(SingleTypeChildToBuild::from_build_or_rule(
|
||||||
s, None, optional,
|
s, None, optional,
|
||||||
)),
|
)),
|
||||||
None => SingleChildToBuild::Type(SingleTypeChildToBuild::from_build_or_rule(
|
None => SingleChildToBuild::Type(SingleTypeChildToBuild::new(
|
||||||
rule, None, optional,
|
&rule,
|
||||||
|
&name,
|
||||||
|
&make_build_fn_name(&rule),
|
||||||
|
None,
|
||||||
|
optional,
|
||||||
)),
|
)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -126,12 +130,7 @@ fn get_child_specs(children: &Yaml) -> Vec<ChildSpec> {
|
|||||||
.iter()
|
.iter()
|
||||||
.map(|child_spec| {
|
.map(|child_spec| {
|
||||||
if child_spec.is_hash() {
|
if child_spec.is_hash() {
|
||||||
let as_hash = child_spec.as_hash().unwrap();
|
let (name, props) = unwrap_single_member_hash(child_spec);
|
||||||
let (name, props) = as_hash
|
|
||||||
.iter()
|
|
||||||
.next()
|
|
||||||
.map(|(name, props)| (name.as_str().unwrap(), props))
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let rule = props["rule"]
|
let rule = props["rule"]
|
||||||
.as_str()
|
.as_str()
|
||||||
@ -139,17 +138,16 @@ fn get_child_specs(children: &Yaml) -> Vec<ChildSpec> {
|
|||||||
.unwrap_or(name.to_case(Case::Pascal));
|
.unwrap_or(name.to_case(Case::Pascal));
|
||||||
|
|
||||||
if get_as_bool(&props["skip"]) {
|
if get_as_bool(&props["skip"]) {
|
||||||
return ChildSpec::SkipChild(SkipChild::new(name, &rule));
|
return ChildSpec::SkipChild(SkipChild::new(&name, &rule));
|
||||||
}
|
}
|
||||||
|
|
||||||
let build = &props["build"];
|
let build = &props["build"];
|
||||||
|
|
||||||
if get_as_bool(&props["vec"]) {
|
if get_as_bool(&props["vec"]) {
|
||||||
get_vec_child(name, &rule, build)
|
get_vec_child(&name, &rule, build)
|
||||||
} else {
|
} else {
|
||||||
let optional = props["optional"].as_bool().unwrap_or_else(|| false);
|
let optional = get_as_bool(&props["optional"]);
|
||||||
|
get_single_child(&name, &rule, optional, build)
|
||||||
get_single_child(name, &rule, optional, build)
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ChildSpec::SingleChild(SingleChild::from_name_snake(child_spec.as_str().unwrap()))
|
ChildSpec::SingleChild(SingleChild::from_name_snake(child_spec.as_str().unwrap()))
|
||||||
|
|||||||
@ -61,8 +61,21 @@ fn generate_build_file(build_specs: &[BuildSpec]) -> AstGeneratedFile {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn generate_node_file(build_specs: &[BuildSpec]) -> AstGeneratedFile {
|
||||||
|
let types = build_specs.iter()
|
||||||
|
.map(|build_spec| make_type(build_spec))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
let combined = quote! {
|
||||||
|
#(#types)*
|
||||||
|
};
|
||||||
|
AstGeneratedFile {
|
||||||
|
name: String::from("node.rs"),
|
||||||
|
contents: token_stream_to_string(combined)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn generate_files(build_specs: &[BuildSpec]) -> Vec<AstGeneratedFile> {
|
pub fn generate_files(build_specs: &[BuildSpec]) -> Vec<AstGeneratedFile> {
|
||||||
vec![generate_build_file(build_specs)]
|
vec![generate_build_file(build_specs), generate_node_file(build_specs)]
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn test_dump() -> String {
|
pub fn test_dump() -> String {
|
||||||
|
|||||||
@ -352,6 +352,22 @@ impl SingleTypeChildToBuild {
|
|||||||
optional,
|
optional,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn new(
|
||||||
|
build: &str,
|
||||||
|
var_name: &str,
|
||||||
|
with: &str,
|
||||||
|
or_else: Option<String>,
|
||||||
|
optional: bool,
|
||||||
|
) -> Self {
|
||||||
|
Self {
|
||||||
|
build: build.to_string(),
|
||||||
|
var_name: var_name.to_string(),
|
||||||
|
with: with.to_string(),
|
||||||
|
or_else,
|
||||||
|
optional,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// The type to build, in Pascal case.
|
/// The type to build, in Pascal case.
|
||||||
pub fn build(&self) -> &str {
|
pub fn build(&self) -> &str {
|
||||||
|
|||||||
@ -136,7 +136,7 @@ fn make_struct_type(build_spec: &StructBuildSpec) -> TokenStream {
|
|||||||
&mut accessors,
|
&mut accessors,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
_ => todo!()
|
_ => {}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -164,7 +164,7 @@ fn make_struct_type(build_spec: &StructBuildSpec) -> TokenStream {
|
|||||||
pub fn make_type(build_spec: &BuildSpec) -> TokenStream {
|
pub fn make_type(build_spec: &BuildSpec) -> TokenStream {
|
||||||
match build_spec {
|
match build_spec {
|
||||||
BuildSpec::Enum(enum_build_spec) => make_enum_type(enum_build_spec),
|
BuildSpec::Enum(enum_build_spec) => make_enum_type(enum_build_spec),
|
||||||
BuildSpec::LeafEnum(leaf_enum_build_spec) => todo!(),
|
BuildSpec::LeafEnum(leaf_enum_build_spec) => quote! {},
|
||||||
BuildSpec::Struct(struct_build_spec) => make_struct_type(struct_build_spec),
|
BuildSpec::Struct(struct_build_spec) => make_struct_type(struct_build_spec),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,12 +1,10 @@
|
|||||||
|
pub mod node {
|
||||||
|
include!(concat!(env!("OUT_DIR"), "/src/ast/node.rs"));
|
||||||
|
}
|
||||||
|
|
||||||
pub mod build {
|
pub mod build {
|
||||||
//noinspection RsUnusedImport
|
//noinspection RsUnusedImport
|
||||||
use crate::parser::Rule;
|
use crate::parser::Rule;
|
||||||
|
|
||||||
include!(concat!(env!("OUT_DIR"), "/src/ast/build.rs"));
|
include!(concat!(env!("OUT_DIR"), "/src/ast/build.rs"));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub mod children;
|
|
||||||
pub mod node;
|
|
||||||
pub mod pretty_print;
|
|
||||||
pub mod unparse;
|
|
||||||
pub mod walk;
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user