diff --git a/crates/fayalite-proc-macros-impl/src/process_cfg.rs b/crates/fayalite-proc-macros-impl/src/process_cfg.rs index 3db5c15..06193cc 100644 --- a/crates/fayalite-proc-macros-impl/src/process_cfg.rs +++ b/crates/fayalite-proc-macros-impl/src/process_cfg.rs @@ -271,27 +271,60 @@ impl, P: Phase> Process

for Box { } } +trait ProcessVecElement { + const REMOVE_ELEMENTS: bool; +} + +impl ProcessVecElement for syn::Stmt { + const REMOVE_ELEMENTS: bool = true; +} + +impl ProcessVecElement for syn::ForeignItem { + const REMOVE_ELEMENTS: bool = true; +} + +impl ProcessVecElement for syn::ImplItem { + const REMOVE_ELEMENTS: bool = true; +} + +impl ProcessVecElement for syn::Item { + const REMOVE_ELEMENTS: bool = true; +} + +impl ProcessVecElement for syn::TraitItem { + const REMOVE_ELEMENTS: bool = true; +} + +impl + ProcessVecElement, P: Phase> Process

for Vec { + fn process(self, state: &mut State

) -> Option> { + let mut output = Output::new(Vec::new()); + for value in self { + if let Some(value) = value.process(state) { + output = (output, value).call(|(mut output, value)| { + output.push(value); + output + }); + } else if !T::REMOVE_ELEMENTS { + return None; + } + } + Some(output) + } +} + trait ProcessOption { /// if a configured-off value causes this value to be `None` instead of propagating the configuring-off const REMOVE_VALUE: bool; } -impl ProcessOption for Token![<] { - const REMOVE_VALUE: bool = false; -} - -impl ProcessOption for Token![>] { - const REMOVE_VALUE: bool = false; -} - -impl ProcessOption for Token![=] { - const REMOVE_VALUE: bool = false; -} - impl ProcessOption for syn::WhereClause { const REMOVE_VALUE: bool = true; } +impl ProcessOption for syn::ImplRestriction { + const REMOVE_VALUE: bool = false; +} + impl ProcessOption for (Token![=], syn::Expr) { const REMOVE_VALUE: bool = true; } @@ -300,34 +333,22 @@ impl ProcessOption for (Token![as], Ident) { const REMOVE_VALUE: bool = true; } -impl ProcessOption for Token![unsafe] { - const REMOVE_VALUE: bool = true; -} - -impl ProcessOption for Token![default] { - const REMOVE_VALUE: bool = true; -} - -impl ProcessOption for Token![const] { - const REMOVE_VALUE: bool = true; -} - -impl ProcessOption for Token![async] { - const REMOVE_VALUE: bool = true; -} - impl ProcessOption for (Option, syn::Path, Token![for]) { const REMOVE_VALUE: bool = false; } -impl ProcessOption for syn::Abi { - const REMOVE_VALUE: bool = false; -} - impl ProcessOption for syn::Variadic { const REMOVE_VALUE: bool = true; } +impl ProcessOption for (Box, Token![:]) { + const REMOVE_VALUE: bool = false; +} + +impl ProcessOption for (syn::token::Brace, Vec) { + const REMOVE_VALUE: bool = false; +} + impl + ProcessOption, P: Phase> Process

for Option { fn process(self, state: &mut State

) -> Option> { if let Some(this) = self { @@ -403,19 +424,8 @@ impl ProcessPunctuatedElement for syn::FnArg { const REMOVE_ELEMENTS: bool = true; } -impl Process

for Vec { - fn process(self, state: &mut State

) -> Option> { - let mut output = Output::new(Vec::new()); - for value in self { - if let Some(value) = value.process(state) { - output = (output, value).call(|(mut output, value)| { - output.push(value); - output - }); - } - } - Some(output) - } +impl ProcessPunctuatedElement for syn::TypeParamBound { + const REMOVE_ELEMENTS: bool = true; } impl, U: Process

, P: Phase> Process

for (T, U) { @@ -444,12 +454,17 @@ macro_rules! process_no_op { Some(Output::new(self)) } } + + impl ProcessOption for $ty { + const REMOVE_VALUE: bool = false; + } }; } process_no_op!(syn::Visibility); process_no_op!(syn::Lifetime); process_no_op!(syn::Abi); +process_no_op!(syn::StaticMutability); process_no_op!(Token![as]); process_no_op!(Token![async]); process_no_op!(Token![auto]); @@ -495,14 +510,53 @@ process_no_op!(Token![use]); process_no_op!(Token![where]); process_no_op!(Token![while]); process_no_op!(Token![yield]); +process_no_op!(Token![&]); +process_no_op!(Token![&&]); +process_no_op!(Token![&=]); +process_no_op!(Token![@]); +process_no_op!(Token![^]); +process_no_op!(Token![^=]); process_no_op!(Token![:]); -process_no_op!(Token![::]); -process_no_op!(Token![;]); -process_no_op!(Token![=]); -process_no_op!(Token![?]); +process_no_op!(Token![,]); +process_no_op!(Token![$]); +process_no_op!(Token![.]); process_no_op!(Token![..]); -process_no_op!(Token![<]); +process_no_op!(Token![...]); +process_no_op!(Token![..=]); +process_no_op!(Token![=]); +process_no_op!(Token![==]); +process_no_op!(Token![=>]); +process_no_op!(Token![>=]); process_no_op!(Token![>]); +process_no_op!(Token![<-]); +process_no_op!(Token![<=]); +process_no_op!(Token![<]); +process_no_op!(Token![-]); +process_no_op!(Token![-=]); +process_no_op!(Token![!=]); +process_no_op!(Token![!]); +process_no_op!(Token![|]); +process_no_op!(Token![|=]); +process_no_op!(Token![||]); +process_no_op!(Token![::]); +process_no_op!(Token![%]); +process_no_op!(Token![%=]); +process_no_op!(Token![+]); +process_no_op!(Token![+=]); +process_no_op!(Token![#]); +process_no_op!(Token![?]); +process_no_op!(Token![->]); +process_no_op!(Token![;]); +process_no_op!(Token![<<]); +process_no_op!(Token![<<=]); +process_no_op!(Token![>>]); +process_no_op!(Token![>>=]); +process_no_op!(Token![/]); +process_no_op!(Token![/=]); +process_no_op!(Token![*]); +process_no_op!(Token![*=]); +process_no_op!(Token![~]); +process_no_op!(Token![_]); process_no_op!(syn::token::Brace); process_no_op!(syn::token::Bracket); process_no_op!(syn::token::Paren); @@ -1489,6 +1543,71 @@ process_enum! { } } +process_enum! { + syn::Pat { + Const, + Ident, + Lit, + Macro, + Or, + Paren, + Path, + Range, + Reference, + Rest, + Slice, + Struct, + Tuple, + TupleStruct, + Type, + Wild, + #[no_op] + _, + } +} + +process_enum! { + syn::ForeignItem { + Fn, + Static, + Type, + Macro, + #[no_op] + _, + } +} + +process_enum! { + syn::ImplItem { + Const, + Fn, + Type, + Macro, + #[no_op] + _, + } +} + +process_enum! { + syn::TypeParamBound { + Trait, + Lifetime, + #[no_op] + _, + } +} + +process_enum! { + syn::TraitItem { + Const, + Fn, + Type, + Macro, + #[no_op] + _, + } +} + impl Process

for syn::ReturnType { fn process(self, state: &mut State

) -> Option> { match self { @@ -1554,6 +1673,12 @@ impl Process

for TopItem { } } +impl Process

for syn::ImplRestriction { + fn process(self, _state: &mut State

) -> Option> { + todo!("ImplRestriction is an uninhabited type as of writing, blocked on syn implementing impl restrictions") + } +} + pub(crate) fn process_cfgs(item: syn::Item, cfgs: Cfgs) -> syn::Result> { let mut state = State:: { cfgs,