瀏覽代碼

refactor: simplify and organize the errors

Ilya Maximov 3 年之前
父節點
當前提交
1f065acb4c

+ 1 - 2
packages/core-macro/src/rsx/component.rs

@@ -199,8 +199,7 @@ impl Parse for ComponentField {
         }
 
         if input.peek(LitStr) && input.peek2(LitStr) {
-            let item = input.parse::<LitStr>().unwrap();
-            proc_macro_error::emit_error!(item, "this attribute is missing a trailing comma")
+            attr_after_element!(input.span());
         }
 
         let content = ContentField::ManExpr(input.parse()?);

+ 4 - 33
packages/core-macro/src/rsx/element.rs

@@ -63,12 +63,8 @@ impl Parse for Element {
                     break;
                 }
 
-                // todo: add a message saying you need to include commas between fields
                 if content.parse::<Token![,]>().is_err() {
-                    proc_macro_error::emit_error!(
-                        ident,
-                        "this attribute is missing a trailing comma"
-                    )
+                    missing_trailing_comma!(ident);
                 }
                 continue;
             }
@@ -126,10 +122,7 @@ impl Parse for Element {
 
                 // todo: add a message saying you need to include commas between fields
                 if content.parse::<Token![,]>().is_err() {
-                    proc_macro_error::emit_error!(
-                        ident,
-                        "this attribute is missing a trailing comma"
-                    )
+                    missing_trailing_comma!(ident);
                 }
                 continue;
             }
@@ -139,33 +132,11 @@ impl Parse for Element {
 
         while !content.is_empty() {
             if (content.peek(LitStr) && content.peek2(Token![:])) && !content.peek3(Token![:]) {
-                let ident = content.parse::<LitStr>().unwrap();
-                let name = ident.value();
-                proc_macro_error::emit_error!(
-                    ident, "this attribute `{}` is in the wrong place", name;
-                    help =
-"all attribute fields must be placed above children elements
-
-                div {
-                   attr: \"...\",  <---- attribute is above children
-                   div { }       <---- children are below attributes
-                }";
-                )
+                attr_after_element!(content.span());
             }
 
             if (content.peek(Ident) && content.peek2(Token![:])) && !content.peek3(Token![:]) {
-                let ident = content.parse::<Ident>().unwrap();
-                let name = ident.to_string();
-                proc_macro_error::emit_error!(
-                    ident, "this attribute `{}` is in the wrong place", name;
-                    help =
-"all attribute fields must be placed above children elements
-
-                div {
-                   attr: \"...\",  <---- attribute is above children
-                   div { }       <---- children are below attributes
-                }";
-                )
+                attr_after_element!(content.span());
             }
 
             children.push(content.parse::<BodyNode>()?);

+ 15 - 0
packages/core-macro/src/rsx/errors.rs

@@ -0,0 +1,15 @@
+macro_rules! missing_trailing_comma {
+    ($span:expr) => {
+        proc_macro_error::emit_error!($span, "missing trailing comma")
+    };
+}
+
+macro_rules! attr_after_element {
+    ($span:expr) => {
+        proc_macro_error::emit_error!(
+            $span,
+            "expected element";
+            help = "move the attribute above all the children and text elements"
+        )
+    };
+}

+ 3 - 0
packages/core-macro/src/rsx/mod.rs

@@ -11,6 +11,9 @@
 //!
 //! Any errors in using rsx! will likely occur when people start using it, so the first errors must be really helpful.
 
+#[macro_use]
+mod errors;
+
 mod component;
 mod element;
 mod node;