From 911a71dccac9f6571f0289137f10f471c014ff3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=98=A4=EB=B3=91=EC=A7=84?= <64676070+sunrabbit123@users.noreply.github.com> Date: Mon, 14 Aug 2023 18:46:49 +0900 Subject: [PATCH] refactor: Create `Type::get_any_key_type` (#1066) --- .../src/analyzer/expr/bin.rs | 27 +-------- .../src/analyzer/types/keyof.rs | 55 +------------------ crates/stc_ts_types/src/lib.rs | 29 ++++++++++ 3 files changed, 32 insertions(+), 79 deletions(-) diff --git a/crates/stc_ts_file_analyzer/src/analyzer/expr/bin.rs b/crates/stc_ts_file_analyzer/src/analyzer/expr/bin.rs index 02141109d8..38ac67de83 100644 --- a/crates/stc_ts_file_analyzer/src/analyzer/expr/bin.rs +++ b/crates/stc_ts_file_analyzer/src/analyzer/expr/bin.rs @@ -2091,32 +2091,7 @@ impl Analyzer<'_, '_> { ty => { if let Err(err) = self.assign_with_opts( &mut Default::default(), - &Type::Union(Union { - span, - types: vec![ - Type::Keyword(KeywordType { - span, - kind: TsKeywordTypeKind::TsStringKeyword, - metadata: Default::default(), - tracker: Default::default(), - }), - Type::Keyword(KeywordType { - span, - kind: TsKeywordTypeKind::TsNumberKeyword, - metadata: Default::default(), - tracker: Default::default(), - }), - Type::Keyword(KeywordType { - span, - kind: TsKeywordTypeKind::TsSymbolKeyword, - metadata: Default::default(), - tracker: Default::default(), - }), - ], - metadata: Default::default(), - tracker: Default::default(), - }) - .freezed(), + &Type::get_any_key_type(span), ty, AssignOpts { span: ls, diff --git a/crates/stc_ts_file_analyzer/src/analyzer/types/keyof.rs b/crates/stc_ts_file_analyzer/src/analyzer/types/keyof.rs index be8ed396ab..996957b879 100644 --- a/crates/stc_ts_file_analyzer/src/analyzer/types/keyof.rs +++ b/crates/stc_ts_file_analyzer/src/analyzer/types/keyof.rs @@ -7,6 +7,7 @@ use stc_ts_type_ops::{is_str_lit_or_union, Fix}; use stc_ts_types::{ Class, ClassMember, ClassProperty, Index, KeywordType, KeywordTypeMetadata, LitType, Method, MethodSignature, PropertySignature, Readonly, Ref, Type, TypeElement, TypeParam, Union, + Readonly, Ref, Type, TypeElement, }; use stc_utils::{cache::Freeze, ext::TypeVecExt, stack, try_cache}; use swc_atoms::js_word; @@ -90,32 +91,7 @@ impl Analyzer<'_, '_> { .context("tried applying `keyof` to a literal by delegating to keyword type handler") } Type::Keyword(KeywordType { kind, .. }) => match kind { - TsKeywordTypeKind::TsAnyKeyword => { - let string = Type::Keyword(KeywordType { - span, - kind: TsKeywordTypeKind::TsStringKeyword, - metadata: Default::default(), - tracker: Default::default(), - }); - let number = Type::Keyword(KeywordType { - span, - kind: TsKeywordTypeKind::TsNumberKeyword, - metadata: Default::default(), - tracker: Default::default(), - }); - let symbol = Type::Keyword(KeywordType { - span, - kind: TsKeywordTypeKind::TsSymbolKeyword, - metadata: Default::default(), - tracker: Default::default(), - }); - return Ok(Type::Union(Union { - span, - types: vec![string, number, symbol], - metadata: Default::default(), - tracker: Default::default(), - })); - } + TsKeywordTypeKind::TsAnyKeyword | TsKeywordTypeKind::TsNeverKeyword => return Ok(Type::get_any_key_type(span)), TsKeywordTypeKind::TsVoidKeyword | TsKeywordTypeKind::TsUndefinedKeyword | TsKeywordTypeKind::TsNullKeyword @@ -157,33 +133,6 @@ impl Analyzer<'_, '_> { TsKeywordTypeKind::TsBigIntKeyword => {} TsKeywordTypeKind::TsSymbolKeyword => {} - TsKeywordTypeKind::TsNeverKeyword => { - return Ok(Type::Union(Union { - span, - types: vec![ - Type::Keyword(KeywordType { - span, - kind: TsKeywordTypeKind::TsStringKeyword, - metadata: Default::default(), - tracker: Default::default(), - }), - Type::Keyword(KeywordType { - span, - kind: TsKeywordTypeKind::TsNumberKeyword, - metadata: Default::default(), - tracker: Default::default(), - }), - Type::Keyword(KeywordType { - span, - kind: TsKeywordTypeKind::TsSymbolKeyword, - metadata: Default::default(), - tracker: Default::default(), - }), - ], - metadata: Default::default(), - tracker: Default::default(), - })) - } TsKeywordTypeKind::TsIntrinsicKeyword => {} }, diff --git a/crates/stc_ts_types/src/lib.rs b/crates/stc_ts_types/src/lib.rs index 9a4f8bf369..dd622bf37e 100644 --- a/crates/stc_ts_types/src/lib.rs +++ b/crates/stc_ts_types/src/lib.rs @@ -1900,6 +1900,35 @@ impl Type { _ => None, } } + + pub fn get_any_key_type(span: Span) -> Type { + let string = Type::Keyword(KeywordType { + span, + kind: TsKeywordTypeKind::TsStringKeyword, + metadata: Default::default(), + tracker: Default::default(), + }); + let number = Type::Keyword(KeywordType { + span, + kind: TsKeywordTypeKind::TsNumberKeyword, + metadata: Default::default(), + tracker: Default::default(), + }); + let symbol = Type::Keyword(KeywordType { + span, + kind: TsKeywordTypeKind::TsSymbolKeyword, + metadata: Default::default(), + tracker: Default::default(), + }); + + Type::Union(Union { + span, + types: vec![string, number, symbol], + metadata: Default::default(), + tracker: Default::default(), + }) + .freezed() + } } impl Type {