struct.Structure.html 112 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  1. <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="API documentation for the Rust `Structure` struct in crate `synstructure`."><meta name="keywords" content="rust, rustlang, rust-lang, Structure"><title>synstructure::Structure - Rust</title><link rel="stylesheet" type="text/css" href="../normalize.css"><link rel="stylesheet" type="text/css" href="../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../dark.css"><link rel="stylesheet" type="text/css" href="../light.css" id="themeStyle"><script src="../storage.js"></script></head><body class="rustdoc struct"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">&#9776;</div><p class='location'>Struct Structure</p><div class="sidebar-elems"><div class="block items"><a class="sidebar-title" href="#methods">Methods</a><div class="sidebar-links"><a href="#method.new">new</a><a href="#method.variants">variants</a><a href="#method.variants_mut">variants_mut</a><a href="#method.ast">ast</a><a href="#method.omitted_variants">omitted_variants</a><a href="#method.each">each</a><a href="#method.fold">fold</a><a href="#method.each_variant">each_variant</a><a href="#method.filter">filter</a><a href="#method.filter_variants">filter_variants</a><a href="#method.remove_variant">remove_variant</a><a href="#method.bind_with">bind_with</a><a href="#method.binding_name">binding_name</a><a href="#method.referenced_ty_params">referenced_ty_params</a><a href="#method.add_impl_generic">add_impl_generic</a><a href="#method.add_trait_bounds">add_trait_bounds</a><a href="#method.bound_impl">bound_impl</a><a href="#method.unsafe_bound_impl">unsafe_bound_impl</a><a href="#method.unbound_impl">unbound_impl</a><a href="#method.unsafe_unbound_impl">unsafe_unbound_impl</a><a href="#method.gen_impl">gen_impl</a></div><a class="sidebar-title" href="#implementations">Trait Implementations</a><div class="sidebar-links"><a href="#impl-Debug">Debug</a><a href="#impl-Clone">Clone</a><a href="#impl-PartialEq">PartialEq</a><a href="#impl-Eq">Eq</a><a href="#impl-Hash">Hash</a></div><a class="sidebar-title" href="#synthetic-implementations">Auto Trait Implementations</a><div class="sidebar-links"><a href="#impl-Send">!Send</a><a href="#impl-Sync">!Sync</a></div></div><p class='location'><a href='index.html'>synstructure</a></p><script>window.sidebarCurrent = {name: 'Structure', ty: 'struct', relpath: ''};</script><script defer src="sidebar-items.js"></script></div></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../theme.js"></script><nav class="sub"><form class="search-form js-only"><div class="search-container"><input class="search-input" name="search" autocomplete="off" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><a id="settings-menu" href="../settings.html"><img src="../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><h1 class='fqn'><span class='in-band'>Struct <a href='index.html'>synstructure</a>::<wbr><a class="struct" href=''>Structure</a></span><span class='out-of-band'><span id='render-detail'><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class='inner'>&#x2212;</span>]</a></span><a class='srclink' href='../src/synstructure/lib.rs.html#954-959' title='goto source code'>[src]</a></span></h1><div class="docblock type-decl"><pre class='rust struct'>pub struct Structure&lt;'a&gt; { /* fields omitted */ }</pre></div><div class='docblock'><p>A wrapper around a <code>syn::DeriveInput</code> which provides utilities for creating
  2. custom derive trait implementations.</p>
  3. </div>
  4. <h2 id='methods' class='small-section-header'>
  5. Methods<a href='#methods' class='anchor'></a>
  6. </h2>
  7. <h3 id='impl' class='impl'><span class='in-band'><table class='table-display'><tbody><tr><td><code>impl&lt;'a&gt; <a class="struct" href="../synstructure/struct.Structure.html" title="struct synstructure::Structure">Structure</a>&lt;'a&gt;</code><a href='#impl' class='anchor'></a></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#961-2160' title='goto source code'>[src]</a></span></td></tr></tbody></table></h3><div class='impl-items'><h4 id='method.new' class="method"><span id='new.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.new' class='fnname'>new</a>(ast: &amp;'a <a class="struct" href="../syn/derive/struct.DeriveInput.html" title="struct syn::derive::DeriveInput">DeriveInput</a>) -&gt; Self</code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#964-1017' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Create a new <code>Structure</code> with the variants and fields from the passed-in
  8. <code>DeriveInput</code>.</p>
  9. </div><h4 id='method.variants' class="method"><div class="important-traits"><div class='tooltip'>ⓘ<span class='tooltiptext'>Important traits for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">&amp;'a [</a><a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a><a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">]</a></span></div><div class="content hidden"><h3 class="important">Important traits for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">&amp;'a [</a><a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a><a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">]</a></h3><code class="content"><span class="where fmt-newline">impl&lt;'a&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">&amp;'a [</a><a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a><a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">]</a></span><span class="where fmt-newline">impl&lt;'a&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">&amp;'a mut [</a><a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a><a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">]</a></span></code></div></div><span id='variants.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.variants' class='fnname'>variants</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">&amp;[</a><a class="struct" href="../synstructure/struct.VariantInfo.html" title="struct synstructure::VariantInfo">VariantInfo</a>&lt;'a&gt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">]</a></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1020-1022' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Returns a slice of the variants in this Structure.</p>
  10. </div><h4 id='method.variants_mut' class="method"><div class="important-traits"><div class='tooltip'>ⓘ<span class='tooltiptext'>Important traits for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">&amp;'a [</a><a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a><a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">]</a></span></div><div class="content hidden"><h3 class="important">Important traits for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">&amp;'a [</a><a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a><a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">]</a></h3><code class="content"><span class="where fmt-newline">impl&lt;'a&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">&amp;'a [</a><a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a><a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">]</a></span><span class="where fmt-newline">impl&lt;'a&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">&amp;'a mut [</a><a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a><a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">]</a></span></code></div></div><span id='variants_mut.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.variants_mut' class='fnname'>variants_mut</a>(&amp;mut self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">&amp;mut [</a><a class="struct" href="../synstructure/struct.VariantInfo.html" title="struct synstructure::VariantInfo">VariantInfo</a>&lt;'a&gt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">]</a></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1025-1027' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Returns a mut slice of the variants in this Structure.</p>
  11. </div><h4 id='method.ast' class="method"><span id='ast.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.ast' class='fnname'>ast</a>(&amp;self) -&gt; &amp;'a <a class="struct" href="../syn/derive/struct.DeriveInput.html" title="struct syn::derive::DeriveInput">DeriveInput</a></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1031-1033' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Returns a reference to the underlying <code>syn</code> AST node which this
  12. <code>Structure</code> was created from.</p>
  13. </div><h4 id='method.omitted_variants' class="method"><span id='omitted_variants.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.omitted_variants' class='fnname'>omitted_variants</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1036-1038' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>True if any variants were omitted due to a <code>filter_variants</code> call.</p>
  14. </div><h4 id='method.each' class="method"><span id='each.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.each' class='fnname'>each</a>&lt;F, R&gt;(&amp;self, f: F) -&gt; <a class="struct" href="../proc_macro2/struct.TokenStream.html" title="struct proc_macro2::TokenStream">TokenStream</a> <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;F: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/function/trait.FnMut.html" title="trait core::ops::function::FnMut">FnMut</a>(&amp;<a class="struct" href="../synstructure/struct.BindingInfo.html" title="struct synstructure::BindingInfo">BindingInfo</a>) -&gt; R,<br>&nbsp;&nbsp;&nbsp;&nbsp;R: <a class="trait" href="../quote/to_tokens/trait.ToTokens.html" title="trait quote::to_tokens::ToTokens">ToTokens</a>,&nbsp;</span></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1076-1089' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Runs the passed-in function once for each bound field, passing in a <code>BindingInfo</code>.
  15. and generating <code>match</code> arms which evaluate the returned tokens.</p>
  16. <p>This method will ignore variants or fields which are ignored through the
  17. <code>filter</code> and <code>filter_variant</code> methods.</p>
  18. <h1 id="example" class="section-header"><a href="#example">Example</a></h1>
  19. <pre class="rust rust-example-rendered">
  20. <span class="kw">let</span> <span class="ident">di</span>: <span class="ident">syn</span>::<span class="ident">DeriveInput</span> <span class="op">=</span> <span class="macro">parse_quote</span><span class="macro">!</span> {
  21. <span class="kw">enum</span> <span class="ident">A</span> {
  22. <span class="ident">B</span>(<span class="ident">i32</span>, <span class="ident">i32</span>),
  23. <span class="ident">C</span>(<span class="ident">u32</span>),
  24. }
  25. };
  26. <span class="kw">let</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">Structure</span>::<span class="ident">new</span>(<span class="kw-2">&amp;</span><span class="ident">di</span>);
  27. <span class="macro">assert_eq</span><span class="macro">!</span>(
  28. <span class="ident">s</span>.<span class="ident">each</span>(<span class="op">|</span><span class="ident">bi</span><span class="op">|</span> <span class="macro">quote</span><span class="macro">!</span>(<span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, #<span class="ident">bi</span>))).<span class="ident">to_string</span>(),
  29. <span class="macro">quote</span><span class="macro">!</span>{
  30. <span class="ident">A</span>::<span class="ident">B</span>(<span class="kw-2">ref</span> <span class="ident">__binding_0</span>, <span class="kw-2">ref</span> <span class="ident">__binding_1</span>,) <span class="op">=&gt;</span> {
  31. { <span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, <span class="ident">__binding_0</span>) }
  32. { <span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, <span class="ident">__binding_1</span>) }
  33. }
  34. <span class="ident">A</span>::<span class="ident">C</span>(<span class="kw-2">ref</span> <span class="ident">__binding_0</span>,) <span class="op">=&gt;</span> {
  35. { <span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, <span class="ident">__binding_0</span>) }
  36. }
  37. }.<span class="ident">to_string</span>()
  38. );</pre>
  39. </div><h4 id='method.fold' class="method"><span id='fold.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.fold' class='fnname'>fold</a>&lt;F, I, R&gt;(&amp;self, init: I, f: F) -&gt; <a class="struct" href="../proc_macro2/struct.TokenStream.html" title="struct proc_macro2::TokenStream">TokenStream</a> <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;F: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/function/trait.FnMut.html" title="trait core::ops::function::FnMut">FnMut</a>(<a class="struct" href="../proc_macro2/struct.TokenStream.html" title="struct proc_macro2::TokenStream">TokenStream</a>, &amp;<a class="struct" href="../synstructure/struct.BindingInfo.html" title="struct synstructure::BindingInfo">BindingInfo</a>) -&gt; R,<br>&nbsp;&nbsp;&nbsp;&nbsp;I: <a class="trait" href="../quote/to_tokens/trait.ToTokens.html" title="trait quote::to_tokens::ToTokens">ToTokens</a>,<br>&nbsp;&nbsp;&nbsp;&nbsp;R: <a class="trait" href="../quote/to_tokens/trait.ToTokens.html" title="trait quote::to_tokens::ToTokens">ToTokens</a>,&nbsp;</span></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1129-1143' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Runs the passed-in function once for each bound field, passing in the
  40. result of the previous call, and a <code>BindingInfo</code>. generating <code>match</code>
  41. arms which evaluate to the resulting tokens.</p>
  42. <p>This method will ignore variants or fields which are ignored through the
  43. <code>filter</code> and <code>filter_variant</code> methods.</p>
  44. <p>If a variant has been ignored, it will return the <code>init</code> value.</p>
  45. <h1 id="example-1" class="section-header"><a href="#example-1">Example</a></h1>
  46. <pre class="rust rust-example-rendered">
  47. <span class="kw">let</span> <span class="ident">di</span>: <span class="ident">syn</span>::<span class="ident">DeriveInput</span> <span class="op">=</span> <span class="macro">parse_quote</span><span class="macro">!</span> {
  48. <span class="kw">enum</span> <span class="ident">A</span> {
  49. <span class="ident">B</span>(<span class="ident">i32</span>, <span class="ident">i32</span>),
  50. <span class="ident">C</span>(<span class="ident">u32</span>),
  51. }
  52. };
  53. <span class="kw">let</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">Structure</span>::<span class="ident">new</span>(<span class="kw-2">&amp;</span><span class="ident">di</span>);
  54. <span class="macro">assert_eq</span><span class="macro">!</span>(
  55. <span class="ident">s</span>.<span class="ident">fold</span>(<span class="macro">quote</span><span class="macro">!</span>(<span class="number">0</span>), <span class="op">|</span><span class="ident">acc</span>, <span class="ident">bi</span><span class="op">|</span> <span class="macro">quote</span><span class="macro">!</span>(#<span class="ident">acc</span> <span class="op">+</span> #<span class="ident">bi</span>)).<span class="ident">to_string</span>(),
  56. <span class="macro">quote</span><span class="macro">!</span>{
  57. <span class="ident">A</span>::<span class="ident">B</span>(<span class="kw-2">ref</span> <span class="ident">__binding_0</span>, <span class="kw-2">ref</span> <span class="ident">__binding_1</span>,) <span class="op">=&gt;</span> {
  58. <span class="number">0</span> <span class="op">+</span> <span class="ident">__binding_0</span> <span class="op">+</span> <span class="ident">__binding_1</span>
  59. }
  60. <span class="ident">A</span>::<span class="ident">C</span>(<span class="kw-2">ref</span> <span class="ident">__binding_0</span>,) <span class="op">=&gt;</span> {
  61. <span class="number">0</span> <span class="op">+</span> <span class="ident">__binding_0</span>
  62. }
  63. }.<span class="ident">to_string</span>()
  64. );</pre>
  65. </div><h4 id='method.each_variant' class="method"><span id='each_variant.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.each_variant' class='fnname'>each_variant</a>&lt;F, R&gt;(&amp;self, f: F) -&gt; <a class="struct" href="../proc_macro2/struct.TokenStream.html" title="struct proc_macro2::TokenStream">TokenStream</a> <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;F: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/function/trait.FnMut.html" title="trait core::ops::function::FnMut">FnMut</a>(&amp;<a class="struct" href="../synstructure/struct.VariantInfo.html" title="struct synstructure::VariantInfo">VariantInfo</a>) -&gt; R,<br>&nbsp;&nbsp;&nbsp;&nbsp;R: <a class="trait" href="../quote/to_tokens/trait.ToTokens.html" title="trait quote::to_tokens::ToTokens">ToTokens</a>,&nbsp;</span></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1184-1199' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Runs the passed-in function once for each variant, passing in a
  66. <code>VariantInfo</code>. and generating <code>match</code> arms which evaluate the returned
  67. tokens.</p>
  68. <p>This method will ignore variants and not bind fields which are ignored
  69. through the <code>filter</code> and <code>filter_variant</code> methods.</p>
  70. <h1 id="example-2" class="section-header"><a href="#example-2">Example</a></h1>
  71. <pre class="rust rust-example-rendered">
  72. <span class="kw">let</span> <span class="ident">di</span>: <span class="ident">syn</span>::<span class="ident">DeriveInput</span> <span class="op">=</span> <span class="macro">parse_quote</span><span class="macro">!</span> {
  73. <span class="kw">enum</span> <span class="ident">A</span> {
  74. <span class="ident">B</span>(<span class="ident">i32</span>, <span class="ident">i32</span>),
  75. <span class="ident">C</span>(<span class="ident">u32</span>),
  76. }
  77. };
  78. <span class="kw">let</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">Structure</span>::<span class="ident">new</span>(<span class="kw-2">&amp;</span><span class="ident">di</span>);
  79. <span class="macro">assert_eq</span><span class="macro">!</span>(
  80. <span class="ident">s</span>.<span class="ident">each_variant</span>(<span class="op">|</span><span class="ident">v</span><span class="op">|</span> {
  81. <span class="kw">let</span> <span class="ident">name</span> <span class="op">=</span> <span class="kw-2">&amp;</span><span class="ident">v</span>.<span class="ident">ast</span>().<span class="ident">ident</span>;
  82. <span class="macro">quote</span><span class="macro">!</span>(<span class="macro">println</span><span class="macro">!</span>(<span class="macro">stringify</span><span class="macro">!</span>(#<span class="ident">name</span>)))
  83. }).<span class="ident">to_string</span>(),
  84. <span class="macro">quote</span><span class="macro">!</span>{
  85. <span class="ident">A</span>::<span class="ident">B</span>(<span class="kw-2">ref</span> <span class="ident">__binding_0</span>, <span class="kw-2">ref</span> <span class="ident">__binding_1</span>,) <span class="op">=&gt;</span> {
  86. <span class="macro">println</span><span class="macro">!</span>(<span class="macro">stringify</span><span class="macro">!</span>(<span class="ident">B</span>))
  87. }
  88. <span class="ident">A</span>::<span class="ident">C</span>(<span class="kw-2">ref</span> <span class="ident">__binding_0</span>,) <span class="op">=&gt;</span> {
  89. <span class="macro">println</span><span class="macro">!</span>(<span class="macro">stringify</span><span class="macro">!</span>(<span class="ident">C</span>))
  90. }
  91. }.<span class="ident">to_string</span>()
  92. );</pre>
  93. </div><h4 id='method.filter' class="method"><div class="important-traits"><div class='tooltip'>ⓘ<span class='tooltiptext'>Important traits for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>R</span></div><div class="content hidden"><h3 class="important">Important traits for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>R</h3><code class="content"><span class="where fmt-newline">impl&lt;'a, R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>R <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;R: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></span><span class="where fmt-newline">impl&lt;'a, W&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>W <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;W: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></span><span class="where fmt-newline">impl&lt;'a, I&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html" title="trait core::iter::iterator::Iterator">Iterator</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>I <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;I: <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html" title="trait core::iter::iterator::Iterator">Iterator</a> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></span><span class="where fmt-newline"> type <a href='https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html#associatedtype.Item' class="type">Item</a> = &lt;I as <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html" title="trait core::iter::iterator::Iterator">Iterator</a>&gt;::<a class="type" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html#associatedtype.Item" title="type core::iter::iterator::Iterator::Item">Item</a>;</span></code></div></div><span id='filter.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.filter' class='fnname'>filter</a>&lt;F&gt;(&amp;mut self, f: F) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut </a>Self <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;F: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/function/trait.FnMut.html" title="trait core::ops::function::FnMut">FnMut</a>(&amp;<a class="struct" href="../synstructure/struct.BindingInfo.html" title="struct synstructure::BindingInfo">BindingInfo</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a>,&nbsp;</span></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1244-1252' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Filter the bindings created by this <code>Structure</code> object. This has 2 effects:</p>
  94. <ul>
  95. <li>
  96. <p>The bindings will no longer appear in match arms generated by methods
  97. on this <code>Structure</code> or its subobjects.</p>
  98. </li>
  99. <li>
  100. <p>Impl blocks created with the <code>bound_impl</code> or <code>unsafe_bound_impl</code>
  101. method only consider type parameters referenced in the types of
  102. non-filtered fields.</p>
  103. </li>
  104. </ul>
  105. <h1 id="example-3" class="section-header"><a href="#example-3">Example</a></h1>
  106. <pre class="rust rust-example-rendered">
  107. <span class="kw">let</span> <span class="ident">di</span>: <span class="ident">syn</span>::<span class="ident">DeriveInput</span> <span class="op">=</span> <span class="macro">parse_quote</span><span class="macro">!</span> {
  108. <span class="kw">enum</span> <span class="ident">A</span> {
  109. <span class="ident">B</span>{ <span class="ident">a</span>: <span class="ident">i32</span>, <span class="ident">b</span>: <span class="ident">i32</span> },
  110. <span class="ident">C</span>{ <span class="ident">a</span>: <span class="ident">u32</span> },
  111. }
  112. };
  113. <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">Structure</span>::<span class="ident">new</span>(<span class="kw-2">&amp;</span><span class="ident">di</span>);
  114. <span class="ident">s</span>.<span class="ident">filter</span>(<span class="op">|</span><span class="ident">bi</span><span class="op">|</span> {
  115. <span class="ident">bi</span>.<span class="ident">ast</span>().<span class="ident">ident</span> <span class="op">==</span> <span class="prelude-val">Some</span>(<span class="ident">syn</span>::<span class="ident">Ident</span>::<span class="ident">new</span>(<span class="string">&quot;a&quot;</span>, <span class="ident">proc_macro2</span>::<span class="ident">Span</span>::<span class="ident">call_site</span>()))
  116. });
  117. <span class="macro">assert_eq</span><span class="macro">!</span>(
  118. <span class="ident">s</span>.<span class="ident">each</span>(<span class="op">|</span><span class="ident">bi</span><span class="op">|</span> <span class="macro">quote</span><span class="macro">!</span>(<span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, #<span class="ident">bi</span>))).<span class="ident">to_string</span>(),
  119. <span class="macro">quote</span><span class="macro">!</span>{
  120. <span class="ident">A</span>::<span class="ident">B</span>{ <span class="ident">a</span>: <span class="kw-2">ref</span> <span class="ident">__binding_0</span>, .. } <span class="op">=&gt;</span> {
  121. { <span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, <span class="ident">__binding_0</span>) }
  122. }
  123. <span class="ident">A</span>::<span class="ident">C</span>{ <span class="ident">a</span>: <span class="kw-2">ref</span> <span class="ident">__binding_0</span>, } <span class="op">=&gt;</span> {
  124. { <span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, <span class="ident">__binding_0</span>) }
  125. }
  126. }.<span class="ident">to_string</span>()
  127. );</pre>
  128. </div><h4 id='method.filter_variants' class="method"><div class="important-traits"><div class='tooltip'>ⓘ<span class='tooltiptext'>Important traits for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>R</span></div><div class="content hidden"><h3 class="important">Important traits for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>R</h3><code class="content"><span class="where fmt-newline">impl&lt;'a, R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>R <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;R: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></span><span class="where fmt-newline">impl&lt;'a, W&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>W <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;W: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></span><span class="where fmt-newline">impl&lt;'a, I&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html" title="trait core::iter::iterator::Iterator">Iterator</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>I <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;I: <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html" title="trait core::iter::iterator::Iterator">Iterator</a> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></span><span class="where fmt-newline"> type <a href='https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html#associatedtype.Item' class="type">Item</a> = &lt;I as <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html" title="trait core::iter::iterator::Iterator">Iterator</a>&gt;::<a class="type" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html#associatedtype.Item" title="type core::iter::iterator::Iterator::Item">Item</a>;</span></code></div></div><span id='filter_variants.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.filter_variants' class='fnname'>filter_variants</a>&lt;F&gt;(&amp;mut self, f: F) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut </a>Self <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;F: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/function/trait.FnMut.html" title="trait core::ops::function::FnMut">FnMut</a>(&amp;<a class="struct" href="../synstructure/struct.VariantInfo.html" title="struct synstructure::VariantInfo">VariantInfo</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a>,&nbsp;</span></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1293-1303' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Filter the variants matched by this <code>Structure</code> object. This has 2 effects:</p>
  129. <ul>
  130. <li>
  131. <p>Match arms destructuring these variants will no longer be generated by
  132. methods on this <code>Structure</code></p>
  133. </li>
  134. <li>
  135. <p>Impl blocks created with the <code>bound_impl</code> or <code>unsafe_bound_impl</code>
  136. method only consider type parameters referenced in the types of
  137. fields in non-fitered variants.</p>
  138. </li>
  139. </ul>
  140. <h1 id="example-4" class="section-header"><a href="#example-4">Example</a></h1>
  141. <pre class="rust rust-example-rendered">
  142. <span class="kw">let</span> <span class="ident">di</span>: <span class="ident">syn</span>::<span class="ident">DeriveInput</span> <span class="op">=</span> <span class="macro">parse_quote</span><span class="macro">!</span> {
  143. <span class="kw">enum</span> <span class="ident">A</span> {
  144. <span class="ident">B</span>(<span class="ident">i32</span>, <span class="ident">i32</span>),
  145. <span class="ident">C</span>(<span class="ident">u32</span>),
  146. }
  147. };
  148. <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">Structure</span>::<span class="ident">new</span>(<span class="kw-2">&amp;</span><span class="ident">di</span>);
  149. <span class="ident">s</span>.<span class="ident">filter_variants</span>(<span class="op">|</span><span class="ident">v</span><span class="op">|</span> <span class="ident">v</span>.<span class="ident">ast</span>().<span class="ident">ident</span> <span class="op">!=</span> <span class="string">&quot;B&quot;</span>);
  150. <span class="macro">assert_eq</span><span class="macro">!</span>(
  151. <span class="ident">s</span>.<span class="ident">each</span>(<span class="op">|</span><span class="ident">bi</span><span class="op">|</span> <span class="macro">quote</span><span class="macro">!</span>(<span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, #<span class="ident">bi</span>))).<span class="ident">to_string</span>(),
  152. <span class="macro">quote</span><span class="macro">!</span>{
  153. <span class="ident">A</span>::<span class="ident">C</span>(<span class="kw-2">ref</span> <span class="ident">__binding_0</span>,) <span class="op">=&gt;</span> {
  154. { <span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, <span class="ident">__binding_0</span>) }
  155. }
  156. <span class="kw">_</span> <span class="op">=&gt;</span> {}
  157. }.<span class="ident">to_string</span>()
  158. );</pre>
  159. </div><h4 id='method.remove_variant' class="method"><div class="important-traits"><div class='tooltip'>ⓘ<span class='tooltiptext'>Important traits for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>R</span></div><div class="content hidden"><h3 class="important">Important traits for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>R</h3><code class="content"><span class="where fmt-newline">impl&lt;'a, R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>R <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;R: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></span><span class="where fmt-newline">impl&lt;'a, W&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>W <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;W: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></span><span class="where fmt-newline">impl&lt;'a, I&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html" title="trait core::iter::iterator::Iterator">Iterator</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>I <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;I: <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html" title="trait core::iter::iterator::Iterator">Iterator</a> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></span><span class="where fmt-newline"> type <a href='https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html#associatedtype.Item' class="type">Item</a> = &lt;I as <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html" title="trait core::iter::iterator::Iterator">Iterator</a>&gt;::<a class="type" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html#associatedtype.Item" title="type core::iter::iterator::Iterator::Item">Item</a>;</span></code></div></div><span id='remove_variant.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.remove_variant' class='fnname'>remove_variant</a>(&amp;mut self, idx: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut </a>Self</code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1310-1314' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Remove the variant at the given index.</p>
  160. <h1 id="panics" class="section-header"><a href="#panics">Panics</a></h1>
  161. <p>Panics if the index is out of range.</p>
  162. </div><h4 id='method.bind_with' class="method"><div class="important-traits"><div class='tooltip'>ⓘ<span class='tooltiptext'>Important traits for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>R</span></div><div class="content hidden"><h3 class="important">Important traits for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>R</h3><code class="content"><span class="where fmt-newline">impl&lt;'a, R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>R <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;R: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></span><span class="where fmt-newline">impl&lt;'a, W&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>W <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;W: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></span><span class="where fmt-newline">impl&lt;'a, I&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html" title="trait core::iter::iterator::Iterator">Iterator</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>I <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;I: <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html" title="trait core::iter::iterator::Iterator">Iterator</a> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></span><span class="where fmt-newline"> type <a href='https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html#associatedtype.Item' class="type">Item</a> = &lt;I as <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html" title="trait core::iter::iterator::Iterator">Iterator</a>&gt;::<a class="type" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html#associatedtype.Item" title="type core::iter::iterator::Iterator::Item">Item</a>;</span></code></div></div><span id='bind_with.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.bind_with' class='fnname'>bind_with</a>&lt;F&gt;(&amp;mut self, f: F) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut </a>Self <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;F: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/function/trait.FnMut.html" title="trait core::ops::function::FnMut">FnMut</a>(&amp;<a class="struct" href="../synstructure/struct.BindingInfo.html" title="struct synstructure::BindingInfo">BindingInfo</a>) -&gt; <a class="enum" href="../synstructure/enum.BindStyle.html" title="enum synstructure::BindStyle">BindStyle</a>,&nbsp;</span></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1351-1359' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Updates the <code>BindStyle</code> for each of the passed-in fields by calling the
  163. passed-in function for each <code>BindingInfo</code>.</p>
  164. <h1 id="example-5" class="section-header"><a href="#example-5">Example</a></h1>
  165. <pre class="rust rust-example-rendered">
  166. <span class="kw">let</span> <span class="ident">di</span>: <span class="ident">syn</span>::<span class="ident">DeriveInput</span> <span class="op">=</span> <span class="macro">parse_quote</span><span class="macro">!</span> {
  167. <span class="kw">enum</span> <span class="ident">A</span> {
  168. <span class="ident">B</span>(<span class="ident">i32</span>, <span class="ident">i32</span>),
  169. <span class="ident">C</span>(<span class="ident">u32</span>),
  170. }
  171. };
  172. <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">Structure</span>::<span class="ident">new</span>(<span class="kw-2">&amp;</span><span class="ident">di</span>);
  173. <span class="ident">s</span>.<span class="ident">bind_with</span>(<span class="op">|</span><span class="ident">bi</span><span class="op">|</span> <span class="ident">BindStyle</span>::<span class="ident">RefMut</span>);
  174. <span class="macro">assert_eq</span><span class="macro">!</span>(
  175. <span class="ident">s</span>.<span class="ident">each</span>(<span class="op">|</span><span class="ident">bi</span><span class="op">|</span> <span class="macro">quote</span><span class="macro">!</span>(<span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, #<span class="ident">bi</span>))).<span class="ident">to_string</span>(),
  176. <span class="macro">quote</span><span class="macro">!</span>{
  177. <span class="ident">A</span>::<span class="ident">B</span>(<span class="kw-2">ref</span> <span class="kw-2">mut</span> <span class="ident">__binding_0</span>, <span class="kw-2">ref</span> <span class="kw-2">mut</span> <span class="ident">__binding_1</span>,) <span class="op">=&gt;</span> {
  178. { <span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, <span class="ident">__binding_0</span>) }
  179. { <span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, <span class="ident">__binding_1</span>) }
  180. }
  181. <span class="ident">A</span>::<span class="ident">C</span>(<span class="kw-2">ref</span> <span class="kw-2">mut</span> <span class="ident">__binding_0</span>,) <span class="op">=&gt;</span> {
  182. { <span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, <span class="ident">__binding_0</span>) }
  183. }
  184. }.<span class="ident">to_string</span>()
  185. );</pre>
  186. </div><h4 id='method.binding_name' class="method"><div class="important-traits"><div class='tooltip'>ⓘ<span class='tooltiptext'>Important traits for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>R</span></div><div class="content hidden"><h3 class="important">Important traits for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>R</h3><code class="content"><span class="where fmt-newline">impl&lt;'a, R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>R <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;R: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></span><span class="where fmt-newline">impl&lt;'a, W&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>W <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;W: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></span><span class="where fmt-newline">impl&lt;'a, I&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html" title="trait core::iter::iterator::Iterator">Iterator</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>I <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;I: <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html" title="trait core::iter::iterator::Iterator">Iterator</a> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></span><span class="where fmt-newline"> type <a href='https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html#associatedtype.Item' class="type">Item</a> = &lt;I as <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html" title="trait core::iter::iterator::Iterator">Iterator</a>&gt;::<a class="type" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html#associatedtype.Item" title="type core::iter::iterator::Iterator::Item">Item</a>;</span></code></div></div><span id='binding_name.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.binding_name' class='fnname'>binding_name</a>&lt;F&gt;(&amp;mut self, f: F) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut </a>Self <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;F: <a class="trait" href="https://doc.rust-lang.org/nightly/core/ops/function/trait.FnMut.html" title="trait core::ops::function::FnMut">FnMut</a>(&amp;<a class="struct" href="../syn/data/struct.Field.html" title="struct syn::data::Field">Field</a>, <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>) -&gt; <a class="struct" href="../proc_macro2/struct.Ident.html" title="struct proc_macro2::Ident">Ident</a>,&nbsp;</span></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1402-1410' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Updates the binding name for each fo the passed-in fields by calling the
  187. passed-in function for each <code>BindingInfo</code>.</p>
  188. <p>The function will be called with the <code>BindingInfo</code> and its index in the
  189. enclosing variant.</p>
  190. <p>The default name is <code>__binding_{}</code> where <code>{}</code> is replaced with an
  191. increasing number.</p>
  192. <h1 id="example-6" class="section-header"><a href="#example-6">Example</a></h1>
  193. <pre class="rust rust-example-rendered">
  194. <span class="kw">let</span> <span class="ident">di</span>: <span class="ident">syn</span>::<span class="ident">DeriveInput</span> <span class="op">=</span> <span class="macro">parse_quote</span><span class="macro">!</span> {
  195. <span class="kw">enum</span> <span class="ident">A</span> {
  196. <span class="ident">B</span>{ <span class="ident">a</span>: <span class="ident">i32</span>, <span class="ident">b</span>: <span class="ident">i32</span> },
  197. <span class="ident">C</span>{ <span class="ident">a</span>: <span class="ident">u32</span> },
  198. }
  199. };
  200. <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">Structure</span>::<span class="ident">new</span>(<span class="kw-2">&amp;</span><span class="ident">di</span>);
  201. <span class="ident">s</span>.<span class="ident">binding_name</span>(<span class="op">|</span><span class="ident">bi</span>, <span class="ident">i</span><span class="op">|</span> <span class="ident">bi</span>.<span class="ident">ident</span>.<span class="ident">clone</span>().<span class="ident">unwrap</span>());
  202. <span class="macro">assert_eq</span><span class="macro">!</span>(
  203. <span class="ident">s</span>.<span class="ident">each</span>(<span class="op">|</span><span class="ident">bi</span><span class="op">|</span> <span class="macro">quote</span><span class="macro">!</span>(<span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, #<span class="ident">bi</span>))).<span class="ident">to_string</span>(),
  204. <span class="macro">quote</span><span class="macro">!</span>{
  205. <span class="ident">A</span>::<span class="ident">B</span>{ <span class="ident">a</span>: <span class="kw-2">ref</span> <span class="ident">a</span>, <span class="ident">b</span>: <span class="kw-2">ref</span> <span class="ident">b</span>, } <span class="op">=&gt;</span> {
  206. { <span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, <span class="ident">a</span>) }
  207. { <span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, <span class="ident">b</span>) }
  208. }
  209. <span class="ident">A</span>::<span class="ident">C</span>{ <span class="ident">a</span>: <span class="kw-2">ref</span> <span class="ident">a</span>, } <span class="op">=&gt;</span> {
  210. { <span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;{:?}&quot;</span>, <span class="ident">a</span>) }
  211. }
  212. }.<span class="ident">to_string</span>()
  213. );</pre>
  214. </div><h4 id='method.referenced_ty_params' class="method"><div class="important-traits"><div class='tooltip'>ⓘ<span class='tooltiptext'>Important traits for <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;</span></div><div class="content hidden"><h3 class="important">Important traits for <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;</h3><code class="content"><span class="where fmt-newline">impl <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a> for <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u8.html">u8</a>&gt;</span></code></div></div><span id='referenced_ty_params.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.referenced_ty_params' class='fnname'>referenced_ty_params</a>(&amp;self) -&gt; <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a>&lt;&amp;'a <a class="struct" href="../proc_macro2/struct.Ident.html" title="struct proc_macro2::Ident">Ident</a>&gt;</code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1445-1453' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Returns a list of the type parameters which are refrenced in the types
  215. of non-filtered fields / variants.</p>
  216. <h1 id="caveat" class="section-header"><a href="#caveat">Caveat</a></h1>
  217. <p>If the struct contains any macros in type position, all parameters will
  218. be considered bound. This is because we cannot determine which type
  219. parameters are bound by type macros.</p>
  220. <h1 id="example-7" class="section-header"><a href="#example-7">Example</a></h1>
  221. <pre class="rust rust-example-rendered">
  222. <span class="kw">let</span> <span class="ident">di</span>: <span class="ident">syn</span>::<span class="ident">DeriveInput</span> <span class="op">=</span> <span class="macro">parse_quote</span><span class="macro">!</span> {
  223. <span class="kw">enum</span> <span class="ident">A</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span> {
  224. <span class="ident">B</span>(<span class="ident">T</span>, <span class="ident">i32</span>),
  225. <span class="ident">C</span>(<span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">U</span><span class="op">&gt;</span>),
  226. }
  227. };
  228. <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">Structure</span>::<span class="ident">new</span>(<span class="kw-2">&amp;</span><span class="ident">di</span>);
  229. <span class="ident">s</span>.<span class="ident">filter_variants</span>(<span class="op">|</span><span class="ident">v</span><span class="op">|</span> <span class="ident">v</span>.<span class="ident">ast</span>().<span class="ident">ident</span> <span class="op">!=</span> <span class="string">&quot;C&quot;</span>);
  230. <span class="macro">assert_eq</span><span class="macro">!</span>(
  231. <span class="ident">s</span>.<span class="ident">referenced_ty_params</span>(),
  232. <span class="kw-2">&amp;</span>[<span class="kw-2">&amp;</span>(<span class="ident">syn</span>::<span class="ident">Ident</span>::<span class="ident">new</span>(<span class="string">&quot;T&quot;</span>, <span class="ident">proc_macro2</span>::<span class="ident">Span</span>::<span class="ident">call_site</span>()))]
  233. );</pre>
  234. </div><h4 id='method.add_impl_generic' class="method"><div class="important-traits"><div class='tooltip'>ⓘ<span class='tooltiptext'>Important traits for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>R</span></div><div class="content hidden"><h3 class="important">Important traits for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>R</h3><code class="content"><span class="where fmt-newline">impl&lt;'a, R&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>R <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;R: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Read.html" title="trait std::io::Read">Read</a> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></span><span class="where fmt-newline">impl&lt;'a, W&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>W <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;W: <a class="trait" href="https://doc.rust-lang.org/nightly/std/io/trait.Write.html" title="trait std::io::Write">Write</a> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></span><span class="where fmt-newline">impl&lt;'a, I&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html" title="trait core::iter::iterator::Iterator">Iterator</a> for <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;'a mut </a>I <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;I: <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html" title="trait core::iter::iterator::Iterator">Iterator</a> + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,&nbsp;</span></span><span class="where fmt-newline"> type <a href='https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html#associatedtype.Item' class="type">Item</a> = &lt;I as <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html" title="trait core::iter::iterator::Iterator">Iterator</a>&gt;::<a class="type" href="https://doc.rust-lang.org/nightly/core/iter/iterator/trait.Iterator.html#associatedtype.Item" title="type core::iter::iterator::Iterator::Item">Item</a>;</span></code></div></div><span id='add_impl_generic.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.add_impl_generic' class='fnname'>add_impl_generic</a>(&amp;mut self, param: <a class="enum" href="../syn/generics/enum.GenericParam.html" title="enum syn::generics::GenericParam">GenericParam</a>) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut </a>Self</code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1498-1501' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Adds an <code>impl&lt;&gt;</code> generic parameter.
  235. This can be used when the trait to be derived needs some extra generic parameters.</p>
  236. <h1 id="example-8" class="section-header"><a href="#example-8">Example</a></h1>
  237. <pre class="rust rust-example-rendered">
  238. <span class="kw">let</span> <span class="ident">di</span>: <span class="ident">syn</span>::<span class="ident">DeriveInput</span> <span class="op">=</span> <span class="macro">parse_quote</span><span class="macro">!</span> {
  239. <span class="kw">enum</span> <span class="ident">A</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span> {
  240. <span class="ident">B</span>(<span class="ident">T</span>),
  241. <span class="ident">C</span>(<span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">U</span><span class="op">&gt;</span>),
  242. }
  243. };
  244. <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">Structure</span>::<span class="ident">new</span>(<span class="kw-2">&amp;</span><span class="ident">di</span>);
  245. <span class="kw">let</span> <span class="ident">generic</span>: <span class="ident">syn</span>::<span class="ident">GenericParam</span> <span class="op">=</span> <span class="macro">parse_quote</span><span class="macro">!</span>(<span class="ident">X</span>: <span class="ident">krate</span>::<span class="ident">AnotherTrait</span>);
  246. <span class="macro">assert_eq</span><span class="macro">!</span>(
  247. <span class="ident">s</span>.<span class="ident">add_impl_generic</span>(<span class="ident">generic</span>)
  248. .<span class="ident">bound_impl</span>(<span class="macro">quote</span><span class="macro">!</span>(<span class="ident">krate</span>::<span class="ident">Trait</span><span class="op">&lt;</span><span class="ident">X</span><span class="op">&gt;</span>),
  249. <span class="macro">quote</span><span class="macro">!</span>{
  250. <span class="kw">fn</span> <span class="ident">a</span>() {}
  251. }
  252. ).<span class="ident">to_string</span>(),
  253. <span class="macro">quote</span><span class="macro">!</span>{
  254. <span class="attribute">#[<span class="ident">allow</span>(<span class="ident">non_upper_case_globals</span>)]</span>
  255. <span class="kw">const</span> <span class="ident">_DERIVE_krate_Trait_X_FOR_A</span>: () <span class="op">=</span> {
  256. <span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">krate</span>;
  257. <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span>, <span class="ident">X</span>: <span class="ident">krate</span>::<span class="ident">AnotherTrait</span><span class="op">&gt;</span> <span class="ident">krate</span>::<span class="ident">Trait</span><span class="op">&lt;</span><span class="ident">X</span><span class="op">&gt;</span> <span class="kw">for</span> <span class="ident">A</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span>
  258. <span class="kw">where</span> <span class="ident">T</span> : <span class="ident">krate</span> :: <span class="ident">Trait</span> <span class="op">&lt;</span> <span class="ident">X</span> <span class="op">&gt;</span>,
  259. <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">U</span><span class="op">&gt;</span>: <span class="ident">krate</span>::<span class="ident">Trait</span><span class="op">&lt;</span><span class="ident">X</span><span class="op">&gt;</span>,
  260. <span class="ident">U</span>: <span class="ident">krate</span>::<span class="ident">Trait</span><span class="op">&lt;</span><span class="ident">X</span><span class="op">&gt;</span>
  261. {
  262. <span class="kw">fn</span> <span class="ident">a</span>() {}
  263. }
  264. };
  265. }.<span class="ident">to_string</span>()
  266. );</pre>
  267. </div><h4 id='method.add_trait_bounds' class="method"><span id='add_trait_bounds.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.add_trait_bounds' class='fnname'>add_trait_bounds</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self, <br>&nbsp;&nbsp;&nbsp;&nbsp;bound: &amp;<a class="struct" href="../syn/generics/struct.TraitBound.html" title="struct syn::generics::TraitBound">TraitBound</a>, <br>&nbsp;&nbsp;&nbsp;&nbsp;where_clause: &amp;mut <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="../syn/generics/struct.WhereClause.html" title="struct syn::generics::WhereClause">WhereClause</a>&gt;<br>)</code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1511-1555' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Add trait bounds for a trait with the given path for each type parmaeter
  268. referenced in the types of non-filtered fields.</p>
  269. <h1 id="caveat-1" class="section-header"><a href="#caveat-1">Caveat</a></h1>
  270. <p>If the method contains any macros in type position, all parameters will
  271. be considered bound. This is because we cannot determine which type
  272. parameters are bound by type macros.</p>
  273. </div><h4 id='method.bound_impl' class="method"><span id='bound_impl.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.bound_impl' class='fnname'>bound_impl</a>&lt;P:&nbsp;<a class="trait" href="../quote/to_tokens/trait.ToTokens.html" title="trait quote::to_tokens::ToTokens">ToTokens</a>, B:&nbsp;<a class="trait" href="../quote/to_tokens/trait.ToTokens.html" title="trait quote::to_tokens::ToTokens">ToTokens</a>&gt;(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self, <br>&nbsp;&nbsp;&nbsp;&nbsp;path: P, <br>&nbsp;&nbsp;&nbsp;&nbsp;body: B<br>) -&gt; <a class="struct" href="../proc_macro2/struct.TokenStream.html" title="struct proc_macro2::TokenStream">TokenStream</a></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1622-1629' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><blockquote>
  274. <p>NOTE: This methods' features are superceded by <code>Structure::gen_impl</code>.</p>
  275. </blockquote>
  276. <p>Creates an <code>impl</code> block with the required generic type fields filled in
  277. to implement the trait <code>path</code>.</p>
  278. <p>This method also adds where clauses to the impl requiring that all
  279. referenced type parmaeters implement the trait <code>path</code>.</p>
  280. <h1 id="hygiene-and-paths" class="section-header"><a href="#hygiene-and-paths">Hygiene and Paths</a></h1>
  281. <p>This method wraps the impl block inside of a <code>const</code> (see the example
  282. below). In this scope, the first segment of the passed-in path is
  283. <code>extern crate</code>-ed in. If you don't want to generate that <code>extern crate</code>
  284. item, use a global path.</p>
  285. <p>This means that if you are implementing <code>my_crate::Trait</code>, you simply
  286. write <code>s.bound_impl(quote!(my_crate::Trait), quote!(...))</code>, and for the
  287. entirety of the definition, you can refer to your crate as <code>my_crate</code>.</p>
  288. <h1 id="caveat-2" class="section-header"><a href="#caveat-2">Caveat</a></h1>
  289. <p>If the method contains any macros in type position, all parameters will
  290. be considered bound. This is because we cannot determine which type
  291. parameters are bound by type macros.</p>
  292. <h1 id="panics-1" class="section-header"><a href="#panics-1">Panics</a></h1>
  293. <p>Panics if the path string parameter is not a valid <code>TraitBound</code>.</p>
  294. <h1 id="example-9" class="section-header"><a href="#example-9">Example</a></h1>
  295. <pre class="rust rust-example-rendered">
  296. <span class="kw">let</span> <span class="ident">di</span>: <span class="ident">syn</span>::<span class="ident">DeriveInput</span> <span class="op">=</span> <span class="macro">parse_quote</span><span class="macro">!</span> {
  297. <span class="kw">enum</span> <span class="ident">A</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span> {
  298. <span class="ident">B</span>(<span class="ident">T</span>),
  299. <span class="ident">C</span>(<span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">U</span><span class="op">&gt;</span>),
  300. }
  301. };
  302. <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">Structure</span>::<span class="ident">new</span>(<span class="kw-2">&amp;</span><span class="ident">di</span>);
  303. <span class="ident">s</span>.<span class="ident">filter_variants</span>(<span class="op">|</span><span class="ident">v</span><span class="op">|</span> <span class="ident">v</span>.<span class="ident">ast</span>().<span class="ident">ident</span> <span class="op">!=</span> <span class="string">&quot;B&quot;</span>);
  304. <span class="macro">assert_eq</span><span class="macro">!</span>(
  305. <span class="ident">s</span>.<span class="ident">bound_impl</span>(<span class="macro">quote</span><span class="macro">!</span>(<span class="ident">krate</span>::<span class="ident">Trait</span>), <span class="macro">quote</span><span class="macro">!</span>{
  306. <span class="kw">fn</span> <span class="ident">a</span>() {}
  307. }).<span class="ident">to_string</span>(),
  308. <span class="macro">quote</span><span class="macro">!</span>{
  309. <span class="attribute">#[<span class="ident">allow</span>(<span class="ident">non_upper_case_globals</span>)]</span>
  310. <span class="kw">const</span> <span class="ident">_DERIVE_krate_Trait_FOR_A</span>: () <span class="op">=</span> {
  311. <span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">krate</span>;
  312. <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span> <span class="ident">krate</span>::<span class="ident">Trait</span> <span class="kw">for</span> <span class="ident">A</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span>
  313. <span class="kw">where</span> <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">U</span><span class="op">&gt;</span>: <span class="ident">krate</span>::<span class="ident">Trait</span>,
  314. <span class="ident">U</span>: <span class="ident">krate</span>::<span class="ident">Trait</span>
  315. {
  316. <span class="kw">fn</span> <span class="ident">a</span>() {}
  317. }
  318. };
  319. }.<span class="ident">to_string</span>()
  320. );</pre>
  321. </div><h4 id='method.unsafe_bound_impl' class="method"><span id='unsafe_bound_impl.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.unsafe_bound_impl' class='fnname'>unsafe_bound_impl</a>&lt;P:&nbsp;<a class="trait" href="../quote/to_tokens/trait.ToTokens.html" title="trait quote::to_tokens::ToTokens">ToTokens</a>, B:&nbsp;<a class="trait" href="../quote/to_tokens/trait.ToTokens.html" title="trait quote::to_tokens::ToTokens">ToTokens</a>&gt;(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self, <br>&nbsp;&nbsp;&nbsp;&nbsp;path: P, <br>&nbsp;&nbsp;&nbsp;&nbsp;body: B<br>) -&gt; <a class="struct" href="../proc_macro2/struct.TokenStream.html" title="struct proc_macro2::TokenStream">TokenStream</a></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1696-1703' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><blockquote>
  322. <p>NOTE: This methods' features are superceded by <code>Structure::gen_impl</code>.</p>
  323. </blockquote>
  324. <p>Creates an <code>impl</code> block with the required generic type fields filled in
  325. to implement the unsafe trait <code>path</code>.</p>
  326. <p>This method also adds where clauses to the impl requiring that all
  327. referenced type parmaeters implement the trait <code>path</code>.</p>
  328. <h1 id="hygiene-and-paths-1" class="section-header"><a href="#hygiene-and-paths-1">Hygiene and Paths</a></h1>
  329. <p>This method wraps the impl block inside of a <code>const</code> (see the example
  330. below). In this scope, the first segment of the passed-in path is
  331. <code>extern crate</code>-ed in. If you don't want to generate that <code>extern crate</code>
  332. item, use a global path.</p>
  333. <p>This means that if you are implementing <code>my_crate::Trait</code>, you simply
  334. write <code>s.bound_impl(quote!(my_crate::Trait), quote!(...))</code>, and for the
  335. entirety of the definition, you can refer to your crate as <code>my_crate</code>.</p>
  336. <h1 id="caveat-3" class="section-header"><a href="#caveat-3">Caveat</a></h1>
  337. <p>If the method contains any macros in type position, all parameters will
  338. be considered bound. This is because we cannot determine which type
  339. parameters are bound by type macros.</p>
  340. <h1 id="panics-2" class="section-header"><a href="#panics-2">Panics</a></h1>
  341. <p>Panics if the path string parameter is not a valid <code>TraitBound</code>.</p>
  342. <h1 id="example-10" class="section-header"><a href="#example-10">Example</a></h1>
  343. <pre class="rust rust-example-rendered">
  344. <span class="kw">let</span> <span class="ident">di</span>: <span class="ident">syn</span>::<span class="ident">DeriveInput</span> <span class="op">=</span> <span class="macro">parse_quote</span><span class="macro">!</span> {
  345. <span class="kw">enum</span> <span class="ident">A</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span> {
  346. <span class="ident">B</span>(<span class="ident">T</span>),
  347. <span class="ident">C</span>(<span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">U</span><span class="op">&gt;</span>),
  348. }
  349. };
  350. <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">Structure</span>::<span class="ident">new</span>(<span class="kw-2">&amp;</span><span class="ident">di</span>);
  351. <span class="ident">s</span>.<span class="ident">filter_variants</span>(<span class="op">|</span><span class="ident">v</span><span class="op">|</span> <span class="ident">v</span>.<span class="ident">ast</span>().<span class="ident">ident</span> <span class="op">!=</span> <span class="string">&quot;B&quot;</span>);
  352. <span class="macro">assert_eq</span><span class="macro">!</span>(
  353. <span class="ident">s</span>.<span class="ident">unsafe_bound_impl</span>(<span class="macro">quote</span><span class="macro">!</span>(<span class="ident">krate</span>::<span class="ident">Trait</span>), <span class="macro">quote</span><span class="macro">!</span>{
  354. <span class="kw">fn</span> <span class="ident">a</span>() {}
  355. }).<span class="ident">to_string</span>(),
  356. <span class="macro">quote</span><span class="macro">!</span>{
  357. <span class="attribute">#[<span class="ident">allow</span>(<span class="ident">non_upper_case_globals</span>)]</span>
  358. <span class="kw">const</span> <span class="ident">_DERIVE_krate_Trait_FOR_A</span>: () <span class="op">=</span> {
  359. <span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">krate</span>;
  360. <span class="kw">unsafe</span> <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span> <span class="ident">krate</span>::<span class="ident">Trait</span> <span class="kw">for</span> <span class="ident">A</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span>
  361. <span class="kw">where</span> <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">U</span><span class="op">&gt;</span>: <span class="ident">krate</span>::<span class="ident">Trait</span>,
  362. <span class="ident">U</span>: <span class="ident">krate</span>::<span class="ident">Trait</span>
  363. {
  364. <span class="kw">fn</span> <span class="ident">a</span>() {}
  365. }
  366. };
  367. }.<span class="ident">to_string</span>()
  368. );</pre>
  369. </div><h4 id='method.unbound_impl' class="method"><span id='unbound_impl.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.unbound_impl' class='fnname'>unbound_impl</a>&lt;P:&nbsp;<a class="trait" href="../quote/to_tokens/trait.ToTokens.html" title="trait quote::to_tokens::ToTokens">ToTokens</a>, B:&nbsp;<a class="trait" href="../quote/to_tokens/trait.ToTokens.html" title="trait quote::to_tokens::ToTokens">ToTokens</a>&gt;(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self, <br>&nbsp;&nbsp;&nbsp;&nbsp;path: P, <br>&nbsp;&nbsp;&nbsp;&nbsp;body: B<br>) -&gt; <a class="struct" href="../proc_macro2/struct.TokenStream.html" title="struct proc_macro2::TokenStream">TokenStream</a></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1760-1767' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><blockquote>
  370. <p>NOTE: This methods' features are superceded by <code>Structure::gen_impl</code>.</p>
  371. </blockquote>
  372. <p>Creates an <code>impl</code> block with the required generic type fields filled in
  373. to implement the trait <code>path</code>.</p>
  374. <p>This method will not add any where clauses to the impl.</p>
  375. <h1 id="hygiene-and-paths-2" class="section-header"><a href="#hygiene-and-paths-2">Hygiene and Paths</a></h1>
  376. <p>This method wraps the impl block inside of a <code>const</code> (see the example
  377. below). In this scope, the first segment of the passed-in path is
  378. <code>extern crate</code>-ed in. If you don't want to generate that <code>extern crate</code>
  379. item, use a global path.</p>
  380. <p>This means that if you are implementing <code>my_crate::Trait</code>, you simply
  381. write <code>s.bound_impl(quote!(my_crate::Trait), quote!(...))</code>, and for the
  382. entirety of the definition, you can refer to your crate as <code>my_crate</code>.</p>
  383. <h1 id="panics-3" class="section-header"><a href="#panics-3">Panics</a></h1>
  384. <p>Panics if the path string parameter is not a valid <code>TraitBound</code>.</p>
  385. <h1 id="example-11" class="section-header"><a href="#example-11">Example</a></h1>
  386. <pre class="rust rust-example-rendered">
  387. <span class="kw">let</span> <span class="ident">di</span>: <span class="ident">syn</span>::<span class="ident">DeriveInput</span> <span class="op">=</span> <span class="macro">parse_quote</span><span class="macro">!</span> {
  388. <span class="kw">enum</span> <span class="ident">A</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span> {
  389. <span class="ident">B</span>(<span class="ident">T</span>),
  390. <span class="ident">C</span>(<span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">U</span><span class="op">&gt;</span>),
  391. }
  392. };
  393. <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">Structure</span>::<span class="ident">new</span>(<span class="kw-2">&amp;</span><span class="ident">di</span>);
  394. <span class="ident">s</span>.<span class="ident">filter_variants</span>(<span class="op">|</span><span class="ident">v</span><span class="op">|</span> <span class="ident">v</span>.<span class="ident">ast</span>().<span class="ident">ident</span> <span class="op">!=</span> <span class="string">&quot;B&quot;</span>);
  395. <span class="macro">assert_eq</span><span class="macro">!</span>(
  396. <span class="ident">s</span>.<span class="ident">unbound_impl</span>(<span class="macro">quote</span><span class="macro">!</span>(<span class="ident">krate</span>::<span class="ident">Trait</span>), <span class="macro">quote</span><span class="macro">!</span>{
  397. <span class="kw">fn</span> <span class="ident">a</span>() {}
  398. }).<span class="ident">to_string</span>(),
  399. <span class="macro">quote</span><span class="macro">!</span>{
  400. <span class="attribute">#[<span class="ident">allow</span>(<span class="ident">non_upper_case_globals</span>)]</span>
  401. <span class="kw">const</span> <span class="ident">_DERIVE_krate_Trait_FOR_A</span>: () <span class="op">=</span> {
  402. <span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">krate</span>;
  403. <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span> <span class="ident">krate</span>::<span class="ident">Trait</span> <span class="kw">for</span> <span class="ident">A</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span> {
  404. <span class="kw">fn</span> <span class="ident">a</span>() {}
  405. }
  406. };
  407. }.<span class="ident">to_string</span>()
  408. );</pre>
  409. </div><h4 id='method.unsafe_unbound_impl' class="method"><span id='unsafe_unbound_impl.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.unsafe_unbound_impl' class='fnname'>unsafe_unbound_impl</a>&lt;P:&nbsp;<a class="trait" href="../quote/to_tokens/trait.ToTokens.html" title="trait quote::to_tokens::ToTokens">ToTokens</a>, B:&nbsp;<a class="trait" href="../quote/to_tokens/trait.ToTokens.html" title="trait quote::to_tokens::ToTokens">ToTokens</a>&gt;(<br>&nbsp;&nbsp;&nbsp;&nbsp;&amp;self, <br>&nbsp;&nbsp;&nbsp;&nbsp;path: P, <br>&nbsp;&nbsp;&nbsp;&nbsp;body: B<br>) -&gt; <a class="struct" href="../proc_macro2/struct.TokenStream.html" title="struct proc_macro2::TokenStream">TokenStream</a></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#1825-1832' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='stability'><div class='stab deprecated'>Deprecated</div></div><div class='docblock'><blockquote>
  410. <p>NOTE: This methods' features are superceded by <code>Structure::gen_impl</code>.</p>
  411. </blockquote>
  412. <p>Creates an <code>impl</code> block with the required generic type fields filled in
  413. to implement the unsafe trait <code>path</code>.</p>
  414. <p>This method will not add any where clauses to the impl.</p>
  415. <h1 id="hygiene-and-paths-3" class="section-header"><a href="#hygiene-and-paths-3">Hygiene and Paths</a></h1>
  416. <p>This method wraps the impl block inside of a <code>const</code> (see the example
  417. below). In this scope, the first segment of the passed-in path is
  418. <code>extern crate</code>-ed in. If you don't want to generate that <code>extern crate</code>
  419. item, use a global path.</p>
  420. <p>This means that if you are implementing <code>my_crate::Trait</code>, you simply
  421. write <code>s.bound_impl(quote!(my_crate::Trait), quote!(...))</code>, and for the
  422. entirety of the definition, you can refer to your crate as <code>my_crate</code>.</p>
  423. <h1 id="panics-4" class="section-header"><a href="#panics-4">Panics</a></h1>
  424. <p>Panics if the path string parameter is not a valid <code>TraitBound</code>.</p>
  425. <h1 id="example-12" class="section-header"><a href="#example-12">Example</a></h1>
  426. <pre class="rust rust-example-rendered">
  427. <span class="kw">let</span> <span class="ident">di</span>: <span class="ident">syn</span>::<span class="ident">DeriveInput</span> <span class="op">=</span> <span class="macro">parse_quote</span><span class="macro">!</span> {
  428. <span class="kw">enum</span> <span class="ident">A</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span> {
  429. <span class="ident">B</span>(<span class="ident">T</span>),
  430. <span class="ident">C</span>(<span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">U</span><span class="op">&gt;</span>),
  431. }
  432. };
  433. <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">Structure</span>::<span class="ident">new</span>(<span class="kw-2">&amp;</span><span class="ident">di</span>);
  434. <span class="ident">s</span>.<span class="ident">filter_variants</span>(<span class="op">|</span><span class="ident">v</span><span class="op">|</span> <span class="ident">v</span>.<span class="ident">ast</span>().<span class="ident">ident</span> <span class="op">!=</span> <span class="string">&quot;B&quot;</span>);
  435. <span class="macro">assert_eq</span><span class="macro">!</span>(
  436. <span class="ident">s</span>.<span class="ident">unsafe_unbound_impl</span>(<span class="macro">quote</span><span class="macro">!</span>(<span class="ident">krate</span>::<span class="ident">Trait</span>), <span class="macro">quote</span><span class="macro">!</span>{
  437. <span class="kw">fn</span> <span class="ident">a</span>() {}
  438. }).<span class="ident">to_string</span>(),
  439. <span class="macro">quote</span><span class="macro">!</span>{
  440. <span class="attribute">#[<span class="ident">allow</span>(<span class="ident">non_upper_case_globals</span>)]</span>
  441. <span class="kw">const</span> <span class="ident">_DERIVE_krate_Trait_FOR_A</span>: () <span class="op">=</span> {
  442. <span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">krate</span>;
  443. <span class="kw">unsafe</span> <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span> <span class="ident">krate</span>::<span class="ident">Trait</span> <span class="kw">for</span> <span class="ident">A</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span> {
  444. <span class="kw">fn</span> <span class="ident">a</span>() {}
  445. }
  446. };
  447. }.<span class="ident">to_string</span>()
  448. );</pre>
  449. </div><h4 id='method.gen_impl' class="method"><span id='gen_impl.v' class='invisible'><table class='table-display'><tbody><tr><td><code>pub fn <a href='#method.gen_impl' class='fnname'>gen_impl</a>(&amp;self, cfg: <a class="struct" href="../proc_macro2/struct.TokenStream.html" title="struct proc_macro2::TokenStream">TokenStream</a>) -&gt; <a class="struct" href="../proc_macro2/struct.TokenStream.html" title="struct proc_macro2::TokenStream">TokenStream</a></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#2049-2159' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Generate an impl block for the given struct. This impl block will
  450. automatically use hygiene tricks to avoid polluting the caller's
  451. namespace, and will automatically add trait bounds for generic type
  452. parameters.</p>
  453. <h1 id="syntax" class="section-header"><a href="#syntax">Syntax</a></h1>
  454. <p>This function accepts its arguments as a <code>TokenStream</code>. The recommended way
  455. to call this function is passing the result of invoking the <code>quote!</code>
  456. macro to it.</p>
  457. <div class='information'><div class='tooltip ignore'>ⓘ<span class='tooltiptext'>This example is not tested</span></div></div><pre class="rust rust-example-rendered ignore">
  458. <span class="ident">s</span>.<span class="ident">gen_impl</span>(<span class="macro">quote</span><span class="macro">!</span> {
  459. <span class="comment">// You can write any items which you want to import into scope here.</span>
  460. <span class="comment">// For example, you may want to include an `extern crate` for the</span>
  461. <span class="comment">// crate which implements your trait. These items will only be</span>
  462. <span class="comment">// visible to the code you generate, and won&#39;t be exposed to the</span>
  463. <span class="comment">// consuming crate</span>
  464. <span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">krate</span>;
  465. <span class="comment">// You can also add `use` statements here to bring types or traits</span>
  466. <span class="comment">// into scope.</span>
  467. <span class="comment">//</span>
  468. <span class="comment">// WARNING: Try not to use common names here, because the stable</span>
  469. <span class="comment">// version of syn does not support hygiene and you could accidentally</span>
  470. <span class="comment">// shadow types from the caller crate.</span>
  471. <span class="kw">use</span> <span class="ident">krate</span>::<span class="ident">Trait</span> <span class="kw">as</span> <span class="ident">MyTrait</span>;
  472. <span class="comment">// The actual impl block is a `gen impl` or `gen unsafe impl` block.</span>
  473. <span class="comment">// You can use `@Self` to refer to the structure&#39;s type.</span>
  474. <span class="ident">gen</span> <span class="kw">impl</span> <span class="ident">MyTrait</span> <span class="kw">for</span> @<span class="self">Self</span> {
  475. <span class="kw">fn</span> <span class="ident">f</span>(<span class="kw-2">&amp;</span><span class="self">self</span>) { ... }
  476. }
  477. })</pre>
  478. <p>The most common usage of this trait involves loading the crate the
  479. target trait comes from with <code>extern crate</code>, and then invoking a <code>gen impl</code> block.</p>
  480. <h1 id="hygiene" class="section-header"><a href="#hygiene">Hygiene</a></h1>
  481. <p>This method tries to handle hygiene intelligenly for both stable and
  482. unstable proc-macro implementations, however there are visible
  483. differences.</p>
  484. <p>The output of every <code>gen_impl</code> function is wrapped in a dummy <code>const</code>
  485. value, to ensure that it is given its own scope, and any values brought
  486. into scope are not leaked to the calling crate. For example, the above
  487. invocation may generate an output like the following:</p>
  488. <div class='information'><div class='tooltip ignore'>ⓘ<span class='tooltiptext'>This example is not tested</span></div></div><pre class="rust rust-example-rendered ignore">
  489. <span class="kw">const</span> <span class="ident">_DERIVE_krate_Trait_FOR_Struct</span>: () <span class="op">=</span> {
  490. <span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">krate</span>;
  491. <span class="kw">use</span> <span class="ident">krate</span>::<span class="ident">Trait</span> <span class="kw">as</span> <span class="ident">MyTrait</span>;
  492. <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span> <span class="ident">MyTrait</span> <span class="kw">for</span> <span class="ident">Struct</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span> <span class="kw">where</span> <span class="ident">T</span>: <span class="ident">MyTrait</span> {
  493. <span class="kw">fn</span> <span class="ident">f</span>(<span class="kw-2">&amp;</span><span class="self">self</span>) { ... }
  494. }
  495. };</pre>
  496. <h3 id="using-the-std-crate" class="section-header"><a href="#using-the-std-crate">Using the <code>std</code> crate</a></h3>
  497. <p>If you are using <code>quote!()</code> to implement your trait, with the
  498. <code>proc-macro2/nightly</code> feature, <code>std</code> isn't considered to be in scope for
  499. your macro. This means that if you use types from <code>std</code> in your
  500. procedural macro, you'll want to explicitly load it with an <code>extern crate std;</code>.</p>
  501. <h3 id="absolute-paths" class="section-header"><a href="#absolute-paths">Absolute paths</a></h3>
  502. <p>You should generally avoid using absolute paths in your generated code,
  503. as they will resolve very differently when using the stable and nightly
  504. versions of <code>proc-macro2</code>. Instead, load the crates you need to use
  505. explictly with <code>extern crate</code> and</p>
  506. <h1 id="trait-bounds" class="section-header"><a href="#trait-bounds">Trait Bounds</a></h1>
  507. <p>This method will automatically add trait bounds for any type parameters
  508. which are referenced within the types of non-ignored fields.</p>
  509. <p>Additional type parameters may be added with the generics syntax after
  510. the <code>impl</code> keyword.</p>
  511. <h3 id="type-macro-caveat" class="section-header"><a href="#type-macro-caveat">Type Macro Caveat</a></h3>
  512. <p>If the method contains any macros in type position, all parameters will
  513. be considered bound. This is because we cannot determine which type
  514. parameters are bound by type macros.</p>
  515. <h1 id="panics-5" class="section-header"><a href="#panics-5">Panics</a></h1>
  516. <p>This function will panic if the input <code>TokenStream</code> is not well-formed, or
  517. if additional type parameters added by <code>impl&lt;..&gt;</code> conflict with generic
  518. type parameters on the original struct.</p>
  519. <h1 id="example-usage" class="section-header"><a href="#example-usage">Example Usage</a></h1>
  520. <pre class="rust rust-example-rendered">
  521. <span class="kw">let</span> <span class="ident">di</span>: <span class="ident">syn</span>::<span class="ident">DeriveInput</span> <span class="op">=</span> <span class="macro">parse_quote</span><span class="macro">!</span> {
  522. <span class="kw">enum</span> <span class="ident">A</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span> {
  523. <span class="ident">B</span>(<span class="ident">T</span>),
  524. <span class="ident">C</span>(<span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">U</span><span class="op">&gt;</span>),
  525. }
  526. };
  527. <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">Structure</span>::<span class="ident">new</span>(<span class="kw-2">&amp;</span><span class="ident">di</span>);
  528. <span class="ident">s</span>.<span class="ident">filter_variants</span>(<span class="op">|</span><span class="ident">v</span><span class="op">|</span> <span class="ident">v</span>.<span class="ident">ast</span>().<span class="ident">ident</span> <span class="op">!=</span> <span class="string">&quot;B&quot;</span>);
  529. <span class="macro">assert_eq</span><span class="macro">!</span>(
  530. <span class="ident">s</span>.<span class="ident">gen_impl</span>(<span class="macro">quote</span><span class="macro">!</span> {
  531. <span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">krate</span>;
  532. <span class="ident">gen</span> <span class="kw">impl</span> <span class="ident">krate</span>::<span class="ident">Trait</span> <span class="kw">for</span> @<span class="self">Self</span> {
  533. <span class="kw">fn</span> <span class="ident">a</span>() {}
  534. }
  535. }).<span class="ident">to_string</span>(),
  536. <span class="macro">quote</span><span class="macro">!</span>{
  537. <span class="attribute">#[<span class="ident">allow</span>(<span class="ident">non_upper_case_globals</span>)]</span>
  538. <span class="kw">const</span> <span class="ident">_DERIVE_krate_Trait_FOR_A</span>: () <span class="op">=</span> {
  539. <span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">krate</span>;
  540. <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span> <span class="ident">krate</span>::<span class="ident">Trait</span> <span class="kw">for</span> <span class="ident">A</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span>
  541. <span class="kw">where</span>
  542. <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">U</span><span class="op">&gt;</span>: <span class="ident">krate</span>::<span class="ident">Trait</span>,
  543. <span class="ident">U</span>: <span class="ident">krate</span>::<span class="ident">Trait</span>
  544. {
  545. <span class="kw">fn</span> <span class="ident">a</span>() {}
  546. }
  547. };
  548. }.<span class="ident">to_string</span>()
  549. );
  550. <span class="comment">// NOTE: You can also add extra generics after the impl</span>
  551. <span class="macro">assert_eq</span><span class="macro">!</span>(
  552. <span class="ident">s</span>.<span class="ident">gen_impl</span>(<span class="macro">quote</span><span class="macro">!</span> {
  553. <span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">krate</span>;
  554. <span class="ident">gen</span> <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">X</span>: <span class="ident">krate</span>::<span class="ident">OtherTrait</span><span class="op">&gt;</span> <span class="ident">krate</span>::<span class="ident">Trait</span><span class="op">&lt;</span><span class="ident">X</span><span class="op">&gt;</span> <span class="kw">for</span> @<span class="self">Self</span>
  555. <span class="kw">where</span>
  556. <span class="ident">X</span>: <span class="ident">Send</span> <span class="op">+</span> <span class="ident">Sync</span>,
  557. {
  558. <span class="kw">fn</span> <span class="ident">a</span>() {}
  559. }
  560. }).<span class="ident">to_string</span>(),
  561. <span class="macro">quote</span><span class="macro">!</span>{
  562. <span class="attribute">#[<span class="ident">allow</span>(<span class="ident">non_upper_case_globals</span>)]</span>
  563. <span class="kw">const</span> <span class="ident">_DERIVE_krate_Trait_X_FOR_A</span>: () <span class="op">=</span> {
  564. <span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">krate</span>;
  565. <span class="kw">impl</span><span class="op">&lt;</span><span class="ident">X</span>: <span class="ident">krate</span>::<span class="ident">OtherTrait</span>, <span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span> <span class="ident">krate</span>::<span class="ident">Trait</span><span class="op">&lt;</span><span class="ident">X</span><span class="op">&gt;</span> <span class="kw">for</span> <span class="ident">A</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">U</span><span class="op">&gt;</span>
  566. <span class="kw">where</span>
  567. <span class="ident">X</span>: <span class="ident">Send</span> <span class="op">+</span> <span class="ident">Sync</span>,
  568. <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">U</span><span class="op">&gt;</span>: <span class="ident">krate</span>::<span class="ident">Trait</span><span class="op">&lt;</span><span class="ident">X</span><span class="op">&gt;</span>,
  569. <span class="ident">U</span>: <span class="ident">krate</span>::<span class="ident">Trait</span><span class="op">&lt;</span><span class="ident">X</span><span class="op">&gt;</span>
  570. {
  571. <span class="kw">fn</span> <span class="ident">a</span>() {}
  572. }
  573. };
  574. }.<span class="ident">to_string</span>()
  575. );</pre>
  576. </div></div>
  577. <h2 id='implementations' class='small-section-header'>
  578. Trait Implementations<a href='#implementations' class='anchor'></a>
  579. </h2>
  580. <div id='implementations-list'><h3 id='impl-Debug' class='impl'><span class='in-band'><table class='table-display'><tbody><tr><td><code>impl&lt;'a&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html" title="trait core::fmt::Debug">Debug</a> for <a class="struct" href="../synstructure/struct.Structure.html" title="struct synstructure::Structure">Structure</a>&lt;'a&gt;</code><a href='#impl-Debug' class='anchor'></a></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#953' title='goto source code'>[src]</a></span></td></tr></tbody></table></h3><div class='impl-items'><h4 id='method.fmt' class="method"><span id='fmt.v' class='invisible'><table class='table-display'><tbody><tr><td><code>fn <a href='https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt' class='fnname'>fmt</a>(&amp;self, f: &amp;mut <a class="struct" href="https://doc.rust-lang.org/nightly/core/fmt/struct.Formatter.html" title="struct core::fmt::Formatter">Formatter</a>) -&gt; <a class="type" href="https://doc.rust-lang.org/nightly/core/fmt/type.Result.html" title="type core::fmt::Result">Result</a></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#953' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Formats the value using the given formatter. <a href="https://doc.rust-lang.org/nightly/core/fmt/trait.Debug.html#tymethod.fmt">Read more</a></p>
  581. </div></div><h3 id='impl-Clone' class='impl'><span class='in-band'><table class='table-display'><tbody><tr><td><code>impl&lt;'a&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a> for <a class="struct" href="../synstructure/struct.Structure.html" title="struct synstructure::Structure">Structure</a>&lt;'a&gt;</code><a href='#impl-Clone' class='anchor'></a></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#953' title='goto source code'>[src]</a></span></td></tr></tbody></table></h3><div class='impl-items'><h4 id='method.clone' class="method"><span id='clone.v' class='invisible'><table class='table-display'><tbody><tr><td><code>fn <a href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone' class='fnname'>clone</a>(&amp;self) -&gt; <a class="struct" href="../synstructure/struct.Structure.html" title="struct synstructure::Structure">Structure</a>&lt;'a&gt;</code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#953' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Returns a copy of the value. <a href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#tymethod.clone">Read more</a></p>
  582. </div><h4 id='method.clone_from' class="method"><span id='clone_from.v' class='invisible'><table class='table-display'><tbody><tr><td><code>fn <a href='https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from' class='fnname'>clone_from</a>(&amp;mut self, source: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;</a>Self)</code></span></td><td><span class='out-of-band'><div class='ghost'></div><div class='since' title='Stable since Rust version 1.0.0'>1.0.0</div><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/clone.rs.html#130-132' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Performs copy-assignment from <code>source</code>. <a href="https://doc.rust-lang.org/nightly/core/clone/trait.Clone.html#method.clone_from">Read more</a></p>
  583. </div></div><h3 id='impl-PartialEq' class='impl'><span class='in-band'><table class='table-display'><tbody><tr><td><code>impl&lt;'a&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html" title="trait core::cmp::PartialEq">PartialEq</a> for <a class="struct" href="../synstructure/struct.Structure.html" title="struct synstructure::Structure">Structure</a>&lt;'a&gt;</code><a href='#impl-PartialEq' class='anchor'></a></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#953' title='goto source code'>[src]</a></span></td></tr></tbody></table></h3><div class='impl-items'><h4 id='method.eq' class="method"><span id='eq.v' class='invisible'><table class='table-display'><tbody><tr><td><code>fn <a href='https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#tymethod.eq' class='fnname'>eq</a>(&amp;self, other: &amp;<a class="struct" href="../synstructure/struct.Structure.html" title="struct synstructure::Structure">Structure</a>&lt;'a&gt;) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#953' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>This method tests for <code>self</code> and <code>other</code> values to be equal, and is used by <code>==</code>. <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#tymethod.eq">Read more</a></p>
  584. </div><h4 id='method.ne' class="method"><span id='ne.v' class='invisible'><table class='table-display'><tbody><tr><td><code>fn <a href='https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html#method.ne' class='fnname'>ne</a>(&amp;self, other: &amp;<a class="struct" href="../synstructure/struct.Structure.html" title="struct synstructure::Structure">Structure</a>&lt;'a&gt;) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#953' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>This method tests for <code>!=</code>.</p>
  585. </div></div><h3 id='impl-Eq' class='impl'><span class='in-band'><table class='table-display'><tbody><tr><td><code>impl&lt;'a&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html" title="trait core::cmp::Eq">Eq</a> for <a class="struct" href="../synstructure/struct.Structure.html" title="struct synstructure::Structure">Structure</a>&lt;'a&gt;</code><a href='#impl-Eq' class='anchor'></a></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#953' title='goto source code'>[src]</a></span></td></tr></tbody></table></h3><div class='impl-items'></div><h3 id='impl-Hash' class='impl'><span class='in-band'><table class='table-display'><tbody><tr><td><code>impl&lt;'a&gt; <a class="trait" href="https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html" title="trait core::hash::Hash">Hash</a> for <a class="struct" href="../synstructure/struct.Structure.html" title="struct synstructure::Structure">Structure</a>&lt;'a&gt;</code><a href='#impl-Hash' class='anchor'></a></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#953' title='goto source code'>[src]</a></span></td></tr></tbody></table></h3><div class='impl-items'><h4 id='method.hash' class="method"><span id='hash.v' class='invisible'><table class='table-display'><tbody><tr><td><code>fn <a href='https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#tymethod.hash' class='fnname'>hash</a>&lt;__H:&nbsp;<a class="trait" href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher">Hasher</a>&gt;(&amp;self, state: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut </a>__H)</code></span></td><td><span class='out-of-band'><div class='ghost'></div><a class='srclink' href='../src/synstructure/lib.rs.html#953' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Feeds this value into the given [<code>Hasher</code>]. <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#tymethod.hash">Read more</a></p>
  586. </div><h4 id='method.hash_slice' class="method"><span id='hash_slice.v' class='invisible'><table class='table-display'><tbody><tr><td><code>fn <a href='https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice' class='fnname'>hash_slice</a>&lt;H&gt;(data: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.slice.html">&amp;[Self]</a>, state: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.reference.html">&amp;mut </a>H) <span class="where fmt-newline">where<br>&nbsp;&nbsp;&nbsp;&nbsp;H: <a class="trait" href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher">Hasher</a>,&nbsp;</span></code></span></td><td><span class='out-of-band'><div class='ghost'></div><div class='since' title='Stable since Rust version 1.3.0'>1.3.0</div><a class='srclink' href='https://doc.rust-lang.org/nightly/src/core/hash/mod.rs.html#203-209' title='goto source code'>[src]</a></td></tr></tbody></table></span></h4><div class='docblock'><p>Feeds a slice of this type into the given [<code>Hasher</code>]. <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice">Read more</a></p>
  587. </div></div></div>
  588. <h2 id='synthetic-implementations' class='small-section-header'>
  589. Auto Trait Implementations<a href='#synthetic-implementations' class='anchor'></a>
  590. </h2>
  591. <div id='synthetic-implementations-list'>
  592. <h3 id='impl-Send' class='impl'><span class='in-band'><table class='table-display'><tbody><tr><td><code>impl&lt;'a&gt; !<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> for <a class="struct" href="../synstructure/struct.Structure.html" title="struct synstructure::Structure">Structure</a>&lt;'a&gt;</code><a href='#impl-Send' class='anchor'></a></span></td><td><span class='out-of-band'></span></td></tr></tbody></table></h3><div class='impl-items'></div><h3 id='impl-Sync' class='impl'><span class='in-band'><table class='table-display'><tbody><tr><td><code>impl&lt;'a&gt; !<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="../synstructure/struct.Structure.html" title="struct synstructure::Structure">Structure</a>&lt;'a&gt;</code><a href='#impl-Sync' class='anchor'></a></span></td><td><span class='out-of-band'></span></td></tr></tbody></table></h3><div class='impl-items'></div></div></section><section id="search" class="content hidden"></section><section class="footer"></section><aside id="help" class="hidden"><div><h1 class="hidden">Help</h1><div class="shortcuts"><h2>Keyboard Shortcuts</h2><dl><dt><kbd>?</kbd></dt><dd>Show this help dialog</dd><dt><kbd>S</kbd></dt><dd>Focus the search field</dd><dt><kbd>↑</kbd></dt><dd>Move up in search results</dd><dt><kbd>↓</kbd></dt><dd>Move down in search results</dd><dt><kbd>↹</kbd></dt><dd>Switch tab</dd><dt><kbd>&#9166;</kbd></dt><dd>Go to active search result</dd><dt><kbd>+</kbd></dt><dd>Expand all sections</dd><dt><kbd>-</kbd></dt><dd>Collapse all sections</dd></dl></div><div class="infos"><h2>Search Tricks</h2><p>Prefix searches with a type followed by a colon (e.g. <code>fn:</code>) to restrict the search to a given type.</p><p>Accepted types are: <code>fn</code>, <code>mod</code>, <code>struct</code>, <code>enum</code>, <code>trait</code>, <code>type</code>, <code>macro</code>, and <code>const</code>.</p><p>Search functions by type signature (e.g. <code>vec -> usize</code> or <code>* -> vec</code>)</p><p>Search multiple things at once by splitting your query with comma (e.g. <code>str,u8</code> or <code>String,struct:Vec,test</code>)</p></div></div></aside><script>window.rootPath = "../";window.currentCrate = "synstructure";</script><script src="../aliases.js"></script><script src="../main.js"></script><script defer src="../search-index.js"></script></body></html>