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 `<Foo>` or `<Foo.bar>`.
This commit is contained in:
overlookmotel 2024-09-07 03:51:34 +00:00
parent cdd1a91754
commit 2da5ad19be

View file

@ -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()),
@ -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)