forked from libre-chip/fayalite
WIP
This commit is contained in:
parent
2a65aa2bd5
commit
e2ab549eb9
38 changed files with 5318 additions and 1201 deletions
|
|
@ -396,15 +396,29 @@ impl ToTokens for Builder {
|
|||
quote_spanned! {self.ident.span()=>
|
||||
#[automatically_derived]
|
||||
#[allow(non_camel_case_types, dead_code, private_interfaces)]
|
||||
impl #filled_impl_generics ::fayalite::expr::ToExpr for #filled_ty
|
||||
impl #filled_impl_generics ::fayalite::expr::ValueType for #filled_ty
|
||||
#filled_where_clause
|
||||
{
|
||||
type Type = #target #type_generics;
|
||||
type ValueCategory = ::fayalite::expr::value_category::ValueCategoryExpr;
|
||||
|
||||
fn ty(&self) -> <Self as ::fayalite::expr::ValueType>::Type {
|
||||
#target {
|
||||
#(#field_idents: ::fayalite::expr::ValueType::ty(&self.#field_idents),)*
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[automatically_derived]
|
||||
#[allow(non_camel_case_types, dead_code, private_interfaces)]
|
||||
impl #filled_impl_generics ::fayalite::expr::ToExpr for #filled_ty
|
||||
#filled_where_clause
|
||||
{
|
||||
fn to_expr(
|
||||
&self,
|
||||
) -> ::fayalite::expr::Expr<<Self as ::fayalite::expr::ToExpr>::Type> {
|
||||
) -> ::fayalite::expr::Expr<<Self as ::fayalite::expr::ValueType>::Type> {
|
||||
let __ty = #target {
|
||||
#(#field_idents: ::fayalite::expr::Expr::ty(self.#field_idents),)*
|
||||
#(#field_idents: ::fayalite::expr::ValueType::ty(&self.#field_idents),)*
|
||||
};
|
||||
let __field_values = [
|
||||
#(::fayalite::expr::Expr::canonical(self.#field_idents),)*
|
||||
|
|
@ -695,10 +709,10 @@ impl ToTokens for ParsedBundle {
|
|||
v.field(&value.#ident);
|
||||
}
|
||||
}));
|
||||
let to_sim_value_fields = Vec::from_iter(fields.named().into_iter().map(|field| {
|
||||
let value_type_fields = Vec::from_iter(fields.named().into_iter().map(|field| {
|
||||
let ident: &Ident = field.ident().as_ref().unwrap();
|
||||
quote_spanned! {span=>
|
||||
#ident: ::fayalite::sim::value::SimValue::ty(&self.#ident),
|
||||
#ident: ::fayalite::expr::ValueType::ty(&self.#ident),
|
||||
}
|
||||
}));
|
||||
let fields_len = fields.named().into_iter().len();
|
||||
|
|
@ -806,28 +820,39 @@ impl ToTokens for ParsedBundle {
|
|||
}
|
||||
}
|
||||
#[automatically_derived]
|
||||
impl #impl_generics ::fayalite::sim::value::ToSimValue for #mask_type_sim_value_ident #type_generics
|
||||
impl #impl_generics ::fayalite::expr::ValueType for #mask_type_sim_value_ident #type_generics
|
||||
#where_clause
|
||||
{
|
||||
type Type = #mask_type_ident #type_generics;
|
||||
type ValueCategory = ::fayalite::expr::value_category::ValueCategorySimValue;
|
||||
|
||||
fn ty(&self) -> <Self as ::fayalite::expr::ValueType>::Type {
|
||||
#mask_type_ident {
|
||||
#(#value_type_fields)*
|
||||
}
|
||||
}
|
||||
}
|
||||
#[automatically_derived]
|
||||
impl #impl_generics ::fayalite::sim::value::ToSimValue for #mask_type_sim_value_ident #type_generics
|
||||
#where_clause
|
||||
{
|
||||
fn to_sim_value(
|
||||
&self,
|
||||
) -> ::fayalite::sim::value::SimValue<
|
||||
<Self as ::fayalite::sim::value::ToSimValue>::Type,
|
||||
<Self as ::fayalite::expr::ValueType>::Type,
|
||||
> {
|
||||
let ty = #mask_type_ident {
|
||||
#(#to_sim_value_fields)*
|
||||
#(#value_type_fields)*
|
||||
};
|
||||
::fayalite::sim::value::SimValue::from_value(ty, ::fayalite::__std::clone::Clone::clone(self))
|
||||
}
|
||||
fn into_sim_value(
|
||||
self,
|
||||
) -> ::fayalite::sim::value::SimValue<
|
||||
<Self as ::fayalite::sim::value::ToSimValue>::Type,
|
||||
<Self as ::fayalite::expr::ValueType>::Type,
|
||||
> {
|
||||
let ty = #mask_type_ident {
|
||||
#(#to_sim_value_fields)*
|
||||
#(#value_type_fields)*
|
||||
};
|
||||
::fayalite::sim::value::SimValue::from_value(ty, self)
|
||||
}
|
||||
|
|
@ -955,28 +980,39 @@ impl ToTokens for ParsedBundle {
|
|||
}
|
||||
}
|
||||
#[automatically_derived]
|
||||
impl #impl_generics ::fayalite::sim::value::ToSimValue for #sim_value_ident #type_generics
|
||||
impl #impl_generics ::fayalite::expr::ValueType for #sim_value_ident #type_generics
|
||||
#where_clause
|
||||
{
|
||||
type Type = #target #type_generics;
|
||||
type ValueCategory = ::fayalite::expr::value_category::ValueCategorySimValue;
|
||||
|
||||
fn ty(&self) -> <Self as ::fayalite::expr::ValueType>::Type {
|
||||
#target {
|
||||
#(#value_type_fields)*
|
||||
}
|
||||
}
|
||||
}
|
||||
#[automatically_derived]
|
||||
impl #impl_generics ::fayalite::sim::value::ToSimValue for #sim_value_ident #type_generics
|
||||
#where_clause
|
||||
{
|
||||
fn to_sim_value(
|
||||
&self,
|
||||
) -> ::fayalite::sim::value::SimValue<
|
||||
<Self as ::fayalite::sim::value::ToSimValue>::Type,
|
||||
<Self as ::fayalite::expr::ValueType>::Type,
|
||||
> {
|
||||
let ty = #target {
|
||||
#(#to_sim_value_fields)*
|
||||
#(#value_type_fields)*
|
||||
};
|
||||
::fayalite::sim::value::SimValue::from_value(ty, ::fayalite::__std::clone::Clone::clone(self))
|
||||
}
|
||||
fn into_sim_value(
|
||||
self,
|
||||
) -> ::fayalite::sim::value::SimValue<
|
||||
<Self as ::fayalite::sim::value::ToSimValue>::Type,
|
||||
<Self as ::fayalite::expr::ValueType>::Type,
|
||||
> {
|
||||
let ty = #target {
|
||||
#(#to_sim_value_fields)*
|
||||
#(#value_type_fields)*
|
||||
};
|
||||
::fayalite::sim::value::SimValue::from_value(ty, self)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1024,16 +1024,26 @@ impl ToTokens for ParsedEnum {
|
|||
<::fayalite::int::Bool as ::fayalite::ty::StaticType>::TYPE_PROPERTIES;
|
||||
}
|
||||
#[automatically_derived]
|
||||
impl #static_impl_generics ::fayalite::sim::value::ToSimValue
|
||||
impl #static_impl_generics ::fayalite::expr::ValueType
|
||||
for #sim_value_ident #static_type_generics
|
||||
#static_where_clause
|
||||
{
|
||||
type Type = #target #static_type_generics;
|
||||
type ValueCategory = ::fayalite::expr::value_category::ValueCategorySimValue;
|
||||
|
||||
fn ty(&self) -> <Self as ::fayalite::expr::ValueType>::Type {
|
||||
::fayalite::ty::StaticType::TYPE
|
||||
}
|
||||
}
|
||||
#[automatically_derived]
|
||||
impl #static_impl_generics ::fayalite::sim::value::ToSimValue
|
||||
for #sim_value_ident #static_type_generics
|
||||
#static_where_clause
|
||||
{
|
||||
fn to_sim_value(
|
||||
&self,
|
||||
) -> ::fayalite::sim::value::SimValue<
|
||||
<Self as ::fayalite::sim::value::ToSimValue>::Type,
|
||||
<Self as ::fayalite::expr::ValueType>::Type,
|
||||
> {
|
||||
::fayalite::sim::value::SimValue::from_value(
|
||||
::fayalite::ty::StaticType::TYPE,
|
||||
|
|
@ -1043,7 +1053,7 @@ impl ToTokens for ParsedEnum {
|
|||
fn into_sim_value(
|
||||
self,
|
||||
) -> ::fayalite::sim::value::SimValue<
|
||||
<Self as ::fayalite::sim::value::ToSimValue>::Type,
|
||||
<Self as ::fayalite::expr::ValueType>::Type,
|
||||
> {
|
||||
::fayalite::sim::value::SimValue::from_value(
|
||||
::fayalite::ty::StaticType::TYPE,
|
||||
|
|
|
|||
|
|
@ -887,7 +887,13 @@ pub(crate) fn outline_generated(contents: TokenStream, prefix: &str) -> TokenStr
|
|||
}
|
||||
}
|
||||
let _print_on_panic = PrintOnPanic(&contents);
|
||||
let contents = prettyplease::unparse(&parse_quote! { #contents });
|
||||
let mut parse_err = None;
|
||||
let (Ok(contents) | Err(contents)) = syn::parse2(contents.clone())
|
||||
.map(|file| prettyplease::unparse(&file))
|
||||
.map_err(|e| {
|
||||
parse_err = Some(e);
|
||||
contents.to_string()
|
||||
});
|
||||
let hash = <sha2::Sha256 as sha2::Digest>::digest(&contents);
|
||||
let hash = base16ct::HexDisplay(&hash[..5]);
|
||||
file.write_all(contents.as_bytes()).unwrap();
|
||||
|
|
@ -899,9 +905,26 @@ pub(crate) fn outline_generated(contents: TokenStream, prefix: &str) -> TokenStr
|
|||
e.unwrap();
|
||||
}
|
||||
}
|
||||
eprintln!("generated {}", dest_file.display());
|
||||
let log_msg = if let Some(parse_err) = parse_err {
|
||||
format!(
|
||||
"fayalite-proc-macros-impl internal error:\nfailed to parse generated output: {parse_err}\nunformatted output is in: {}\n",
|
||||
dest_file.display()
|
||||
)
|
||||
} else {
|
||||
format!("generated {}\n", dest_file.display())
|
||||
};
|
||||
// write message atomically if possible
|
||||
let mut stderr = std::io::stderr().lock();
|
||||
let write_result = stderr.write_all(log_msg.as_bytes());
|
||||
let flush_result = stderr.flush();
|
||||
drop(stderr); // unlock before we try to panic
|
||||
write_result.unwrap();
|
||||
flush_result.unwrap();
|
||||
std::io::stderr()
|
||||
.lock()
|
||||
.write_all(log_msg.as_bytes())
|
||||
.unwrap();
|
||||
let dest_file = dest_file.to_str().unwrap();
|
||||
|
||||
quote! {
|
||||
include!(#dest_file);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue