Skip to content

Commit 7f1dfca

Browse files
committed
Avoid transposes in deriving code.
The deriving code has some complex parts involving iterations over selflike args and also fields within structs and enum variants. The return types for a few functions demonstrate this: - `TraitDef::create_{struct_pattern,enum_variant_pattern}` returns a `(P<ast::Pat>, Vec<(Span, Option<Ident>, P<Expr>)>)` - `TraitDef::create_struct_field_accesses` returns a `Vec<(Span, Option<Ident>, P<Expr>)>`. This results in per-field data stored within per-selflike-arg data, with lots of repetition within the per-field data elements. This then has to be "transposed" in two places (`expand_struct_method_body` and `expand_enum_method_body`) into per-self-like-arg data stored within per-field data. It's all quite clumsy and confusing. This commit rearranges things greatly. Data is obtained in the needed form up-front, avoiding the need for transposition. Also, various functions are split, removed, and added, to make things clearer and avoid tuple return values. The diff is hard to read, which reflects the messiness of the original code -- there wasn't an easy way to break these changes into small pieces. (Sorry!) It's a net reduction of 35 lines and a readability improvement. The generated code is unchanged.
1 parent 27571da commit 7f1dfca

File tree

1 file changed

+183
-218
lines changed
  • compiler/rustc_builtin_macros/src/deriving/generic

1 file changed

+183
-218
lines changed

0 commit comments

Comments
 (0)