Skip to content

Commit e56136f

Browse files
Adding support for doc comments on EnumDiscriminants generated type (#140)
1 parent 96ee0a9 commit e56136f

File tree

3 files changed

+24
-2
lines changed

3 files changed

+24
-2
lines changed

strum_macros/src/helpers/metadata.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ pub mod kw {
1919
custom_keyword!(derive);
2020
custom_keyword!(name);
2121
custom_keyword!(vis);
22+
custom_keyword!(doc);
2223

2324
// variant metadata
2425
custom_keyword!(message);
@@ -58,6 +59,7 @@ pub enum EnumDiscriminantsMeta {
5859
Derive { kw: kw::derive, paths: Vec<Path> },
5960
Name { kw: kw::name, name: Ident },
6061
Vis { kw: kw::vis, vis: Visibility },
62+
Doc { kw: kw::doc, doc: LitStr },
6163
Other { path: Path, nested: TokenStream },
6264
}
6365

@@ -84,6 +86,12 @@ impl Parse for EnumDiscriminantsMeta {
8486
parenthesized!(content in input);
8587
let vis = content.parse()?;
8688
Ok(EnumDiscriminantsMeta::Vis { kw, vis })
89+
} else if input.peek(kw::doc) {
90+
let kw = input.parse()?;
91+
let content;
92+
parenthesized!(content in input);
93+
let doc = content.parse()?;
94+
Ok(EnumDiscriminantsMeta::Doc { kw, doc })
8795
} else {
8896
let path = input.parse()?;
8997
let content;
@@ -100,6 +108,7 @@ impl Spanned for EnumDiscriminantsMeta {
100108
EnumDiscriminantsMeta::Derive { kw, .. } => kw.span,
101109
EnumDiscriminantsMeta::Name { kw, .. } => kw.span,
102110
EnumDiscriminantsMeta::Vis { kw, .. } => kw.span,
111+
EnumDiscriminantsMeta::Doc { kw, .. } => kw.span,
103112
EnumDiscriminantsMeta::Other { path, .. } => path.span(),
104113
}
105114
}

strum_macros/src/helpers/type_props.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use proc_macro2::TokenStream;
22
use quote::quote;
33
use std::default::Default;
4-
use syn::{DeriveInput, Ident, Path, Visibility};
4+
use syn::{DeriveInput, Ident, LitStr, Path, Visibility};
55

66
use super::case_style::CaseStyle;
77
use super::metadata::{DeriveInputExt, EnumDiscriminantsMeta, EnumMeta};
@@ -18,6 +18,7 @@ pub struct StrumTypeProperties {
1818
pub discriminant_name: Option<Ident>,
1919
pub discriminant_others: Vec<TokenStream>,
2020
pub discriminant_vis: Option<Visibility>,
21+
pub discriminant_docs: Vec<LitStr>,
2122
}
2223

2324
impl HasTypeProperties for DeriveInput {
@@ -64,6 +65,9 @@ impl HasTypeProperties for DeriveInput {
6465
vis_kw = Some(kw);
6566
output.discriminant_vis = Some(vis);
6667
}
68+
EnumDiscriminantsMeta::Doc { doc, .. } => {
69+
output.discriminant_docs.push(doc);
70+
}
6771
EnumDiscriminantsMeta::Other { path, nested } => {
6872
output.discriminant_others.push(quote! { #path(#nested) });
6973
}

strum_macros/src/macros/enum_discriminants.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,15 @@ pub fn enum_discriminants_inner(ast: &DeriveInput) -> syn::Result<TokenStream> {
2929
#[derive(Clone, Copy, Debug, PartialEq, Eq, #(#derives),*)]
3030
};
3131

32+
// Create #[doc] attrs for new generated type.
33+
let docs = type_properties.discriminant_docs;
34+
35+
let docs = quote! {
36+
#(#[doc = #docs])*
37+
};
38+
39+
println!("{:?}", docs);
40+
3241
// Work out the name
3342
let default_name = syn::Ident::new(
3443
&format!("{}Discriminants", name.to_string()),
@@ -125,7 +134,7 @@ pub fn enum_discriminants_inner(ast: &DeriveInput) -> syn::Result<TokenStream> {
125134
};
126135

127136
Ok(quote! {
128-
/// Auto-generated discriminant enum variants
137+
#docs
129138
#derives
130139
#(#[ #pass_though_attributes ])*
131140
#discriminants_vis enum #discriminants_name {

0 commit comments

Comments
 (0)