)]}'
{
  "commit": "9762dca54a4fec433b50eb83fdd8ff0a876cccf2",
  "tree": "761ac8ee08d70ca7f2e32f9741e699f659a48667",
  "parents": [
    "a321f3ad0a5ddcd1da221cc056ef4fd5a49fa0f7"
  ],
  "author": {
    "name": "Benno Lossin",
    "email": "benno.lossin@proton.me",
    "time": "Sat Mar 09 15:53:25 2024 +0000"
  },
  "committer": {
    "name": "Miguel Ojeda",
    "email": "ojeda@kernel.org",
    "time": "Sun Apr 07 22:03:42 2024 +0200"
  },
  "message": "rust: macros: add `decl_generics` to `parse_generics()`\n\nThe generic parameters on a type definition can specify default values.\nCurrently `parse_generics()` cannot handle this though. For example when\nparsing the following generics:\n\n    \u003cT: Clone, const N: usize \u003d 0\u003e\n\nThe `impl_generics` will be set to `T: Clone, const N: usize \u003d 0` and\n`ty_generics` will be set to `T, N`. Now using the `impl_generics` on an\nimpl block:\n\n    impl\u003c$($impl_generics)*\u003e Foo {}\n\nwill result in invalid Rust code, because default values are only\navailable on type definitions.\n\nTherefore add parsing support for generic parameter default values using\na new kind of generics called `decl_generics` and change the old\nbehavior of `impl_generics` to not contain the generic parameter default\nvalues.\n\nNow `Generics` has three fields:\n- `impl_generics`: the generics with bounds\n  (e.g. `T: Clone, const N: usize`)\n- `decl_generics`: the generics with bounds and default values\n  (e.g. `T: Clone, const N: usize \u003d 0`)\n- `ty_generics`:  contains the generics without bounds and without\n  default values (e.g. `T, N`)\n\n`impl_generics` is designed to be used on `impl\u003c$impl_generics\u003e`,\n`decl_generics` for the type definition, so `struct Foo\u003c$decl_generics\u003e`\nand `ty_generics` whenever you use the type, so `Foo\u003c$ty_generics\u003e`.\n\nHere is an example that uses all three different types of generics:\n\n    let (Generics { decl_generics, impl_generics, ty_generics }, rest) \u003d parse_generics(input);\n    quote! {\n        struct Foo\u003c$($decl_generics)*\u003e {\n            // ...\n        }\n\n        impl\u003c$impl_generics\u003e Foo\u003c$ty_generics\u003e {\n            fn foo() {\n                // ...\n            }\n        }\n    }\n\nThe next commit contains a fix to the `#[pin_data]` macro making it\ncompatible with generic parameter default values by relying on this new\nbehavior.\n\nSigned-off-by: Benno Lossin \u003cbenno.lossin@proton.me\u003e\nReviewed-by: Alice Ryhl \u003caliceryhl@google.com\u003e\nLink: https://lore.kernel.org/r/20240309155243.482334-1-benno.lossin@proton.me\nSigned-off-by: Miguel Ojeda \u003cojeda@kernel.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "afb0f2e3a36a9d33f0cc5b60f653a6873a99d208",
      "old_mode": 33188,
      "old_path": "rust/macros/helpers.rs",
      "new_id": "2497d6519f2f275020d56e8335fca34001c03e1e",
      "new_mode": 33188,
      "new_path": "rust/macros/helpers.rs"
    },
    {
      "type": "modify",
      "old_id": "6d58cfda9872e6231523d1e8df5cff8ea73678de",
      "old_mode": 33188,
      "old_path": "rust/macros/pin_data.rs",
      "new_id": "022e68e9720d455da327fd12c97a08ed2adeae49",
      "new_mode": 33188,
      "new_path": "rust/macros/pin_data.rs"
    },
    {
      "type": "modify",
      "old_id": "0d605c46ab3b4089d925984e7d9f9cf920094c32",
      "old_mode": 33188,
      "old_path": "rust/macros/zeroable.rs",
      "new_id": "cfee2cec18d5f5dd867be0c56578346b30273170",
      "new_mode": 33188,
      "new_path": "rust/macros/zeroable.rs"
    }
  ]
}
