浏览代码

check for duplicate event listeners in the rsx macro

Evan Almloff 1 年之前
父节点
当前提交
9b5a797008
共有 2 个文件被更改,包括 21 次插入7 次删除
  1. 0 7
      packages/core/src/virtual_dom.rs
  2. 21 0
      packages/rsx/src/element.rs

+ 0 - 7
packages/core/src/virtual_dom.rs

@@ -401,13 +401,6 @@ impl VirtualDom {
                                 }
                             }
                         });
-
-                        // Break if this is the exact target element.
-                        // This means we won't call two listeners with the same name on the same element. This should be
-                        // documented, or be rejected from the rsx! macro outright
-                        if target_path == this_path {
-                            break;
-                        }
                     }
                 }
 

+ 21 - 0
packages/rsx/src/element.rs

@@ -95,6 +95,27 @@ impl Parse for Element {
                 let span = content.span();
 
                 if name_str.starts_with("on") {
+                    // check for any duplicate event listeners
+                    if attributes.iter().any(|f| {
+                        if let AttributeType::Named(ElementAttrNamed {
+                            attr:
+                                ElementAttr {
+                                    name: ElementAttrName::BuiltIn(n),
+                                    value: ElementAttrValue::EventTokens(_),
+                                },
+                            ..
+                        }) = f
+                        {
+                            n == &name_str
+                        } else {
+                            false
+                        }
+                    }) {
+                        return Err(syn::Error::new(
+                            name.span(),
+                            format!("Duplicate event listener `{}`", name),
+                        ));
+                    }
                     attributes.push(attribute::AttributeType::Named(ElementAttrNamed {
                         el_name: el_name.clone(),
                         attr: ElementAttr {