MCPcopy Create free account
hub / github.com/csskit/csskit / derive

Function derive

crates/csskit_derives/src/parse.rs:1152–1226  ·  view source on GitHub ↗
(input: DeriveInput)

Source from the content-addressed store, hash-verified

1150}
1151
1152pub 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 }

Callers

nothing calls this directly

Calls 9

ensure_lifetime_aFunction · 0.85
ErrClass · 0.85
derive_struct_bodyFunction · 0.85
derive_enum_bodyFunction · 0.85
parse_modeMethod · 0.80
cloneMethod · 0.80
extend_where_clauseMethod · 0.80
iterMethod · 0.80
spanMethod · 0.45

Tested by

no test coverage detected