Parse doc comments on node parameters (#2163)
Parse doc comments from node arguments Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
parent
6c3c2e8529
commit
1639a2afba
|
|
@ -40,6 +40,7 @@ pub struct NodeMetadata {
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct FieldMetadata {
|
pub struct FieldMetadata {
|
||||||
pub name: &'static str,
|
pub name: &'static str,
|
||||||
|
pub description: &'static str,
|
||||||
pub exposed: bool,
|
pub exposed: bool,
|
||||||
pub value_source: ValueSource,
|
pub value_source: ValueSource,
|
||||||
pub number_min: Option<f64>,
|
pub number_min: Option<f64>,
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,13 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
let input_descriptions: Vec<_> = fields
|
||||||
|
.iter()
|
||||||
|
.map(|field| match field {
|
||||||
|
ParsedField::Regular { description, .. } | ParsedField::Node { description, .. } => description,
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
let struct_fields = field_names.iter().zip(struct_generics.iter()).map(|(name, gen)| {
|
let struct_fields = field_names.iter().zip(struct_generics.iter()).map(|(name, gen)| {
|
||||||
quote! { pub(super) #name: #gen }
|
quote! { pub(super) #name: #gen }
|
||||||
});
|
});
|
||||||
|
|
@ -263,6 +270,7 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
|
||||||
#(
|
#(
|
||||||
FieldMetadata {
|
FieldMetadata {
|
||||||
name: #input_names,
|
name: #input_names,
|
||||||
|
description: #input_descriptions,
|
||||||
exposed: #exposed,
|
exposed: #exposed,
|
||||||
value_source: #value_sources,
|
value_source: #value_sources,
|
||||||
number_min: #number_min_values,
|
number_min: #number_min_values,
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,7 @@ pub(crate) enum ParsedField {
|
||||||
Regular {
|
Regular {
|
||||||
pat_ident: PatIdent,
|
pat_ident: PatIdent,
|
||||||
name: Option<LitStr>,
|
name: Option<LitStr>,
|
||||||
|
description: String,
|
||||||
ty: Type,
|
ty: Type,
|
||||||
exposed: bool,
|
exposed: bool,
|
||||||
value_source: ValueSource,
|
value_source: ValueSource,
|
||||||
|
|
@ -66,6 +67,7 @@ pub(crate) enum ParsedField {
|
||||||
Node {
|
Node {
|
||||||
pat_ident: PatIdent,
|
pat_ident: PatIdent,
|
||||||
name: Option<LitStr>,
|
name: Option<LitStr>,
|
||||||
|
description: String,
|
||||||
input_type: Type,
|
input_type: Type,
|
||||||
output_type: Type,
|
output_type: Type,
|
||||||
implementations: Punctuated<Implementation, Comma>,
|
implementations: Punctuated<Implementation, Comma>,
|
||||||
|
|
@ -383,6 +385,21 @@ fn parse_field(pat_ident: PatIdent, ty: Type, attrs: &[Attribute]) -> syn::Resul
|
||||||
}
|
}
|
||||||
|
|
||||||
let (is_node, node_input_type, node_output_type) = parse_node_type(&ty);
|
let (is_node, node_input_type, node_output_type) = parse_node_type(&ty);
|
||||||
|
let description = attrs
|
||||||
|
.iter()
|
||||||
|
.filter_map(|a| {
|
||||||
|
if a.style != AttrStyle::Outer {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
let Meta::NameValue(name_val) = &a.meta else { return None };
|
||||||
|
if name_val.path.get_ident().map(|x| x.to_string()) != Some("doc".into()) {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
let Expr::Lit(expr_lit) = &name_val.value else { return None };
|
||||||
|
let Lit::Str(ref text) = expr_lit.lit else { return None };
|
||||||
|
Some(text.value().trim().to_string())
|
||||||
|
})
|
||||||
|
.fold(String::new(), |acc, b| acc + &b + "\n");
|
||||||
|
|
||||||
if is_node {
|
if is_node {
|
||||||
let (input_type, output_type) = node_input_type
|
let (input_type, output_type) = node_input_type
|
||||||
|
|
@ -399,6 +416,7 @@ fn parse_field(pat_ident: PatIdent, ty: Type, attrs: &[Attribute]) -> syn::Resul
|
||||||
Ok(ParsedField::Node {
|
Ok(ParsedField::Node {
|
||||||
pat_ident,
|
pat_ident,
|
||||||
name,
|
name,
|
||||||
|
description,
|
||||||
input_type,
|
input_type,
|
||||||
output_type,
|
output_type,
|
||||||
implementations,
|
implementations,
|
||||||
|
|
@ -411,6 +429,7 @@ fn parse_field(pat_ident: PatIdent, ty: Type, attrs: &[Attribute]) -> syn::Resul
|
||||||
Ok(ParsedField::Regular {
|
Ok(ParsedField::Regular {
|
||||||
pat_ident,
|
pat_ident,
|
||||||
name,
|
name,
|
||||||
|
description,
|
||||||
exposed,
|
exposed,
|
||||||
number_min,
|
number_min,
|
||||||
number_max,
|
number_max,
|
||||||
|
|
@ -599,6 +618,7 @@ mod tests {
|
||||||
fields: vec![ParsedField::Regular {
|
fields: vec![ParsedField::Regular {
|
||||||
pat_ident: pat_ident("b"),
|
pat_ident: pat_ident("b"),
|
||||||
name: None,
|
name: None,
|
||||||
|
description: String::new(),
|
||||||
ty: parse_quote!(f64),
|
ty: parse_quote!(f64),
|
||||||
exposed: false,
|
exposed: false,
|
||||||
value_source: ValueSource::None,
|
value_source: ValueSource::None,
|
||||||
|
|
@ -652,6 +672,7 @@ mod tests {
|
||||||
ParsedField::Node {
|
ParsedField::Node {
|
||||||
pat_ident: pat_ident("transform_target"),
|
pat_ident: pat_ident("transform_target"),
|
||||||
name: None,
|
name: None,
|
||||||
|
description: String::new(),
|
||||||
input_type: parse_quote!(Footprint),
|
input_type: parse_quote!(Footprint),
|
||||||
output_type: parse_quote!(T),
|
output_type: parse_quote!(T),
|
||||||
implementations: Punctuated::new(),
|
implementations: Punctuated::new(),
|
||||||
|
|
@ -659,6 +680,7 @@ mod tests {
|
||||||
ParsedField::Regular {
|
ParsedField::Regular {
|
||||||
pat_ident: pat_ident("translate"),
|
pat_ident: pat_ident("translate"),
|
||||||
name: None,
|
name: None,
|
||||||
|
description: String::new(),
|
||||||
ty: parse_quote!(DVec2),
|
ty: parse_quote!(DVec2),
|
||||||
exposed: false,
|
exposed: false,
|
||||||
value_source: ValueSource::None,
|
value_source: ValueSource::None,
|
||||||
|
|
@ -709,6 +731,7 @@ mod tests {
|
||||||
fields: vec![ParsedField::Regular {
|
fields: vec![ParsedField::Regular {
|
||||||
pat_ident: pat_ident("radius"),
|
pat_ident: pat_ident("radius"),
|
||||||
name: None,
|
name: None,
|
||||||
|
description: String::new(),
|
||||||
ty: parse_quote!(f64),
|
ty: parse_quote!(f64),
|
||||||
exposed: false,
|
exposed: false,
|
||||||
value_source: ValueSource::Default(quote!(50.)),
|
value_source: ValueSource::Default(quote!(50.)),
|
||||||
|
|
@ -757,6 +780,7 @@ mod tests {
|
||||||
fields: vec![ParsedField::Regular {
|
fields: vec![ParsedField::Regular {
|
||||||
pat_ident: pat_ident("shadows"),
|
pat_ident: pat_ident("shadows"),
|
||||||
name: None,
|
name: None,
|
||||||
|
description: String::new(),
|
||||||
ty: parse_quote!(f64),
|
ty: parse_quote!(f64),
|
||||||
exposed: false,
|
exposed: false,
|
||||||
value_source: ValueSource::None,
|
value_source: ValueSource::None,
|
||||||
|
|
@ -784,6 +808,7 @@ mod tests {
|
||||||
let input = quote!(
|
let input = quote!(
|
||||||
fn add(
|
fn add(
|
||||||
a: f64,
|
a: f64,
|
||||||
|
/// b
|
||||||
#[range((0., 100.))]
|
#[range((0., 100.))]
|
||||||
#[min(-500.)]
|
#[min(-500.)]
|
||||||
#[max(500.)]
|
#[max(500.)]
|
||||||
|
|
@ -816,6 +841,7 @@ mod tests {
|
||||||
fields: vec![ParsedField::Regular {
|
fields: vec![ParsedField::Regular {
|
||||||
pat_ident: pat_ident("b"),
|
pat_ident: pat_ident("b"),
|
||||||
name: None,
|
name: None,
|
||||||
|
description: String::from("b"),
|
||||||
ty: parse_quote!(f64),
|
ty: parse_quote!(f64),
|
||||||
exposed: false,
|
exposed: false,
|
||||||
value_source: ValueSource::None,
|
value_source: ValueSource::None,
|
||||||
|
|
@ -865,6 +891,7 @@ mod tests {
|
||||||
pat_ident: pat_ident("path"),
|
pat_ident: pat_ident("path"),
|
||||||
name: None,
|
name: None,
|
||||||
ty: parse_quote!(String),
|
ty: parse_quote!(String),
|
||||||
|
description: String::new(),
|
||||||
exposed: true,
|
exposed: true,
|
||||||
value_source: ValueSource::None,
|
value_source: ValueSource::None,
|
||||||
number_min: None,
|
number_min: None,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue