1 | /// The goal of tracing generic parameter usage. |
2 | /// |
3 | /// Not all uses of type parameters imply a need to add bounds to a generated trait impl. |
4 | /// For example, a field of type `<Vec<T> as a::b::Trait>::Associated` does not need a |
5 | /// `where T: Serialize` bound in `serde`. |
6 | /// However, a proc macro that is attempting to generate a helper struct _would_ need to |
7 | /// know about this usage, or else the generated code would reference an unknown type `T` |
8 | /// and fail to compile. |
9 | #[derive (Debug, Copy, Clone, PartialEq, Eq)] |
10 | pub enum Purpose { |
11 | /// The tracing is being used to generate an `impl` block. |
12 | /// |
13 | /// Uses such as `syn::TypePath.qself` will _not_ be returned. |
14 | BoundImpl, |
15 | /// The tracing is being used to generate a new struct or enum. |
16 | /// |
17 | /// All uses will be returned. |
18 | Declare, |
19 | } |
20 | |
21 | /// Control struct for searching type parameters. |
22 | /// |
23 | /// This acts as the search context, preserving information that might have been |
24 | /// kept on a visitor in a different implementation. |
25 | /// Trait implementers are required to pass this through on any invocations they make. |
26 | /// |
27 | /// # Usage |
28 | /// For extensibility, `Options` hides all of its fields from consumers. |
29 | /// To create an instance, use the `From<Purpose>` trait implementation: |
30 | /// |
31 | /// ```rust |
32 | /// # use darling_core::usage::{Options, Purpose}; |
33 | /// let opts: Options = Purpose::BoundImpl.into(); |
34 | /// assert!(!opts.include_type_path_qself()); |
35 | /// ``` |
36 | #[derive (Debug, Clone)] |
37 | pub struct Options { |
38 | purpose: Purpose, |
39 | #[doc (hidden)] |
40 | __nonexhaustive: (), |
41 | } |
42 | |
43 | impl From<Purpose> for Options { |
44 | fn from(purpose: Purpose) -> Self { |
45 | Self { |
46 | purpose, |
47 | __nonexhaustive: (), |
48 | } |
49 | } |
50 | } |
51 | |
52 | impl Options { |
53 | /// Returns `true` if the implementer of `UseTypeParams` should search |
54 | /// `<___ as ...>::...` when looking for type parameter uses. |
55 | pub fn include_type_path_qself(&self) -> bool { |
56 | self.purpose == Purpose::Declare |
57 | } |
58 | } |
59 | |