From 507c2ee425d293120ce7cc03ae6636570e681b3c Mon Sep 17 00:00:00 2001 From: Muhammad Hamza Date: Sun, 23 Jan 2022 20:09:19 +0500 Subject: [PATCH] it works --- examples/counter/src/main.rs | 1 + packages/yew-macro/src/html_tree/mod.rs | 6 +--- .../src/typed_vdom/generate_element.rs | 10 +++---- packages/yew-macro/src/typed_vdom/mod.rs | 28 +++++++++---------- packages/yew/src/lib.rs | 1 + packages/yew/src/virtual_dom/mod.rs | 2 +- packages/yew/src/virtual_dom/typings.rs | 3 +- 7 files changed, 24 insertions(+), 27 deletions(-) diff --git a/examples/counter/src/main.rs b/examples/counter/src/main.rs index d863bd894ac..44fef2a3bfc 100644 --- a/examples/counter/src/main.rs +++ b/examples/counter/src/main.rs @@ -1,6 +1,7 @@ use gloo_console as console; use js_sys::Date; use yew::{html, Component, Context, Html}; +use yew::virtual_dom::typings::*; // Define the possible messages which can be sent to the component pub enum Msg { diff --git a/packages/yew-macro/src/html_tree/mod.rs b/packages/yew-macro/src/html_tree/mod.rs index ad18325da78..b0cc9d1293f 100644 --- a/packages/yew-macro/src/html_tree/mod.rs +++ b/packages/yew-macro/src/html_tree/mod.rs @@ -99,12 +99,8 @@ impl HtmlTree { if input.peek(Token![=]) || (input.peek(Token![?]) && input.peek2(Token![=])) { Some(HtmlType::List) - } else if ident_str.chars().next().unwrap().is_ascii_uppercase() - || input.peek(Token![::]) - { - Some(HtmlType::Component) } else { - Some(HtmlType::Element) + Some(HtmlType::Component) } } else { None diff --git a/packages/yew-macro/src/typed_vdom/generate_element.rs b/packages/yew-macro/src/typed_vdom/generate_element.rs index 37d0c30d84c..15a9388dfd3 100644 --- a/packages/yew-macro/src/typed_vdom/generate_element.rs +++ b/packages/yew-macro/src/typed_vdom/generate_element.rs @@ -55,13 +55,13 @@ impl ToTokens for GenerateElement { let out = quote! { #[allow(non_camel_case_types)] - struct #element_name; + pub struct #element_name; #[derive(::std::default::Default, ::std::clone::Clone, ::std::fmt::Debug, ::yew::html::Properties, ::std::cmp::PartialEq)] - struct #props_ident { - node_ref: ::std::option::Option::<::yew::NodeRef>, - key: ::std::option::Option::<::yew::virtual_dom::Key>, - children: ::yew::Children, + pub struct #props_ident { + pub node_ref: ::std::option::Option::<::yew::NodeRef>, + pub key: ::std::option::Option::<::yew::virtual_dom::Key>, + pub children: ::yew::Children, #(#props)* #(#listeners)* } diff --git a/packages/yew-macro/src/typed_vdom/mod.rs b/packages/yew-macro/src/typed_vdom/mod.rs index 535cb1a0042..32f9bcf3595 100644 --- a/packages/yew-macro/src/typed_vdom/mod.rs +++ b/packages/yew-macro/src/typed_vdom/mod.rs @@ -1,16 +1,18 @@ use proc_macro2::{Ident, Span, TokenStream}; use quote::{format_ident, quote}; -use syn::parse::{Parse, ParseStream}; -use syn::{parse_quote, Token, Type}; +use syn::{LitStr, parse_quote, Token, Type}; use syn::ext::IdentExt; +use syn::parse::{Parse, ParseStream}; pub mod generate_element; mod globals; + #[derive(Clone)] pub struct AttributePropDefinition { name: Ident, ty: Type, } + impl Parse for AttributePropDefinition { fn parse(input: ParseStream) -> syn::Result { let name = Ident::parse_any(input)?; @@ -19,6 +21,7 @@ impl Parse for AttributePropDefinition { Ok(Self { name, ty }) } } + impl AttributePropDefinition { pub fn new(name: Ident, ty: Type) -> Self { Self { name, ty } @@ -30,24 +33,18 @@ impl AttributePropDefinition { pub #name: ::std::option::Option::<#ty>, } } - fn _build_setter(&self) -> TokenStream { - let AttributePropDefinition { ty, .. } = self; - let name = self.name(); - quote! { - pub fn #name(&mut self, val: #ty) { - self.#name = ::std::option::Option::Some(val); - } - } - } + fn name(&self) -> Ident { format_ident!("r#{}", self.name) } + fn build_if_lets(&self) -> TokenStream { let ident = self.name(); let name = self.name.to_string().replace('_', "-"); + let name = LitStr::new(&name, self.name.span()); quote! { if let Some(val) = self.#ident { - attrs.insert(::std::stringify!(#name), val); + attrs.insert(#name, val); } } } @@ -58,6 +55,7 @@ pub struct ListenerPropDefinition { event: Ident, ty: Type, } + impl ListenerPropDefinition { fn new(event: Ident) -> Self { Self { @@ -69,7 +67,7 @@ impl ListenerPropDefinition { Self { event, ty } } fn ident(&self) -> Ident { - format_ident!("on_{}", self.event, span = self.event.span()) + format_ident!("on{}", self.event, span = self.event.span()) } fn build_fields(&self) -> TokenStream { let ident = self.ident(); @@ -80,14 +78,14 @@ impl ListenerPropDefinition { } fn build_if_lets(&self) -> TokenStream { let ident = self.ident(); - let on_event = Ident::new(&format!("on{}", self.event), Span::mixed_site()); quote! { if let Some(value) = self.#ident { - listeners.push(::yew::html::#on_event::Wrapper::__macro_new(value)); + listeners.push(::yew::html::#ident::Wrapper::__macro_new(value)); } } } } + pub(crate) mod kw { syn::custom_keyword!(props); } diff --git a/packages/yew/src/lib.rs b/packages/yew/src/lib.rs index 6f664495090..cab3b7f0380 100644 --- a/packages/yew/src/lib.rs +++ b/packages/yew/src/lib.rs @@ -261,6 +261,7 @@ pub mod macros { pub use crate::html; pub use crate::html_nested; pub use crate::props; + pub use yew_macro::generate_element; } mod app_handle; diff --git a/packages/yew/src/virtual_dom/mod.rs b/packages/yew/src/virtual_dom/mod.rs index 0bae4424c33..b4cca3b76e3 100644 --- a/packages/yew/src/virtual_dom/mod.rs +++ b/packages/yew/src/virtual_dom/mod.rs @@ -4,7 +4,7 @@ pub mod key; #[doc(hidden)] pub mod listeners; -mod typings; +pub mod typings; #[doc(hidden)] pub mod vcomp; #[doc(hidden)] diff --git a/packages/yew/src/virtual_dom/typings.rs b/packages/yew/src/virtual_dom/typings.rs index 0a50d4f217f..0431539c5ee 100644 --- a/packages/yew/src/virtual_dom/typings.rs +++ b/packages/yew/src/virtual_dom/typings.rs @@ -1,9 +1,10 @@ +#![allow(missing_docs)] //! This module contains the items required for a statically typed VDOM use std::collections::HashMap; use std::rc::Rc; -use yew_macro::generate_element; +use crate::macros::generate_element; use crate::virtual_dom::{AttrValue, Key, Listener, VNode}; use crate::{NodeRef};