(input: DeriveInput)
| 1150 | } |
| 1151 | |
| 1152 | pub fn derive(input: DeriveInput) -> Result<TokenStream> { |
| 1153 | let mut where_collector = WhereCollector::new(); |
| 1154 | let ident = input.ident; |
| 1155 | let generics = &input.generics; |
| 1156 | let generic_with_a = ensure_lifetime_a(generics); |
| 1157 | let (impl_generics, _, _) = generic_with_a.split_for_impl(); |
| 1158 | let (_, type_generics, _) = generics.split_for_impl(); |
| 1159 | |
| 1160 | let mut pre_parse_steps = quote! {}; |
| 1161 | let mut post_parse_steps = quote! {}; |
| 1162 | let parse_arg = ParseArg::from_attributes(&input.attrs)?; |
| 1163 | let parse_mode = parse_arg.parse_mode(); |
| 1164 | if let Some(crate::darling_ext::StateArg(state_ident)) = parse_arg.state { |
| 1165 | pre_parse_steps = quote! { |
| 1166 | let state = p.set_state(State::#state_ident); |
| 1167 | #pre_parse_steps |
| 1168 | }; |
| 1169 | post_parse_steps = quote! { |
| 1170 | #post_parse_steps |
| 1171 | p.set_state(state); |
| 1172 | }; |
| 1173 | } |
| 1174 | if let Some(stop) = parse_arg.stop { |
| 1175 | let kind_ident = &stop.variant; |
| 1176 | pre_parse_steps = if stop.prefix == "Kind" { |
| 1177 | quote! { |
| 1178 | let stop = p.set_stop(KindSet::new(&[Kind::#kind_ident])); |
| 1179 | #pre_parse_steps |
| 1180 | } |
| 1181 | } else { |
| 1182 | quote! { |
| 1183 | let stop = p.set_stop(KindSet::#kind_ident); |
| 1184 | #pre_parse_steps |
| 1185 | } |
| 1186 | }; |
| 1187 | post_parse_steps = quote! { |
| 1188 | #post_parse_steps |
| 1189 | p.set_stop(stop); |
| 1190 | }; |
| 1191 | } |
| 1192 | |
| 1193 | let body = match &input.data { |
| 1194 | Data::Union(_) => return Err(Error::new(ident.span(), "Cannot derive Parse on a Union")), |
| 1195 | Data::Struct(data) => derive_struct_body(data, parse_mode, &post_parse_steps, &mut where_collector)?, |
| 1196 | Data::Enum(data) => derive_enum_body(data, &post_parse_steps, &mut where_collector)?, |
| 1197 | }; |
| 1198 | |
| 1199 | let generics = input.generics.clone(); |
| 1200 | let mut where_clause = where_collector.extend_where_clause(&generics, parse_quote! { ::css_parse::Parse<'a> }); |
| 1201 | // Add Peek<'a> predicate for each collected type param too. |
| 1202 | if let Some(ref mut wc) = where_clause { |
| 1203 | let additional = where_collector.extend_where_clause(&generics, parse_quote! { ::css_parse::Peek<'a> }); |
| 1204 | if let Some(additional) = additional { |
| 1205 | for pred in additional.predicates { |
| 1206 | if !wc.predicates.iter().any(|p| p == &pred) { |
| 1207 | wc.predicates.push(pred); |
| 1208 | } |
| 1209 | } |
nothing calls this directly
no test coverage detected