Skip to content

Implement Recursive Referential Params#121

Merged
azriel91 merged 78 commits intomainfrom
feature/119/recursive-referential-params
May 19, 2023
Merged

Implement Recursive Referential Params#121
azriel91 merged 78 commits intomainfrom
feature/119/recursive-referential-params

Conversation

@azriel91
Copy link
Copy Markdown
Owner

@azriel91 azriel91 commented May 9, 2023

Closes #119.

Handy for checking parameter expansion and getting actual errors annotated on code:

cargo expand --tests --package workspace_tests params::enum_recursive_marker_no_bounds \
  | sd -f cm '^    #\[doc\(hidden\)\][\n](^[ ]{4}[a-z# ].+[\n])+^[ ]{4}\};\n' '' \
  | sd -f cm '^    #\[automatically_derived\][\n](^[ ]{4}[# a-z{].*[\n])+^[ ]{4}\{?\}\n' '' \
  | sd -f cm '^    #\[allow\(unused_qualifications\)\][\n](^[ ]{4}[# a-z{].*[\n])+^[ ]{4}\}\n' '' \
  | sd -f cm '^    #\[serde\(bound = ""\)\]' '    #[derive(Serialize, Deserialize)]\n    #[serde(bound = "")]' \
  | sd -f cm '^    extern crate test;[\n](^[ ]{4}.*[\n])+^\}' '}' \
  | sd -f cm '^(    pub struct [A-Za-z0-9_]+Partial)' '    #[derive(PartialEq, Eq)]\n$1' \
  | sd -f cm '^(    #\[derivative\()' '    #[derive(derivative::Derivative)]\n$1' \
  | xclip -se c
Unused useful snippets
pub fn intersect_generics(
    parent_type_generics: &Generics,
    field_generics: &PathArguments,
) -> Option<proc_macro2::TokenStream> {
    match field_generics {
        PathArguments::None => None,
        PathArguments::AngleBracketed(angle_bracketed) => {
            let field_generics = &angle_bracketed.args;
            let intersect_generics = field_generics
                .iter()
                .filter(|field_generic| {
                    let field_argument_as_param: GenericParam = parse_quote!(#field_generic);

                    parent_type_generics
                        .params
                        .iter()
                        .any(|parent_generic| parent_generic == &field_argument_as_param)
                })
                .collect::<Vec<&GenericArgument>>();
            if intersect_generics.is_empty() {
                None
            } else {
                Some(quote!(<#(#intersect_generics,)*>))
            }
        }
        PathArguments::Parenthesized(_) => None,
    }
}

/// Appends a `marker: #marker_ty` to the Fields.
///
/// A `Unit` struct is turned into a tuple struct.
pub fn fields_append_marker(fields: &Fields, marker_ty: Type) {
    match fields {
        Fields::Named(fields_named) => {
            let marker_field = {
                let fields_named_marker: FieldsNamed = parse_quote!({
                    marker: #marker_ty,
                });
                fields_named_marker.named.into_iter().next()
            };
            if let Some(marker_field) = marker_field {
                fields_named.named.push(marker_field);
            }
        }
        Fields::Unnamed(fields_unnamed) => {
            let marker_field = {
                let fields_unnamed_marker: FieldsUnnamed = parse_quote!((#marker_ty));
                fields_unnamed_marker.unnamed.into_iter().next()
            };
            if let Some(marker_field) = marker_field {
                fields_unnamed.unnamed.push(marker_field);
            }
        }
        Fields::Unit => todo!(),
    }
}

@codecov
Copy link
Copy Markdown

codecov bot commented May 9, 2023

Codecov Report

Patch coverage: 91.66% and project coverage change: -0.41 ⚠️

Comparison is base (fee352f) 91.97% compared to head (312da29) 91.56%.

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #121      +/-   ##
==========================================
- Coverage   91.97%   91.56%   -0.41%     
==========================================
  Files         299      322      +23     
  Lines       25375    29172    +3797     
==========================================
+ Hits        23338    26711    +3373     
- Misses       2037     2461     +424     
Impacted Files Coverage Δ
crate/params/src/mapping_fn.rs 81.25% <ø> (ø)
crate/params/src/params_resolve_error.rs 0.00% <ø> (ø)
crate/params/src/params_specs.rs 84.21% <ø> (ø)
crate/params/src/std_impl.rs 0.00% <0.00%> (ø)
...e/params_derive/src/field_wise_enum_builder_ctx.rs 0.00% <0.00%> (ø)
crate/rt_model/src/item_spec_boxed.rs 84.21% <ø> (ø)
crate/rt_model/src/item_spec_params_serializer.rs 0.00% <ø> (ø)
crate/rt_model/src/params_specs_serializer.rs 62.72% <ø> (ø)
crate/rt_model_core/src/error.rs 2.00% <ø> (ø)
item_specs/blank/src/blank_dest.rs 0.00% <0.00%> (ø)
... and 40 more

... and 15 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Do you have feedback about the report comment? Let us know in this issue.

@azriel91 azriel91 force-pushed the feature/119/recursive-referential-params branch from 19dd582 to f928238 Compare May 9, 2023 21:54
@azriel91 azriel91 force-pushed the feature/119/recursive-referential-params branch from 161c4d0 to 7f1b335 Compare May 18, 2023 03:30
@azriel91 azriel91 marked this pull request as ready for review May 19, 2023 07:21
@azriel91 azriel91 merged commit 815a2fe into main May 19, 2023
@azriel91 azriel91 deleted the feature/119/recursive-referential-params branch May 19, 2023 07:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Recursive Params resolution

1 participant