Skip to content

Commit 1639a2a

Browse files
TrueDoctorKeavon
andauthored
Parse doc comments on node parameters (#2163)
Parse doc comments from node arguments Co-authored-by: Keavon Chambers <[email protected]>
1 parent 6c3c2e8 commit 1639a2a

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

node-graph/gcore/src/registry.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ pub struct NodeMetadata {
4040
#[derive(Clone, Debug)]
4141
pub struct FieldMetadata {
4242
pub name: &'static str,
43+
pub description: &'static str,
4344
pub exposed: bool,
4445
pub value_source: ValueSource,
4546
pub number_min: Option<f64>,

node-graph/node-macro/src/codegen.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
5959
})
6060
.collect();
6161

62+
let input_descriptions: Vec<_> = fields
63+
.iter()
64+
.map(|field| match field {
65+
ParsedField::Regular { description, .. } | ParsedField::Node { description, .. } => description,
66+
})
67+
.collect();
68+
6269
let struct_fields = field_names.iter().zip(struct_generics.iter()).map(|(name, gen)| {
6370
quote! { pub(super) #name: #gen }
6471
});
@@ -263,6 +270,7 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
263270
#(
264271
FieldMetadata {
265272
name: #input_names,
273+
description: #input_descriptions,
266274
exposed: #exposed,
267275
value_source: #value_sources,
268276
number_min: #number_min_values,

node-graph/node-macro/src/parsing.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ pub(crate) enum ParsedField {
5555
Regular {
5656
pat_ident: PatIdent,
5757
name: Option<LitStr>,
58+
description: String,
5859
ty: Type,
5960
exposed: bool,
6061
value_source: ValueSource,
@@ -66,6 +67,7 @@ pub(crate) enum ParsedField {
6667
Node {
6768
pat_ident: PatIdent,
6869
name: Option<LitStr>,
70+
description: String,
6971
input_type: Type,
7072
output_type: Type,
7173
implementations: Punctuated<Implementation, Comma>,
@@ -383,6 +385,21 @@ fn parse_field(pat_ident: PatIdent, ty: Type, attrs: &[Attribute]) -> syn::Resul
383385
}
384386

385387
let (is_node, node_input_type, node_output_type) = parse_node_type(&ty);
388+
let description = attrs
389+
.iter()
390+
.filter_map(|a| {
391+
if a.style != AttrStyle::Outer {
392+
return None;
393+
}
394+
let Meta::NameValue(name_val) = &a.meta else { return None };
395+
if name_val.path.get_ident().map(|x| x.to_string()) != Some("doc".into()) {
396+
return None;
397+
}
398+
let Expr::Lit(expr_lit) = &name_val.value else { return None };
399+
let Lit::Str(ref text) = expr_lit.lit else { return None };
400+
Some(text.value().trim().to_string())
401+
})
402+
.fold(String::new(), |acc, b| acc + &b + "\n");
386403

387404
if is_node {
388405
let (input_type, output_type) = node_input_type
@@ -399,6 +416,7 @@ fn parse_field(pat_ident: PatIdent, ty: Type, attrs: &[Attribute]) -> syn::Resul
399416
Ok(ParsedField::Node {
400417
pat_ident,
401418
name,
419+
description,
402420
input_type,
403421
output_type,
404422
implementations,
@@ -411,6 +429,7 @@ fn parse_field(pat_ident: PatIdent, ty: Type, attrs: &[Attribute]) -> syn::Resul
411429
Ok(ParsedField::Regular {
412430
pat_ident,
413431
name,
432+
description,
414433
exposed,
415434
number_min,
416435
number_max,
@@ -599,6 +618,7 @@ mod tests {
599618
fields: vec![ParsedField::Regular {
600619
pat_ident: pat_ident("b"),
601620
name: None,
621+
description: String::new(),
602622
ty: parse_quote!(f64),
603623
exposed: false,
604624
value_source: ValueSource::None,
@@ -652,13 +672,15 @@ mod tests {
652672
ParsedField::Node {
653673
pat_ident: pat_ident("transform_target"),
654674
name: None,
675+
description: String::new(),
655676
input_type: parse_quote!(Footprint),
656677
output_type: parse_quote!(T),
657678
implementations: Punctuated::new(),
658679
},
659680
ParsedField::Regular {
660681
pat_ident: pat_ident("translate"),
661682
name: None,
683+
description: String::new(),
662684
ty: parse_quote!(DVec2),
663685
exposed: false,
664686
value_source: ValueSource::None,
@@ -709,6 +731,7 @@ mod tests {
709731
fields: vec![ParsedField::Regular {
710732
pat_ident: pat_ident("radius"),
711733
name: None,
734+
description: String::new(),
712735
ty: parse_quote!(f64),
713736
exposed: false,
714737
value_source: ValueSource::Default(quote!(50.)),
@@ -757,6 +780,7 @@ mod tests {
757780
fields: vec![ParsedField::Regular {
758781
pat_ident: pat_ident("shadows"),
759782
name: None,
783+
description: String::new(),
760784
ty: parse_quote!(f64),
761785
exposed: false,
762786
value_source: ValueSource::None,
@@ -784,6 +808,7 @@ mod tests {
784808
let input = quote!(
785809
fn add(
786810
a: f64,
811+
/// b
787812
#[range((0., 100.))]
788813
#[min(-500.)]
789814
#[max(500.)]
@@ -816,6 +841,7 @@ mod tests {
816841
fields: vec![ParsedField::Regular {
817842
pat_ident: pat_ident("b"),
818843
name: None,
844+
description: String::from("b"),
819845
ty: parse_quote!(f64),
820846
exposed: false,
821847
value_source: ValueSource::None,
@@ -865,6 +891,7 @@ mod tests {
865891
pat_ident: pat_ident("path"),
866892
name: None,
867893
ty: parse_quote!(String),
894+
description: String::new(),
868895
exposed: true,
869896
value_source: ValueSource::None,
870897
number_min: None,

0 commit comments

Comments
 (0)