refactor(ast): simplify get_identifier_reference of TSType and TSTypeName (#8273)

This commit is contained in:
Dunqing 2025-01-06 08:23:53 +00:00
parent c9cf593cd7
commit aea95519db
3 changed files with 10 additions and 15 deletions

View file

@ -25,19 +25,14 @@ impl<'a> TSType<'a> {
/// ///
/// For qualified (i.e. namespaced) types, the left-most identifier is /// For qualified (i.e. namespaced) types, the left-most identifier is
/// returned. /// returned.
/// pub fn get_identifier_reference(&self) -> Option<&IdentifierReference<'a>> {
/// ```
/// let ty = get_type_for("foo.bar.Baz"); // TSType::TSQualifiedName
/// get_identifier_reference(&ty); // Some(IdentifierReference { name: "foo", .. })
/// ```
pub fn get_identifier_reference(&self) -> Option<IdentifierReference<'a>> {
match self { match self {
TSType::TSTypeReference(reference) => { TSType::TSTypeReference(reference) => {
Some(TSTypeName::get_first_name(&reference.type_name)) Some(reference.type_name.get_identifier_reference())
} }
TSType::TSQualifiedName(qualified) => Some(TSTypeName::get_first_name(&qualified.left)), TSType::TSQualifiedName(name) => Some(name.left.get_identifier_reference()),
TSType::TSTypeQuery(query) => match &query.expr_name { TSType::TSTypeQuery(query) => match &query.expr_name {
TSTypeQueryExprName::IdentifierReference(ident) => Some((*ident).clone()), TSTypeQueryExprName::IdentifierReference(ident) => Some(ident),
_ => None, _ => None,
}, },
_ => None, _ => None,
@ -87,10 +82,10 @@ impl<'a> TSTypeName<'a> {
/// type Foo = Bar; // -> Bar /// type Foo = Bar; // -> Bar
/// type Foo = Bar.Baz; // -> Bar /// type Foo = Bar.Baz; // -> Bar
/// ``` /// ```
pub fn get_first_name(name: &TSTypeName<'a>) -> IdentifierReference<'a> { pub fn get_identifier_reference(&self) -> &IdentifierReference<'a> {
match name { match self {
TSTypeName::IdentifierReference(name) => (*name).clone(), TSTypeName::IdentifierReference(ident) => ident,
TSTypeName::QualifiedName(name) => TSTypeName::get_first_name(&name.left), TSTypeName::QualifiedName(name) => name.left.get_identifier_reference(),
} }
} }

View file

@ -112,7 +112,7 @@ impl<'a> Visit<'a> for ScopeTree<'a> {
fn visit_ts_type_query(&mut self, ty: &TSTypeQuery<'a>) { fn visit_ts_type_query(&mut self, ty: &TSTypeQuery<'a>) {
if let Some(type_name) = ty.expr_name.as_ts_type_name() { if let Some(type_name) = ty.expr_name.as_ts_type_name() {
let ident = TSTypeName::get_first_name(type_name); let ident = TSTypeName::get_identifier_reference(type_name);
self.add_reference(ident.name.clone(), KindFlags::Value); self.add_reference(ident.name.clone(), KindFlags::Value);
} else { } else {
walk_ts_type_query(self, ty); walk_ts_type_query(self, ty);

View file

@ -344,7 +344,7 @@ fn is_simple_type(ts_type: &TSType) -> bool {
| TSType::TSQualifiedName(_) | TSType::TSQualifiedName(_)
| TSType::TSThisType(_) => true, | TSType::TSThisType(_) => true,
TSType::TSTypeReference(node) => { TSType::TSTypeReference(node) => {
let type_name = TSTypeName::get_first_name(&node.type_name); let type_name = TSTypeName::get_identifier_reference(&node.type_name);
if type_name.name.as_str() == "Array" { if type_name.name.as_str() == "Array" {
if node.type_parameters.is_none() { if node.type_parameters.is_none() {
return true; return true;