From 2da5ad19be114f5469be2799df27f334328d47c0 Mon Sep 17 00:00:00 2001 From: overlookmotel <557937+overlookmotel@users.noreply.github.com> Date: Sat, 7 Sep 2024 03:51:34 +0000 Subject: [PATCH] feat(ast): add `JSXElementName::get_identifier` method (#5556) Add `get_identifier` method for `JSXElementName`, `JSXMemberExpression` and `JSXMemberExpressionObject`, to get root object `IdentifierReference`. i.e. `Foo` in `` or ``. --- crates/oxc_ast/src/ast_impl/jsx.rs | 31 ++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/crates/oxc_ast/src/ast_impl/jsx.rs b/crates/oxc_ast/src/ast_impl/jsx.rs index d8b6503b1b814..832c66c19288e 100644 --- a/crates/oxc_ast/src/ast_impl/jsx.rs +++ b/crates/oxc_ast/src/ast_impl/jsx.rs @@ -28,6 +28,16 @@ impl<'a> fmt::Display for JSXNamespacedName<'a> { } impl<'a> JSXElementName<'a> { + pub fn get_identifier(&self) -> Option<&IdentifierReference<'a>> { + match self { + JSXElementName::Identifier(_) + | JSXElementName::NamespacedName(_) + | JSXElementName::ThisExpression(_) => None, + JSXElementName::IdentifierReference(ident) => Some(ident), + JSXElementName::MemberExpression(member_expr) => member_expr.get_identifier(), + } + } + pub fn get_identifier_name(&self) -> Option> { match self { Self::Identifier(id) => Some(id.as_ref().name.clone()), @@ -37,6 +47,27 @@ impl<'a> JSXElementName<'a> { } } +impl<'a> JSXMemberExpression<'a> { + pub fn get_identifier(&self) -> Option<&IdentifierReference<'a>> { + self.object.get_identifier() + } +} + +impl<'a> JSXMemberExpressionObject<'a> { + pub fn get_identifier(&self) -> Option<&IdentifierReference<'a>> { + let mut object = self; + loop { + match object { + JSXMemberExpressionObject::IdentifierReference(ident) => return Some(ident), + JSXMemberExpressionObject::MemberExpression(member_expr) => { + object = &member_expr.object; + } + JSXMemberExpressionObject::ThisExpression(_) => return None, + } + } + } +} + impl<'a> fmt::Display for JSXMemberExpression<'a> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}.{}", self.object, self.property)