Files
google-apis-rs/darling_core/usage/index.html
2024-03-05 21:06:01 +01:00

83 lines
12 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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="Traits and types used for tracking the usage of generic parameters through a proc-macro input."><title>darling_core::usage - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/FiraSans-Regular-018c141bf0843ffd.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/FiraSans-Medium-8f9a781e4970d388.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2"><link rel="stylesheet" href="../../static.files/normalize-76eba96aa4d2e634.css"><link rel="stylesheet" href="../../static.files/rustdoc-ac92e1bbe349e143.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="darling_core" data-themes="" data-resource-suffix="" data-rustdoc-version="1.76.0 (07dca489a 2024-02-04)" data-channel="1.76.0" data-search-js="search-2b6ce74ff89ae146.js" data-settings-js="settings-4313503d2e1961c2.js" ><script src="../../static.files/storage-f2adc0d6ca4d09fb.js"></script><script defer src="../sidebar-items.js"></script><script defer src="../../static.files/main-305769736d49e732.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-feafe1bb7466e4bd.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-16x16-8b506e7a72182f1c.png"><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-422f7d1d52889060.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-2c020d218678b618.svg"></head><body class="rustdoc mod"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">&#9776;</button></nav><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../darling_core/index.html">darling_core</a><span class="version">0.20.3</span></h2></div><h2 class="location"><a href="#">Module usage</a></h2><div class="sidebar-elems"><section><ul class="block"><li><a href="#structs">Structs</a></li><li><a href="#enums">Enums</a></li><li><a href="#traits">Traits</a></li><li><a href="#types">Type Aliases</a></li></ul></section><h2><a href="../index.html">In crate darling_core</a></h2></div></nav><div class="sidebar-resizer"></div>
<main><div class="width-limiter"><nav class="sub"><form class="search-form"><span></span><div id="sidebar-button" tabindex="-1"><a href="../../darling_core/all.html" title="show sidebar"></a></div><input class="search-input" name="search" aria-label="Run search in the documentation" autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"><div id="help-button" tabindex="-1"><a href="../../help.html" title="help">?</a></div><div id="settings-menu" tabindex="-1"><a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../static.files/wheel-7b819b6101059cd0.svg"></a></div></form></nav><section id="main-content" class="content"><div class="main-heading"><h1>Module <a href="../index.html">darling_core</a>::<wbr><a class="mod" href="#">usage</a><button id="copy-path" title="Copy item path to clipboard"><img src="../../static.files/clipboard-7571035ce49a181d.svg" width="19" height="18" alt="Copy item path"></button></h1><span class="out-of-band"><a class="src" href="../../src/darling_core/usage/mod.rs.html#1-111">source</a> · <button id="toggle-all-docs" title="collapse all docs">[<span>&#x2212;</span>]</button></span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Traits and types used for tracking the usage of generic parameters through a proc-macro input.</p>
<p>When generating trait impls, libraries often want to automatically figure out which type parameters
are used in which fields, and then emit bounds that will produce the most permissive compilable
code.</p>
<h2 id="usage"><a href="#usage">Usage</a></h2><h3 id="example-1-filtering"><a href="#example-1-filtering">Example 1: Filtering</a></h3>
<p>This example accepts a proc-macro input, then finds all lifetimes and type parameters used
by private fields.</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">fn </span>process(input: <span class="kw-2">&amp;</span>DeriveInput) -&gt; Generics {
<span class="kw">let </span>type_params = input.generics.declared_type_params();
<span class="kw">let </span>lifetimes = input.generics.declared_lifetimes();
<span class="kw">let </span><span class="kw-2">mut </span>ret_generics = input.generics.clone();
<span class="kw">if let </span>Data::Struct(<span class="kw-2">ref </span>body) = input.data {
<span class="kw">let </span>internal_fields = body
.fields
.iter()
.filter(|field| field.vis == Visibility::Inherited)
.collect::&lt;Vec&lt;<span class="kw">_</span>&gt;&gt;();
<span class="kw">let </span>int_type_params = internal_fields
.collect_type_params(<span class="kw-2">&amp;</span>Purpose::BoundImpl.into(), <span class="kw-2">&amp;</span>type_params);
<span class="comment">// We could reuse the vec from above, but here we'll instead
// directly consume the chained iterator.
</span><span class="kw">let </span>int_lifetimes = body
.fields
.iter()
.filter(|field| field.vis == Visibility::Inherited)
.collect_lifetimes(<span class="kw-2">&amp;</span>Purpose::BoundImpl.into(), <span class="kw-2">&amp;</span>lifetimes);
ret_generics.params = ret_generics
.params
.into_iter()
.filter(|gp| {
<span class="kw">match </span><span class="kw-2">*</span>gp {
GenericParam::Type(<span class="kw-2">ref </span>ty) =&gt; int_type_params.contains(<span class="kw-2">&amp;</span>ty.ident),
GenericParam::Lifetime(<span class="kw-2">ref </span>lt) =&gt; int_lifetimes.contains(<span class="kw-2">&amp;</span>lt.lifetime),
<span class="kw">_ </span>=&gt; <span class="bool-val">true</span>,
}
})
.collect();
}
ret_generics
}
</code></pre></div>
<h3 id="example-2-integrating-with-fromderiveinput"><a href="#example-2-integrating-with-fromderiveinput">Example 2: Integrating with <code>FromDeriveInput</code></a></h3>
<p>It is possible to use <code>darling</code>s magic fields feature in tandem with the <code>usage</code> feature set.
While there is no custom derive for <code>UsesTypeParams</code> or <code>UsesLifetimes</code>, there are macros to
generate impls.</p>
<div class="example-wrap ignore"><a href="#" class="tooltip" title="This example is not tested"></a><pre class="rust rust-example-rendered"><code><span class="attr">#![allow(dead_code)]
#[derive(FromField)]
#[darling(attributes(speak))]
</span><span class="kw">struct </span>SpeakerField {
ident: <span class="prelude-ty">Option</span>&lt;syn::Ident&gt;,
ty: syn::Type,
<span class="attr">#[darling(default)]
</span>volume: <span class="prelude-ty">Option</span>&lt;u32&gt;,
}
<span class="macro">uses_type_params!</span>(SpeakerField, ty);
<span class="macro">uses_lifetimes!</span>(SpeakerField, ty);
<span class="attr">#[derive(FromDeriveInput)]
</span><span class="kw">struct </span>SpeakerOptions {
generics: syn::Generics,
data: darling::ast::Data&lt;darling::util::Ignored, SpeakerField&gt;,
}</code></pre></div>
<p>At this point, you are able to call <code>uses_type_params</code> on <code>SpeakerOptions.data</code>, or any filtered
view of it. <code>darling</code> internally uses this in conjunction with the <code>skip</code> meta-item to determine
which type parameters dont require the <code>FromMeta</code> bound in generated impls.</p>
<p><strong>Note:</strong> If you are performing operations referencing generic params in meta-items parsed by <code>darling</code>,
you should determine if those impact the emitted code and wire up <code>UsesTypeParams</code> accordingly for
your field/variant.</p>
</div></details><h2 id="structs" class="section-header"><a href="#structs">Structs</a></h2><ul class="item-table"><li><div class="item-name"><a class="struct" href="struct.Options.html" title="struct darling_core::usage::Options">Options</a></div><div class="desc docblock-short">Control struct for searching type parameters.</div></li></ul><h2 id="enums" class="section-header"><a href="#enums">Enums</a></h2><ul class="item-table"><li><div class="item-name"><a class="enum" href="enum.Purpose.html" title="enum darling_core::usage::Purpose">Purpose</a></div><div class="desc docblock-short">The goal of tracing generic parameter usage.</div></li></ul><h2 id="traits" class="section-header"><a href="#traits">Traits</a></h2><ul class="item-table"><li><div class="item-name"><a class="trait" href="trait.CollectLifetimes.html" title="trait darling_core::usage::CollectLifetimes">CollectLifetimes</a></div><div class="desc docblock-short">Searcher for finding lifetimes in an iterator.</div></li><li><div class="item-name"><a class="trait" href="trait.CollectTypeParams.html" title="trait darling_core::usage::CollectTypeParams">CollectTypeParams</a></div><div class="desc docblock-short">Searcher for finding type params in an iterator.</div></li><li><div class="item-name"><a class="trait" href="trait.GenericsExt.html" title="trait darling_core::usage::GenericsExt">GenericsExt</a></div><div class="desc docblock-short">Extension trait for pulling specific generics data from a generics AST representation.</div></li><li><div class="item-name"><a class="trait" href="trait.UsesLifetimes.html" title="trait darling_core::usage::UsesLifetimes">UsesLifetimes</a></div><div class="desc docblock-short">Searcher for finding lifetimes in a syntax tree.
This can be used to determine which lifetimes must be emitted in generated code.</div></li><li><div class="item-name"><a class="trait" href="trait.UsesTypeParams.html" title="trait darling_core::usage::UsesTypeParams">UsesTypeParams</a></div><div class="desc docblock-short">Searcher for finding type params in a syntax tree.
This can be used to determine if a given type parameter needs to be bounded in a generated impl.</div></li></ul><h2 id="types" class="section-header"><a href="#types">Type Aliases</a></h2><ul class="item-table"><li><div class="item-name"><a class="type" href="type.IdentRefSet.html" title="type darling_core::usage::IdentRefSet">IdentRefSet</a></div><div class="desc docblock-short">A set of references to idents.</div></li><li><div class="item-name"><a class="type" href="type.IdentSet.html" title="type darling_core::usage::IdentSet">IdentSet</a></div><div class="desc docblock-short">A set of idents.</div></li><li><div class="item-name"><a class="type" href="type.LifetimeRefSet.html" title="type darling_core::usage::LifetimeRefSet">LifetimeRefSet</a></div><div class="desc docblock-short">A set of references to lifetimes.</div></li><li><div class="item-name"><a class="type" href="type.LifetimeSet.html" title="type darling_core::usage::LifetimeSet">LifetimeSet</a></div><div class="desc docblock-short">A set of lifetimes.</div></li></ul></section></div></main></body></html>