Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Raw field names in property structs #2273

Merged
merged 2 commits into from Dec 15, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
9 changes: 5 additions & 4 deletions packages/yew-macro/src/derive_props/builder.rs
Expand Up @@ -8,7 +8,7 @@
use super::generics::{to_arguments, with_param_bounds, GenericArguments};
use super::{DerivePropsInput, PropField};
use proc_macro2::{Ident, Span};
use quote::{quote, ToTokens};
use quote::{format_ident, quote, ToTokens};

pub struct PropsBuilder<'a> {
builder_name: &'a Ident,
Expand Down Expand Up @@ -121,9 +121,10 @@ impl PropsBuilder<'_> {
.filter(|pf| pf.is_required())
.map(|pf| pf.to_step_name(prefix))
.collect();
step_names.push(Ident::new(
&format!("{}PropsBuilder", prefix),
prefix.span(),
step_names.push(format_ident!(
"{}PropsBuilder",
prefix,
span = prefix.span(),
));
step_names
}
Expand Down
12 changes: 7 additions & 5 deletions packages/yew-macro/src/derive_props/field.rs
@@ -1,6 +1,6 @@
use super::generics::GenericArguments;
use proc_macro2::{Ident, Span};
use quote::{quote, quote_spanned};
use quote::{format_ident, quote, quote_spanned};
use std::cmp::{Ord, Ordering, PartialEq, PartialOrd};
use std::convert::TryFrom;
use syn::parse::Result;
Expand Down Expand Up @@ -32,9 +32,11 @@ impl PropField {

/// This step name is descriptive to help a developer realize they missed a required prop
pub fn to_step_name(&self, props_name: &Ident) -> Ident {
Ident::new(
&format!("{}_missing_required_prop_{}", props_name, self.name),
Span::call_site(),
format_ident!(
"{}_missing_required_prop_{}",
props_name,
self.name,
span = Span::call_site(),
)
}

Expand Down Expand Up @@ -172,7 +174,7 @@ impl PropField {
Ok(PropAttr::Option)
} else {
let ident = named_field.ident.as_ref().unwrap();
let wrapped_name = Ident::new(&format!("{}_wrapper", ident), Span::call_site());
let wrapped_name = format_ident!("{}_wrapper", ident, span = Span::call_site());
Ok(PropAttr::Required { wrapped_name })
}
}
Expand Down
8 changes: 4 additions & 4 deletions packages/yew-macro/src/derive_props/mod.rs
Expand Up @@ -6,7 +6,7 @@ mod wrapper;
use builder::PropsBuilder;
use field::PropField;
use proc_macro2::{Ident, Span};
use quote::{quote, ToTokens};
use quote::{format_ident, quote, ToTokens};
use std::convert::TryInto;
use syn::parse::{Parse, ParseStream, Result};
use syn::{DeriveInput, Generics, Visibility};
Expand Down Expand Up @@ -60,13 +60,13 @@ impl ToTokens for DerivePropsInput {
} = self;

// The wrapper is a new struct which wraps required props in `Option`
let wrapper_name = Ident::new(&format!("{}Wrapper", props_name), Span::call_site());
let wrapper_name = format_ident!("{}Wrapper", props_name, span = Span::call_site());
let wrapper = PropsWrapper::new(&wrapper_name, generics, &self.prop_fields);
tokens.extend(wrapper.into_token_stream());

// The builder will only build if all required props have been set
let builder_name = Ident::new(&format!("{}Builder", props_name), Span::call_site());
let builder_step = Ident::new(&format!("{}BuilderStep", props_name), Span::call_site());
let builder_name = format_ident!("{}Builder", props_name, span = Span::call_site());
let builder_step = format_ident!("{}BuilderStep", props_name, span = Span::call_site());
let builder = PropsBuilder::new(&builder_name, &builder_step, self, &wrapper_name);
let builder_generic_args = builder.first_step_generic_args();
tokens.extend(builder.into_token_stream());
Expand Down
8 changes: 8 additions & 0 deletions packages/yew-macro/tests/derive_props/pass.rs
Expand Up @@ -251,4 +251,12 @@ mod t12 {
}
}

mod raw_field_names {
#[derive(::yew::Properties, ::std::cmp::PartialEq)]
pub struct Props {
r#true: u32,
r#pointless_raw_name: u32,
}
}

fn main() {}
3 changes: 3 additions & 0 deletions packages/yew-macro/tests/html_macro/component-pass.rs
Expand Up @@ -95,6 +95,8 @@ impl ::std::convert::Into<::yew::virtual_dom::VNode> for ChildrenVariants {
pub struct ChildProperties {
#[prop_or_default]
pub string: ::std::string::String,
#[prop_or_default]
pub r#fn: ::std::primitive::i32,
pub int: ::std::primitive::i32,
#[prop_or_default]
pub opt_str: ::std::option::Option<::std::string::String>,
Expand Down Expand Up @@ -159,6 +161,7 @@ mod scoped {

fn compile_pass() {
::yew::html! { <Child int=1 /> };
::yew::html! { <Child int=1 r#fn=1 /> };

::yew::html! {
<>
Expand Down
10 changes: 10 additions & 0 deletions packages/yew-macro/tests/props_macro/props-pass.rs
Expand Up @@ -43,10 +43,20 @@ struct Props {
b: ::std::primitive::usize,
}

#[derive(::yew::Properties, ::std::cmp::PartialEq)]
pub struct RawIdentProps {
r#true: ::std::primitive::usize,
#[prop_or_default]
r#pointless_raw_name: ::std::primitive::usize,
}

fn compile_pass() {
::yew::props!(Props { a: 5 });
let (a, b) = (3, 5);
::yew::props!(Props { a, b });
::yew::props!(RawIdentProps { r#true: 5 });
let (r#true, r#pointless_raw_name) = (3, 5);
::yew::props!(RawIdentProps { r#true, r#pointless_raw_name });
}

fn main() {}