Skip to content

Commit f61667b

Browse files
authored
Remove generics from virtual dom (yewstack#783)
* Fix tests * Remove generics from virtual dom * Prep for degenerify * Fix examples * Remove props cloning * Fix tests
1 parent def59a0 commit f61667b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+459
-688
lines changed

README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ impl Component for Model {
8989
}
9090
}
9191

92-
fn view(&self) -> Html<Self> {
92+
fn view(&self) -> Html {
9393
let onclick = self.link.callback(|_| Msg::DoIt);
9494
html! {
9595
// Render your model here
@@ -323,8 +323,8 @@ Use external crates and put values from them into the template:
323323
extern crate chrono;
324324
use chrono::prelude::*;
325325

326-
impl Renderable<Model> for Model {
327-
fn render(&self) -> Html<Self> {
326+
impl Renderable for Model {
327+
fn render(&self) -> Html {
328328
html! {
329329
<p>{ Local::now() }</p>
330330
}

crates/macro/src/html_tree/html_component.rs

+6-7
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ impl ToTokens for HtmlComponent {
8383
props,
8484
children,
8585
} = self;
86-
let vcomp_scope = Ident::new("__yew_vcomp_scope", Span::call_site());
8786

8887
let validate_props = if let Props::List(ListProps { props, .. }) = props {
8988
let prop_ref = Ident::new("__yew_prop_ref", Span::call_site());
@@ -139,9 +138,11 @@ impl ToTokens for HtmlComponent {
139138
let init_props = match props {
140139
Props::List(ListProps { props, .. }) => {
141140
let set_props = props.iter().map(|HtmlProp { label, value }| {
142-
quote_spanned! { value.span()=>
143-
.#label(<::yew::virtual_dom::vcomp::VComp<_> as ::yew::virtual_dom::Transformer<_, _, _>>::transform(#vcomp_scope.clone(), #value))
144-
}
141+
quote_spanned! { value.span()=> .#label(
142+
<::yew::virtual_dom::vcomp::VComp as ::yew::virtual_dom::Transformer<_, _>>::transform(
143+
#value
144+
)
145+
)}
145146
});
146147

147148
quote! {
@@ -181,9 +182,7 @@ impl ToTokens for HtmlComponent {
181182
#validate_props
182183
}
183184

184-
let #vcomp_scope: ::yew::html::ScopeHolder<_> = ::std::default::Default::default();
185-
let __yew_node_ref: ::yew::html::NodeRef = #node_ref;
186-
::yew::virtual_dom::VChild::<#ty, _>::new(#init_props, #vcomp_scope, __yew_node_ref)
185+
::yew::virtual_dom::VChild::<#ty>::new(#init_props, #node_ref)
187186
}});
188187
}
189188
}

crates/macro/src/html_tree/html_prop.rs

+6-20
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,12 @@ impl Parse for HtmlPropSuffix {
4949
if let TokenTree::Punct(punct) = &next {
5050
match punct.as_char() {
5151
'>' => {
52-
let possible_tag_end = input.peek(Token![<])
53-
|| input.peek(syn::token::Brace)
54-
|| input.is_empty();
55-
56-
if angle_count > 1 || possible_tag_end {
57-
angle_count -= 1;
58-
if angle_count == 0 {
59-
gt = Some(syn::token::Gt {
60-
spans: [punct.span()],
61-
});
62-
break;
63-
}
52+
angle_count -= 1;
53+
if angle_count == 0 {
54+
gt = Some(syn::token::Gt {
55+
spans: [punct.span()],
56+
});
57+
break;
6458
}
6559
}
6660
'<' => angle_count += 1,
@@ -73,14 +67,6 @@ impl Parse for HtmlPropSuffix {
7367
break;
7468
}
7569
}
76-
'-' => {
77-
if input.peek(Token![>]) {
78-
// Handle explicit return types in callbacks (#560)
79-
// We increase angle_count here in order to ignore
80-
// the following >.
81-
angle_count += 1;
82-
}
83-
}
8470
_ => {}
8571
};
8672
}

crates/macro/src/html_tree/html_tag/mod.rs

+3-5
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ impl ToTokens for HtmlTag {
102102
} = &attributes;
103103

104104
let vtag = Ident::new("__yew_vtag", tag_name.span());
105-
let vtag_scope = Ident::new("__yew_vtag_scope", Span::call_site());
106105
let attr_pairs = attributes.iter().map(|TagAttribute { label, value }| {
107106
let label_str = label.to_string();
108107
quote_spanned! {value.span() => (#label_str.to_owned(), (#value).to_string()) }
@@ -155,16 +154,15 @@ impl ToTokens for HtmlTag {
155154

156155
quote_spanned! {name.span()=> {
157156
::yew::html::#name::Wrapper::new(
158-
<::yew::virtual_dom::vtag::VTag<_> as ::yew::virtual_dom::Transformer<_, _, _>>::transform(
159-
#vtag_scope.clone(), #callback
157+
<::yew::virtual_dom::vtag::VTag as ::yew::virtual_dom::Transformer<_, _>>::transform(
158+
#callback
160159
)
161160
)
162161
}}
163162
});
164163

165164
tokens.extend(quote! {{
166-
let #vtag_scope: ::yew::html::ScopeHolder<_> = ::std::default::Default::default();
167-
let mut #vtag = ::yew::virtual_dom::vtag::VTag::new_with_scope(#name, #vtag_scope.clone());
165+
let mut #vtag = ::yew::virtual_dom::vtag::VTag::new(#name);
168166
#(#set_kind)*
169167
#(#set_value)*
170168
#(#add_href)*

crates/macro/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
//! # unimplemented!()
3333
//! # }
3434
//! #
35-
//! # fn view(&self) -> Html<Self> {
35+
//! # fn view(&self) -> Html {
3636
//! #
3737
//! // ...
3838
//!

examples/counter/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ impl Component for Model {
4848
true
4949
}
5050

51-
fn view(&self) -> Html<Self> {
51+
fn view(&self) -> Html {
5252
html! {
5353
<div>
5454
<nav class="menu">

examples/crm/src/lib.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ impl Component for Model {
146146
true
147147
}
148148

149-
fn view(&self) -> Html<Self> {
149+
fn view(&self) -> Html {
150150
match self.scene {
151151
Scene::ClientsList => html! {
152152
<div class="crm">
@@ -179,8 +179,8 @@ impl Component for Model {
179179
}
180180
}
181181

182-
impl Renderable<Model> for Client {
183-
fn render(&self) -> Html<Model> {
182+
impl Renderable for Client {
183+
fn render(&self) -> Html {
184184
html! {
185185
<div class="client">
186186
<p>{ format!("First Name: {}", self.first_name) }</p>
@@ -193,7 +193,7 @@ impl Renderable<Model> for Client {
193193
}
194194

195195
impl Client {
196-
fn view_first_name_input(&self, link: &ComponentLink<Model>) -> Html<Model> {
196+
fn view_first_name_input(&self, link: &ComponentLink<Model>) -> Html {
197197
html! {
198198
<input class="new-client firstname"
199199
placeholder="First name"
@@ -202,15 +202,15 @@ impl Client {
202202
}
203203
}
204204

205-
fn view_last_name_input(&self, link: &ComponentLink<Model>) -> Html<Model> {
205+
fn view_last_name_input(&self, link: &ComponentLink<Model>) -> Html {
206206
html! {
207207
<input class="new-client lastname"
208208
placeholder="Last name"
209209
value=&self.last_name
210210
oninput=link.callback(|e: InputData| Msg::UpdateLastName(e.value)) />
211211
}
212212
}
213-
fn view_description_textarea(&self, link: &ComponentLink<Model>) -> Html<Model> {
213+
fn view_description_textarea(&self, link: &ComponentLink<Model>) -> Html {
214214
html! {
215215
<textarea class=("new-client", "description")
216216
placeholder="Description"

examples/crm/src/markdown.rs

+3-9
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,11 @@
22
/// Source: https://github.com/acmumn/mentoring/blob/master/web-client/src/view/markdown.rs
33
use pulldown_cmark::{Alignment, Event, Parser, Tag, OPTION_ENABLE_TABLES};
44
use yew::virtual_dom::{VNode, VTag, VText};
5-
use yew::{html, Component, Html};
5+
use yew::{html, Html};
66

77
/// Renders a string of Markdown to HTML with the default options (footnotes
88
/// disabled, tables enabled).
9-
pub fn render_markdown<COMP>(src: &str) -> Html<COMP>
10-
where
11-
COMP: Component,
12-
{
9+
pub fn render_markdown(src: &str) -> Html {
1310
let mut elems = vec![];
1411
let mut spine = vec![];
1512

@@ -81,10 +78,7 @@ where
8178
}
8279
}
8380

84-
fn make_tag<COMP>(t: Tag) -> VTag<COMP>
85-
where
86-
COMP: Component,
87-
{
81+
fn make_tag(t: Tag) -> VTag {
8882
match t {
8983
Tag::Paragraph => VTag::new("p"),
9084
Tag::Rule => VTag::new("hr"),

examples/custom_components/src/barrier.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ impl Component for Barrier {
5151
true
5252
}
5353

54-
fn view(&self) -> Html<Self> {
54+
fn view(&self) -> Html {
5555
let onsignal = &self.link.callback(|_| Msg::ChildClicked);
5656
html! {
5757
<div class="barrier">

examples/custom_components/src/button.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ impl Component for Button {
4444
true
4545
}
4646

47-
fn view(&self) -> Html<Self> {
47+
fn view(&self) -> Html {
4848
html! {
4949
<button onclick=self.link.callback(|_| Msg::Clicked)>
5050
{ &self.title }

examples/custom_components/src/counter.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ impl Component for Counter {
6161
true
6262
}
6363

64-
fn view(&self) -> Html<Self> {
64+
fn view(&self) -> Html {
6565
let colorize = {
6666
match self.color {
6767
Color::Red => "background: red;",

examples/custom_components/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ impl Component for Model {
4646
}
4747
}
4848

49-
fn view(&self) -> Html<Self> {
49+
fn view(&self) -> Html {
5050
let counter = |x| {
5151
html! {
5252
<Counter initial=x color=&self.color
@@ -64,7 +64,7 @@ impl Component for Model {
6464
}
6565

6666
impl Model {
67-
fn view_barrier(&self) -> Html<Self> {
67+
fn view_barrier(&self) -> Html {
6868
if self.with_barrier {
6969
html! {
7070
<Barrier limit=10 onsignal=self.link.callback(|_| Msg::Repaint) />

examples/dashboard/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ impl Component for Model {
169169
true
170170
}
171171

172-
fn view(&self) -> Html<Self> {
172+
fn view(&self) -> Html {
173173
html! {
174174
<div>
175175
<nav class="menu">
@@ -206,7 +206,7 @@ impl Component for Model {
206206
}
207207

208208
impl Model {
209-
fn view_data(&self) -> Html<Self> {
209+
fn view_data(&self) -> Html {
210210
if let Some(value) = self.data {
211211
html! {
212212
<p>{ value }</p>

examples/file_upload/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ impl Component for Model {
6565
true
6666
}
6767

68-
fn view(&self) -> Html<Self> {
68+
fn view(&self) -> Html {
6969
let flag = self.by_chunks;
7070
html! {
7171
<div>
@@ -91,7 +91,7 @@ impl Component for Model {
9191
}
9292

9393
impl Model {
94-
fn view_file(&self, data: &str) -> Html<Self> {
94+
fn view_file(&self, data: &str) -> Html {
9595
html! {
9696
<li>{ data }</li>
9797
}

examples/fragments/src/lib.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ impl Component for Model {
3434
true
3535
}
3636

37-
fn view(&self) -> Html<Self> {
37+
fn view(&self) -> Html {
3838
html! {
3939
<>
4040
<nav class="menu">{ self.view_menu() }</nav>
@@ -54,7 +54,7 @@ impl Component for Model {
5454
}
5555

5656
impl Model {
57-
fn view_cols(&self) -> Html<Self> {
57+
fn view_cols(&self) -> Html {
5858
let render = |idx| {
5959
html! {
6060
<td>{ idx }</td>
@@ -65,7 +65,7 @@ impl Model {
6565
}
6666
}
6767

68-
fn view_menu(&self) -> Html<Self> {
68+
fn view_menu(&self) -> Html {
6969
html! {
7070
<>
7171
<button onclick=self.link.callback(|_| Msg::More)>{ "More" }</button>

examples/futures/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ impl Component for Model {
100100
}
101101
}
102102

103-
fn view(&self) -> Html<Self> {
103+
fn view(&self) -> Html {
104104
match &self.markdown {
105105
FetchState::NotFetching => html! {
106106
<button onclick=self.link.callback(|_| Msg::GetMarkdown)>

examples/game_of_life/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ impl Component for Model {
208208
true
209209
}
210210

211-
fn view(&self) -> Html<Self> {
211+
fn view(&self) -> Html {
212212
html! {
213213
<div>
214214
<section class="game-container">
@@ -241,7 +241,7 @@ impl Component for Model {
241241
}
242242

243243
impl Model {
244-
fn view_cellule(&self, (idx, cellule): (usize, &Cellule)) -> Html<Self> {
244+
fn view_cellule(&self, (idx, cellule): (usize, &Cellule)) -> Html {
245245
let cellule_status = {
246246
if cellule.life_state == LifeState::Alive {
247247
"cellule-live"

examples/inner_html/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ impl Component for Model {
3333
true
3434
}
3535

36-
fn view(&self) -> Html<Self> {
36+
fn view(&self) -> Html {
3737
let js_svg = js! {
3838
var div = document.createElement("div");
3939
div.innerHTML = @{SVG.to_string()};

examples/js_callback/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ impl Component for Model {
5353
false
5454
}
5555

56-
fn view(&self) -> Html<Self> {
56+
fn view(&self) -> Html {
5757
html! {
5858
<div>
5959
<textarea oninput=|input| Msg::Payload(input.value)

examples/large_table/src/lib.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -33,25 +33,25 @@ impl Component for Model {
3333
true
3434
}
3535

36-
fn view(&self) -> Html<Self> {
36+
fn view(&self) -> Html {
3737
html! {
3838
<table>
39-
{ (0..99).map(|row| self.view_row(row)).collect::<Html<Self>>() }
39+
{ (0..99).map(|row| self.view_row(row)).collect::<Html>() }
4040
</table>
4141
}
4242
}
4343
}
4444

4545
impl Model {
46-
fn view_square(&self, row: u32, column: u32) -> Html<Self> {
46+
fn view_square(&self, row: u32, column: u32) -> Html {
4747
html! {
4848
<td class=square_class((column, row), self.selected)
4949
onclick=self.link.callback(move |_| Msg::Select(column, row))>
5050
</td>
5151
}
5252
}
5353

54-
fn view_row(&self, row: u32) -> Html<Self> {
54+
fn view_row(&self, row: u32) -> Html {
5555
html! {
5656
<tr>
5757
{for (0..99).map(|column| {

0 commit comments

Comments
 (0)