mod private
{
use crate :: *;
use macro_tools ::exposed :: *;
use std ::collections ::HashMap;
#[ allow( dead_code ) ]
pub struct RecordContext< 'clauses_map >
{
pub has_debug: bool,
pub clauses_map: &'clauses_map mut HashMap< ClauseKind, Vec< proc_macro2 ::TokenStream >>,
}
fn record_reuse_implicit(record: &Record, c: &'_ mut RecordContext< '_ >) -> syn ::Result< () >
{
let attrs1 = &record.attrs;
let path = record.use_elements.as_ref().unwrap();
let path = if let Some(rename) = &path.rename
{
let pure_path = path.pure_without_super_path()?;
c.clauses_map.get_mut(&ClauseImmediates ::Kind()).unwrap().push(qt! {
pub use #pure_path as #rename;
});
parse_qt! { #rename }
} else {
path.clone()
};
let adjsuted_path = path.prefixed_with_all();
c.clauses_map.get_mut(&ClauseKind::Own).unwrap().push(qt! {
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
#attrs1
pub use #adjsuted_path ::own :: *;
});
c.clauses_map.get_mut(&ClauseKind::Orphan).unwrap().push(qt! {
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
#attrs1
pub use #adjsuted_path ::orphan :: *;
});
c.clauses_map.get_mut(&ClauseKind::Exposed).unwrap().push(qt! {
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
#attrs1
pub use #adjsuted_path ::exposed :: *;
});
c.clauses_map.get_mut(&ClauseKind::Prelude).unwrap().push(qt! {
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
#attrs1
pub use #adjsuted_path ::prelude :: *;
});
Ok(())
}
fn record_use_implicit(record: &Record, c: &'_ mut RecordContext< '_ >) -> syn ::Result< () >
{
let attrs1 = &record.attrs;
let path = record.use_elements.as_ref().unwrap();
if path.private_prefix_is_needed()
{
let adjusted_path = path.prefixed_with_all();
c.clauses_map.get_mut(&ClauseKind::Own).unwrap().push(qt! {
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
#attrs1
pub use #adjusted_path;
});
c.clauses_map.get_mut(&ClauseKind::Orphan).unwrap().push(qt! {
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
#attrs1
pub use #adjusted_path;
});
c.clauses_map.get_mut(&ClauseKind::Exposed).unwrap().push(qt! {
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
#attrs1
pub use #adjusted_path;
});
c.clauses_map.get_mut(&ClauseKind::Prelude).unwrap().push(qt! {
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
#attrs1
pub use #adjusted_path;
});
}
else
{
let path = if let Some(rename) = &path.rename
{
let pure_path = path.pure_without_super_path()?;
c.clauses_map.get_mut(&ClauseImmediates ::Kind()).unwrap().push(qt! {
pub use #pure_path as #rename;
});
parse_qt! { #rename }
} else {
path.clone()
};
let adjusted_path = path.prefixed_with_all();
c.clauses_map.get_mut(&ClauseKind::Own).unwrap().push(qt! {
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
#attrs1
pub use #adjusted_path;
});
c.clauses_map.get_mut(&ClauseKind::Own).unwrap().push(qt! {
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
#attrs1
pub use #adjusted_path ::orphan :: *;
});
c.clauses_map.get_mut(&ClauseKind::Exposed).unwrap().push(qt! {
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
#attrs1
pub use #adjusted_path ::exposed :: *;
});
c.clauses_map.get_mut(&ClauseKind::Prelude).unwrap().push(qt! {
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
#attrs1
pub use #adjusted_path ::prelude :: *;
});
}
Ok(())
}
fn record_use_explicit(record: &Record, c: &'_ mut RecordContext< '_ >) -> syn ::Result< () >
{
let attrs1 = &record.attrs;
let path = record.use_elements.as_ref().unwrap();
let vis = record.vis.clone();
if !vis.valid_sub_namespace()
{
return Err(syn_err!(
record,
"Use either {} visibility: \n {}",
VALID_VISIBILITY_LIST_STR,
qt! { #record },
));
}
let adjsuted_path = path.prefixed_with_all();
let vis2 = if vis.restriction().is_some()
{
qt! { pub( crate ) }
} else {
qt! { pub }
};
c.clauses_map.get_mut(&vis.kind()).unwrap().push(qt! {
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
#attrs1
#vis2 use #adjsuted_path;
});
Ok(())
}
fn record_micro_module(
record: &Record,
element: &Pair< AttributesOuter, syn ::Path >,
c: &'_ mut RecordContext< '_ >,
) -> syn ::Result< () > {
let attrs1 = &record.attrs;
let attrs2 = &element.0;
let path = &element.1;
c.clauses_map.get_mut(&ClauseImmediates ::Kind()).unwrap().push(qt! {
#attrs1
#attrs2
pub mod #path;
});
if !record.vis.valid_sub_namespace()
{
return Err(syn_err!(
record,
"To include a non-standard module use either { } visibility: \n {}",
VALID_VISIBILITY_LIST_STR,
qt! { #record },
));
}
c.clauses_map.get_mut(&record.vis.kind()).unwrap().push(qt! {
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
#attrs1
#attrs2
pub use __all__ :: #path;
});
Ok(())
}
#[ allow( dead_code ) ]
fn record_layer(record: &Record, element: &Pair< AttributesOuter, syn ::Path >, c: &'_ mut RecordContext< '_ >) -> syn ::Result< () >
{
let attrs1 = &record.attrs;
let attrs2 = &element.0;
let path = &element.1;
if record.vis != Visibility ::Inherited
{
return Err(syn_err!(
record,
"Layer should not have explicitly defined visibility because all its subnamespaces are used.\n { }",
qt! { #record },
));
}
c.clauses_map.get_mut(&ClauseImmediates ::Kind()).unwrap().push(qt! {
#attrs1
#attrs2
pub mod #path;
});
c.clauses_map.get_mut(&ClauseKind::Own).unwrap().push(qt! {
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
#attrs1
#attrs2
pub use __all__ :: #path ::orphan :: *;
});
c.clauses_map.get_mut(&ClauseKind::Own).unwrap().push(qt! {
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
#attrs1
pub use super :: #path;
});
c.clauses_map.get_mut(&ClauseKind::Exposed).unwrap().push(qt! {
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
#attrs1
#attrs2
pub use __all__ :: #path ::exposed :: *;
});
c.clauses_map.get_mut(&ClauseKind::Prelude).unwrap().push(qt! {
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
#attrs1
#attrs2
pub use __all__ :: #path ::prelude :: *;
});
Ok(())
}
#[ allow( dead_code, clippy ::too_many_lines ) ]
pub fn mod_interface(input: proc_macro ::TokenStream) -> syn ::Result< proc_macro2 ::TokenStream >
{
#[ allow( clippy ::enum_glob_use ) ]
use ElementType :: *;
let original_input = input.clone();
let document = syn ::parse :: < Thesis >(input)?;
document.inner_attributes_validate()?;
let has_debug = document.has_debug();
let mut clauses_map: HashMap< _, Vec< proc_macro2 ::TokenStream >> = HashMap ::new();
clauses_map.insert(ClauseImmediates ::Kind(), Vec ::new());
clauses_map.insert(ClauseKind::Own, Vec ::new());
clauses_map.insert(ClauseKind::Orphan, Vec ::new());
clauses_map.insert(ClauseKind::Exposed, Vec ::new());
clauses_map.insert(ClauseKind::Prelude, Vec ::new());
let mut record_context = RecordContext :: < '_ > {
has_debug,
clauses_map: &mut clauses_map,
};
document.records.0.iter().try_for_each(|record| {
match record.element_type
{
Use(_) =>
{
let vis = &record.vis;
if vis == &Visibility ::Inherited
{
record_use_implicit(record, &mut record_context)?;
} else {
record_use_explicit(record, &mut record_context)?;
}
}
Reuse(_) =>
{
let vis = &record.vis;
if vis == &Visibility ::Inherited
{
record_reuse_implicit(record, &mut record_context)?;
} else {
return Err(syn_err!(
record,
"Using visibility usesd before `reuse` is illegal\n{}",
qt! { #record },
));
}
}
_ =>
{
record.elements.iter().try_for_each(|element| -> syn ::Result< () > {
match record.element_type
{
MicroModule(_) =>
{
record_micro_module(record, element, &mut record_context)?;
}
Layer(_) =>
{
record_layer(record, element, &mut record_context)?;
}
_ =>
{
panic!("Unexpected")
}
}
syn ::Result ::Ok(())
})?;
}
}
syn ::Result ::Ok(())
})?;
let immediates_clause = clauses_map.get(&ClauseImmediates ::Kind()).unwrap();
let own_clause = clauses_map.get(&ClauseKind::Own).unwrap();
let orphan_clause = clauses_map.get(&ClauseKind::Orphan).unwrap();
let exposed_clause = clauses_map.get(&ClauseKind::Exposed).unwrap();
let prelude_clause = clauses_map.get(&ClauseKind::Prelude).unwrap();
let result = qt! {
#( #immediates_clause )*
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
pub use own :: *;
#[ allow( unused_imports ) ]
pub mod own
{
use super ::private; mod __all__
{
pub use super ::super :: *;
pub use super ::super ::private :: *;
}
#[ doc( inline ) ]
pub use super ::orphan :: *;
#( #own_clause )*
}
#[ allow( unused_imports ) ]
pub mod orphan
{
mod __all__
{
pub use super ::super :: *;
pub use super ::super ::private :: *;
}
#[ doc( inline ) ]
pub use super ::exposed :: *;
#( #orphan_clause )*
}
#[ allow( unused_imports ) ]
pub mod exposed
{
mod __all__
{
pub use super ::super :: *;
pub use super ::super ::private :: *;
}
#[ doc( inline ) ]
pub use super ::prelude :: *;
#( #exposed_clause )*
}
#[ allow( unused_imports ) ]
pub mod prelude
{
mod __all__
{
pub use super ::super :: *;
pub use super ::super ::private :: *;
}
#( #prelude_clause )*
}
};
if has_debug
{
let about = "derive: mod_interface";
diag ::report_print(about, &original_input, &result);
}
Ok(result)
}
}
#[ allow( unused_imports ) ]
pub mod own
{
use super :: *;
pub use orphan :: *;
}
pub use own :: *;
#[ allow( unused_imports ) ]
pub mod orphan
{
use super :: *;
pub use exposed :: *;
}
#[ allow( unused_imports ) ]
pub mod exposed
{
use super :: *;
pub use prelude :: *;
pub use private :: { };
}
#[ allow( unused_imports ) ]
pub mod prelude
{
use super :: *;
pub use private :: { mod_interface };
}