Skip to content

Commit

Permalink
Use re-exported ::core from musli
Browse files Browse the repository at this point in the history
  • Loading branch information
udoprog committed Mar 29, 2024
1 parent 4f50ede commit b8b094d
Show file tree
Hide file tree
Showing 7 changed files with 125 additions and 102 deletions.
107 changes: 57 additions & 50 deletions crates/musli-macros/src/de.rs

Large diffs are not rendered by default.

59 changes: 29 additions & 30 deletions crates/musli-macros/src/en.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,16 +62,18 @@ pub(crate) fn expand_insert_entry(e: Build<'_>) -> Result<TokenStream> {
let (_, type_generics, _) = e.input.generics.split_for_impl();

Ok(quote! {
#[automatically_derived]
impl #impl_generics #encode_t<#mode_ident> for #type_ident #type_generics #where_clause {
#[inline]
fn encode<#e_param>(&self, #ctx_var: &#e_param::Cx, #encoder_var: #e_param) -> #result<<#e_param as #encoder_t>::Ok, <#e_param as #encoder_t>::Error>
where
#e_param: #encoder_t<Mode = #mode_ident>,
{
#body
const _: () = {
#[automatically_derived]
impl #impl_generics #encode_t<#mode_ident> for #type_ident #type_generics #where_clause {
#[inline]
fn encode<#e_param>(&self, #ctx_var: &#e_param::Cx, #encoder_var: #e_param) -> #result<<#e_param as #encoder_t>::Ok, <#e_param as #encoder_t>::Error>
where
#e_param: #encoder_t<Mode = #mode_ident>,
{
#body
}
}
}
};
})
}

Expand All @@ -86,7 +88,7 @@ fn encode_struct(cx: &Ctxt<'_>, e: &Build<'_>, st: &Body<'_>) -> Result<TokenStr
let Tokens {
context_t,
encoder_t,
result,
result_ok,
..
} = e.tokens;

Expand Down Expand Up @@ -135,7 +137,7 @@ fn encode_struct(cx: &Ctxt<'_>, e: &Build<'_>, st: &Body<'_>) -> Result<TokenStr
#(#decls)*
let #output_var = #encoder_t::encode_struct_fn(#encoder_var, #len, |#encoder_var| {
#(#encoders)*
#result::Ok(())
#result_ok(())
})?;
#leave
#output_var
Expand All @@ -149,15 +151,15 @@ fn encode_struct(cx: &Ctxt<'_>, e: &Build<'_>, st: &Body<'_>) -> Result<TokenStr
let #output_var = #encoder_t::encode_pack_fn(#encoder_var, |#pack_var| {
#(#decls)*
#(#encoders)*
#result::Ok(())
#result_ok(())
})?;
#leave
#output_var
}};
}
}

