Skip to content

Commit

Permalink
feat(ast): add JSXElementName::get_identifier method (#5556)
Browse files Browse the repository at this point in the history
Add `get_identifier` method for `JSXElementName`, `JSXMemberExpression` and `JSXMemberExpressionObject`, to get root object `IdentifierReference`. i.e. `Foo` in `<Foo>` or `<Foo.bar>`.
  • Loading branch information
overlookmotel committed Sep 7, 2024
1 parent cdd1a91 commit 2da5ad1
Showing 1 changed file with 31 additions and 0 deletions.
31 changes: 31 additions & 0 deletions crates/oxc_ast/src/ast_impl/jsx.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Atom<'a>> {
match self {
Self::Identifier(id) => Some(id.as_ref().name.clone()),
Expand All @@ -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)
Expand Down

0 comments on commit 2da5ad1

Please sign in to comment.