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 { from(purpose: Purpose) -> Self44 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. include_type_path_qself(&self) -> bool55 pub fn include_type_path_qself(&self) -> bool { 56 self.purpose == Purpose::Declare 57 } 58 } 59