Ok(quote!(#result::Ok(#encode)))
Ok(quote!(#result_ok(#encode)))
}

struct FieldTest<'st> {
Expand All @@ -180,7 +182,8 @@ fn insert_fields<'st>(
let Tokens {
context_t,
pack_encoder_t,
result,
result_ok,

struct_encoder_t,
struct_field_encoder_t,
..
Expand Down Expand Up @@ -238,7 +241,7 @@ fn insert_fields<'st>(
#encode_t_encode(&#tag, #ctx_var, #field_encoder_var)?;
let #value_encoder_var = #struct_field_encoder_t::encode_field_value(#pair_encoder_var)?;
#encode_path(#access, #ctx_var, #value_encoder_var)?;
#result::Ok(())
#result_ok(())
})?;

#leave
Expand Down Expand Up @@ -281,7 +284,7 @@ fn encode_enum(cx: &Ctxt<'_>, e: &Build<'_>, en: &Enum<'_>) -> Result<TokenStrea
let Ctxt { ctx_var, .. } = *cx;

let Tokens {
context_t, result, ..
context_t, result_ok, result_err, ..
} = e.tokens;

let type_name = en.name;
Expand All @@ -303,13 +306,9 @@ fn encode_enum(cx: &Ctxt<'_>, e: &Build<'_>, en: &Enum<'_>) -> Result<TokenStrea

// Special case: uninhabitable types.
Ok(if variants.is_empty() {
quote!(#result::Err(#context_t::uninhabitable(#ctx_var, #type_name)))
quote!(#result_err(#context_t::uninhabitable(#ctx_var, #type_name)))
} else {
quote! {
#result::Ok(match self {
#(#variants),*
})
}
quote!(#result_ok(match self { #(#variants),* }))
})
}

Expand All @@ -333,7 +332,7 @@ fn encode_variant(
let Tokens {
context_t,
encoder_t,
result,
result_ok,
struct_encoder_t,
struct_field_encoder_t,
variant_encoder_t,
Expand Down Expand Up @@ -364,7 +363,7 @@ fn encode_variant(
#encoder_t::encode_pack_fn(#encoder_var, |#pack_var| {
#(#decls)*
#(#encoders)*
#result::Ok(())
#result_ok(())
})?
}};
}
Expand All @@ -376,7 +375,7 @@ fn encode_variant(
#encoder_t::encode_struct_fn(#encoder_var, #len, |#encoder_var| {
#(#decls)*
#(#encoders)*
#result::Ok(())
#result_ok(())
})?
}};
}
Expand All @@ -395,7 +394,7 @@ fn encode_variant(

let #encoder_var = #variant_encoder_t::encode_value(#variant_encoder)?;
#encode;
#result::Ok(())
#result_ok(())
})?
}};
}
Expand All @@ -414,7 +413,7 @@ fn encode_variant(
#struct_encoder_t::insert_struct_field(#encoder_var, #field_tag, #tag)?;
#(#decls)*
#(#encoders)*
#result::Ok(())
#result_ok(())
})?
}};
}
Expand Down Expand Up @@ -449,13 +448,13 @@ fn encode_variant(
#encoder_t::encode_struct_fn(#content_struct, #len, |#encoder_var| {
#(#decls)*
#(#encoders)*
#result::Ok(())
#result_ok(())
})?;

#result::Ok(())
#result_ok(())
})?;

#result::Ok(())
#result_ok(())
})?
}};
}
Expand Down
2 changes: 2 additions & 0 deletions crates/musli-macros/src/expander.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ pub(crate) struct FieldData<'a> {
pub(crate) name: Option<syn::LitStr>,
pub(crate) attr: attr::Field,
pub(crate) ident: Option<&'a syn::Ident>,
pub(crate) ty: &'a syn::Type,
}

pub(crate) struct StructData<'a> {
Expand Down Expand Up @@ -81,6 +82,7 @@ impl<'a> Expander<'a> {
.map(|ident| syn::LitStr::new(&ident.to_string(), ident.span())),
attr: attr::field_attrs(cx, &field.attrs),
ident: field.ident.as_ref(),
ty: &field.ty,
})
.collect()
}
Expand Down
2 changes: 2 additions & 0 deletions crates/musli-macros/src/internals/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,7 @@ pub(crate) struct Field<'a> {
pub(crate) member: syn::Member,
pub(crate) packing: Packing,
pub(crate) var: syn::Ident,
pub(crate) ty: &'a syn::Type,
}

/// Setup a build.
Expand Down Expand Up @@ -477,6 +478,7 @@ fn setup_field<'a>(
member,
packing,
var,
ty: data.ty,
})
}

