Skip to content

Commit ac404c8

Browse files
committed
feat: 支持 React.Fragment 用法
1 parent c73bbe5 commit ac404c8

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

src/visitor.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
use ego_tree::{NodeId, Tree, NodeMut, NodeRef};
22
use html5ever::{Attribute, tendril::StrTendril};
3-
use swc_ecma_ast::{JSXElement, JSXElementName, JSXAttrOrSpread, JSXAttrName, JSXAttrValue, Lit, JSXExpr, Expr, JSXElementChild, Module, Function, Stmt, ExportDefaultExpr, ExportDefaultDecl, DefaultDecl, ClassDecl, ClassMember, PropName, FnDecl};
3+
use swc_ecma_ast::{JSXElement, JSXElementName, JSXAttrOrSpread, JSXAttrName, JSXAttrValue, Lit, JSXExpr, Expr, JSXElementChild, Module, Function, Stmt, ExportDefaultExpr, ExportDefaultDecl, DefaultDecl, ClassDecl, ClassMember, PropName, FnDecl, JSXFragment};
44
use swc_ecma_visit::{Visit, VisitWith};
55

66
use crate::{scraper::{Node, Element, Fragment}, utils::{recursion_jsx_member, create_qualname, is_starts_with_uppercase}};
77

8-
fn recursion_sub_tree<'a>(node: &NodeRef<Node>, current: &mut NodeMut<'a, Node>, nodes: &mut Vec<NodeId>) {
8+
fn recursion_sub_tree<'a>(node: &NodeRef<Node>, current: &mut NodeMut<'a, Node>) {
99
for child in node.children() {
1010
let mut tree_node = current.append(child.value().clone());
11-
nodes.push(tree_node.id());
12-
recursion_sub_tree(&child, &mut tree_node, nodes);
11+
recursion_sub_tree(&child, &mut tree_node);
1312
}
1413
}
1514

@@ -97,6 +96,10 @@ impl<'a> JSXVisitor<'a> {
9796
}
9897
Node::Element(Element::new(qual_name, attributes))
9998
}
99+
100+
fn create_fragment(&mut self) -> Node {
101+
Node::Fragment(Fragment::new(Some(create_qualname("__Fragment__"))))
102+
}
100103
}
101104

102105
impl<'a> Visit for JSXVisitor<'a> {
@@ -116,7 +119,7 @@ impl<'a> Visit for JSXVisitor<'a> {
116119

117120
fn visit_jsx_element_children(&mut self, n: &[JSXElementChild]) {
118121
let mut nodes = vec![];
119-
let mut elements = vec![];
122+
let mut elements: Vec<JSXElementChild> = vec![];
120123
for child in n.iter() {
121124
match child {
122125
JSXElementChild::JSXElement(element) => {
@@ -127,23 +130,29 @@ impl<'a> Visit for JSXVisitor<'a> {
127130
self.module.visit_with(&mut visitor);
128131
let mut current = self.tree.get_mut(self.current_node.unwrap()).unwrap();
129132
// 将 Fragment 的子节点添加到当前节点
130-
recursion_sub_tree(&visitor.tree.root(), &mut current, &mut nodes);
131-
elements.push(element);
133+
recursion_sub_tree(&visitor.tree.root(), &mut current);
132134
} else {
133135
let node = self.create_element(element);
134136
let mut current = self.tree.get_mut(self.current_node.unwrap()).unwrap();
135137
let tree_node = current.append(node);
136138
nodes.push(tree_node.id());
137-
elements.push(element);
139+
elements.push(JSXElementChild::JSXElement(element.clone()));
138140
}
139141
} else {
140142
let node = self.create_element(element);
141143
let mut current = self.tree.get_mut(self.current_node.unwrap()).unwrap();
142144
let tree_node = current.append(node);
143145
nodes.push(tree_node.id());
144-
elements.push(element);
146+
elements.push(JSXElementChild::JSXElement(element.clone()));
145147
}
146148
},
149+
JSXElementChild::JSXFragment(fragment) => {
150+
let node = self.create_fragment();
151+
let mut current = self.tree.get_mut(self.current_node.unwrap()).unwrap();
152+
let tree_node = current.append(node);
153+
nodes.push(tree_node.id());
154+
elements.push(JSXElementChild::JSXFragment(fragment.clone()));
155+
},
147156
_ => {}
148157
}
149158
}

0 commit comments

Comments
 (0)