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)