Text dependencies
This commit is contained in:
+11
-1
@@ -8,7 +8,17 @@ pub fn main() {
|
|||||||
#[component]
|
#[component]
|
||||||
fn App(cx: &Arc<Context>) -> View {
|
fn App(cx: &Arc<Context>) -> View {
|
||||||
rsx! {
|
rsx! {
|
||||||
"Hello World"
|
Card { content: "Hello World".to_string() }
|
||||||
|
}
|
||||||
|
.view(&cx)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[component]
|
||||||
|
fn Card(cx: &Arc<Context>, content: String) -> View {
|
||||||
|
let content = content.clone();
|
||||||
|
|
||||||
|
rsx! {
|
||||||
|
%ref content "----\n{content}\n----"
|
||||||
}
|
}
|
||||||
.view(&cx)
|
.view(&cx)
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-7
@@ -38,7 +38,7 @@ fn emit_deps(deps: &[Dep]) -> TokenStream {
|
|||||||
|
|
||||||
/// Emits a Vec of dependencies as HookDependency trait objects
|
/// Emits a Vec of dependencies as HookDependency trait objects
|
||||||
fn emit_deps_vec(deps: &[Dep]) -> TokenStream {
|
fn emit_deps_vec(deps: &[Dep]) -> TokenStream {
|
||||||
let deps = deps.iter().map(|d| {
|
let deps = deps.iter().filter(|d| d.is_dep).map(|d| {
|
||||||
let ident = &d.ident;
|
let ident = &d.ident;
|
||||||
|
|
||||||
quote! {
|
quote! {
|
||||||
@@ -54,9 +54,12 @@ fn emit_deps_vec(deps: &[Dep]) -> TokenStream {
|
|||||||
/// Emits code for a single node within a scope
|
/// Emits code for a single node within a scope
|
||||||
fn emit_node_scope(node: &RsxNode) -> TokenStream {
|
fn emit_node_scope(node: &RsxNode) -> TokenStream {
|
||||||
match node {
|
match node {
|
||||||
RsxNode::Text(_) => {
|
RsxNode::Text { deps, .. } => {
|
||||||
let emit = emit_node(node);
|
let emit = emit_node(node);
|
||||||
|
let deps_emit = emit_deps(deps);
|
||||||
|
|
||||||
quote! {
|
quote! {
|
||||||
|
#deps_emit
|
||||||
r.static_scope(move |scope| {#emit});
|
r.static_scope(move |scope| {#emit});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -129,11 +132,16 @@ fn emit_node_scope(node: &RsxNode) -> TokenStream {
|
|||||||
|
|
||||||
fn emit_node(node: &RsxNode) -> TokenStream {
|
fn emit_node(node: &RsxNode) -> TokenStream {
|
||||||
match node {
|
match node {
|
||||||
RsxNode::Text(text) => quote! {
|
RsxNode::Text { text, deps } => {
|
||||||
scope.view(Arc::new(move |ctx| {
|
let deps_emit = emit_deps(deps);
|
||||||
ctx.draw_text(Point { x: 0, y: 0 }, &format!(#text))
|
|
||||||
}));
|
quote! {
|
||||||
},
|
scope.view(Arc::new({
|
||||||
|
#deps_emit
|
||||||
|
move |ctx| ctx.draw_text(Point { x: 0, y: 0 }, &format!(#text))
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
RsxNode::Component {
|
RsxNode::Component {
|
||||||
path,
|
path,
|
||||||
|
|||||||
+19
-3
@@ -37,7 +37,7 @@ pub struct RsxProp {
|
|||||||
/// AST node representing different RSX constructs
|
/// AST node representing different RSX constructs
|
||||||
pub enum RsxNode {
|
pub enum RsxNode {
|
||||||
/// String literal: `"text"`
|
/// String literal: `"text"`
|
||||||
Text(LitStr),
|
Text { text: LitStr, deps: Vec<Dep> },
|
||||||
/// Expression node: `{expr}`
|
/// Expression node: `{expr}`
|
||||||
Expr(Expr),
|
Expr(Expr),
|
||||||
/// Component instantiation: `Component { prop: value, ... }`
|
/// Component instantiation: `Component { prop: value, ... }`
|
||||||
@@ -76,6 +76,7 @@ pub enum RsxNode {
|
|||||||
pub struct Dep {
|
pub struct Dep {
|
||||||
pub ident: Ident,
|
pub ident: Ident,
|
||||||
pub pat: Option<Pat>,
|
pub pat: Option<Pat>,
|
||||||
|
pub is_dep: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_deps(input: ParseStream) -> Result<Vec<Dep>> {
|
fn parse_deps(input: ParseStream) -> Result<Vec<Dep>> {
|
||||||
@@ -84,7 +85,15 @@ fn parse_deps(input: ParseStream) -> Result<Vec<Dep>> {
|
|||||||
if input.peek(Token![%]) {
|
if input.peek(Token![%]) {
|
||||||
input.parse::<Token![%]>()?;
|
input.parse::<Token![%]>()?;
|
||||||
loop {
|
loop {
|
||||||
|
let is_ref = if input.peek(Token![ref]) {
|
||||||
|
input.parse::<Token![ref]>()?;
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
};
|
||||||
|
|
||||||
let ident: Ident = input.parse()?;
|
let ident: Ident = input.parse()?;
|
||||||
|
|
||||||
let pat = if input.peek(Token![as]) {
|
let pat = if input.peek(Token![as]) {
|
||||||
input.parse::<Token![as]>()?;
|
input.parse::<Token![as]>()?;
|
||||||
// Patterns in syn 2.0 are parsed via `Pat::parse_multi`
|
// Patterns in syn 2.0 are parsed via `Pat::parse_multi`
|
||||||
@@ -94,7 +103,11 @@ fn parse_deps(input: ParseStream) -> Result<Vec<Dep>> {
|
|||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
deps.push(Dep { ident, pat });
|
deps.push(Dep {
|
||||||
|
ident,
|
||||||
|
pat,
|
||||||
|
is_dep: !is_ref,
|
||||||
|
});
|
||||||
|
|
||||||
if !input.peek(Token![,]) {
|
if !input.peek(Token![,]) {
|
||||||
break;
|
break;
|
||||||
@@ -161,7 +174,10 @@ impl Parse for RsxNode {
|
|||||||
|
|
||||||
// "%$dep for $pat in $expr { $rsx }"
|
// "%$dep for $pat in $expr { $rsx }"
|
||||||
if input.peek(LitStr) {
|
if input.peek(LitStr) {
|
||||||
return Ok(RsxNode::Text(input.parse()?));
|
return Ok(RsxNode::Text {
|
||||||
|
text: input.parse()?,
|
||||||
|
deps,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
parse_component_invocation(input)
|
parse_component_invocation(input)
|
||||||
|
|||||||
Reference in New Issue
Block a user