Expand Down
11 changes: 7 additions & 4 deletions crates/musli-macros/src/internals/ctxt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,13 @@ impl Ctxt {

#[cfg(not(feature = "verbose"))]
{
_ = write!(inner.b1, "_{extra}{index}");
_ = write!(inner.b1, "_{index}{extra}");
}

#[cfg(feature = "verbose")]
{
let name = name.strip_prefix("_").unwrap_or(name);
_ = write!(inner.b1, "_{extra}{name}");
_ = write!(inner.b1, "_{name}{extra}");
}

let ident = syn::Ident::new(&inner.b1, span);
Expand All @@ -106,7 +106,10 @@ impl Ctxt {

/// Build a type identifier with a span.
pub(crate) fn type_with_span(&self, name: &str, span: Span) -> syn::Ident {
let name = format!("T{name}");
syn::Ident::new(&name, span)
let mut inner = self.inner.borrow_mut();
_ = write!(inner.b1, "__{name}");
let ident = syn::Ident::new(&inner.b1, span);
inner.b1.clear();
ident
}
}
29 changes: 11 additions & 18 deletions crates/musli-macros/src/internals/tokens.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
use proc_macro2::Span;
use syn::Token;

pub(crate) struct Tokens {
pub(crate) as_decoder_t: syn::Path,
Expand All @@ -14,11 +13,14 @@ pub(crate) struct Tokens {
pub(crate) encode_t: syn::Path,
pub(crate) encoder_t: syn::Path,
pub(crate) fmt: syn::Path,
pub(crate) option: syn::Path,
pub(crate) option_none: syn::Path,
pub(crate) option_some: syn::Path,
pub(crate) pack_decoder_t: syn::Path,
pub(crate) pack_encoder_t: syn::Path,
pub(crate) result: syn::Path,
pub(crate) result_ok: syn::Path,
pub(crate) result_err: syn::Path,
pub(crate) skip: syn::Path,
pub(crate) str_ty: syn::Path,
pub(crate) struct_decoder_t: syn::Path,
Expand All @@ -41,21 +43,24 @@ impl Tokens {
decode_t: path(span, prefix, ["de", "Decode"]),
decode_bytes_t: path(span, prefix, ["de", "DecodeBytes"]),
decoder_t: path(span, prefix, ["de", "Decoder"]),
default_function: core(span, ["default", "Default", "default"]),
default_function: path(span, prefix, ["__priv", "default"]),
default_mode: path(span, prefix, ["mode", "DefaultMode"]),
encode_t: path(span, prefix, ["en", "Encode"]),
encode_bytes_t: path(span, prefix, ["en", "EncodeBytes"]),
encoder_t: path(span, prefix, ["en", "Encoder"]),
fmt: core(span, ["fmt"]),
option_none: core(span, ["option", "Option", "None"]),
option_some: core(span, ["option", "Option", "Some"]),
fmt: path(span, prefix, ["__priv", "fmt"]),
option: path(span, prefix, ["__priv", "Option"]),
option_none: path(span, prefix, ["__priv", "None"]),
option_some: path(span, prefix, ["__priv", "Some"]),
pack_decoder_t: path(span, prefix, ["de", "PackDecoder"]),
str_ty: primitive(span, "str"),
struct_decoder_t: path(span, prefix, ["de", "StructDecoder"]),
struct_field_decoder_t: path(span, prefix, ["de", "StructFieldDecoder"]),
struct_encoder_t: path(span, prefix, ["en", "StructEncoder"]),
struct_field_encoder_t: path(span, prefix, ["en", "StructFieldEncoder"]),
result: core(span, ["result", "Result"]),
result: path(span, prefix, ["__priv", "Result"]),
result_ok: path(span, prefix, ["__priv", "Ok"]),
result_err: path(span, prefix, ["__priv", "Err"]),
skip: path(span, prefix, ["de", "Skip"]),
pack_encoder_t: path(span, prefix, ["en", "PackEncoder"]),
trace_decode_t: path(span, prefix, ["de", "TraceDecode"]),
Expand All @@ -77,18 +82,6 @@ fn path<const N: usize>(span: Span, prefix: &syn::Path, segments: [&'static str;
path
}

fn core<const N: usize>(span: Span, segments: [&'static str; N]) -> syn::Path {
let core = syn::Ident::new("core", span);
let mut path = syn::Path::from(core);
path.leading_colon = Some(<Token![::]>::default());

for segment in segments {
path.segments.push(syn::Ident::new(segment, span).into());
}

path
}

fn primitive(span: Span, primitive: &'static str) -> syn::Path {
let core = syn::Ident::new(primitive, span);
syn::Path::from(core)
Expand Down
17 changes: 17 additions & 0 deletions crates/musli/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -575,3 +575,20 @@ pub use musli_macros::decoder;
/// ```
#[doc(inline)]
pub use musli_macros::visitor;

/// Internal implementation details of musli.
///
/// Using these directly is not supported.
#[doc(hidden)]
pub mod __priv {
pub use ::core::option::Option;
pub use ::core::result::Result;
pub use ::core::fmt;

pub fn default<T>() -> T where T: ::core::default::Default {
::core::default::Default::default()
}

pub use Option::{None, Some};
pub use Result::{Ok, Err};
}

0 comments on commit b8b094d

Please sign in to comment.