Explorar o código

Change missing trailing comma span to point to span where comma is missing from

Signed-off-by: Torstein Grindvik <torstein.grindvik@nordicsemi.no>
Torstein Grindvik %!s(int64=2) %!d(string=hai) anos
pai
achega
a3169ac17b

+ 1 - 0
packages/core-macro/Cargo.toml

@@ -22,6 +22,7 @@ dioxus-rsx = { workspace = true }
 
 # testing
 [dev-dependencies]
+dioxus = { workspace = true }
 rustversion = "1.0"
 trybuild = "1.0"
 

+ 5 - 0
packages/core-macro/tests/rsx.rs

@@ -0,0 +1,5 @@
+#[test]
+fn rsx() {
+    let t = trybuild::TestCases::new();
+    t.compile_fail("tests/rsx/trailing-comma-0.rs");
+}

+ 13 - 0
packages/core-macro/tests/rsx/trailing-comma-0.rs

@@ -0,0 +1,13 @@
+// Given an `rsx!` invocation with a missing trailing comma,
+// ensure the stderr output has an informative span.
+
+use dioxus::prelude::*;
+
+fn main() {
+    rsx! {
+        p {
+            class: "foo bar"
+            "Hello world"
+        }
+    };
+}

+ 5 - 0
packages/core-macro/tests/rsx/trailing-comma-0.stderr

@@ -0,0 +1,5 @@
+error: missing trailing comma
+ --> tests/rsx/trailing-comma-0.rs:9:20
+  |
+9 |             class: "foo bar"
+  |                    ^^^^^^^^^

+ 5 - 2
packages/rsx/src/element.rs

@@ -76,11 +76,14 @@ impl Parse for Element {
 
             if content.peek(Ident) && content.peek2(Token![:]) && !content.peek3(Token![:]) {
                 let name = content.parse::<Ident>()?;
-                let ident = name.clone();
 
                 let name_str = name.to_string();
                 content.parse::<Token![:]>()?;
 
+                // The span of the content to be parsed,
+                // for example the `hi` part of `class: "hi"`.
+                let span = content.span();
+
                 if name_str.starts_with("on") {
                     attributes.push(ElementAttrNamed {
                         el_name: el_name.clone(),
@@ -127,7 +130,7 @@ impl Parse for Element {
 
                 // todo: add a message saying you need to include commas between fields
                 if content.parse::<Token![,]>().is_err() {
-                    missing_trailing_comma!(ident.span());
+                    missing_trailing_comma!(span);
                 }
                 continue;
             }