Skip to content

Commit

Permalink
normalize never macro
Browse files Browse the repository at this point in the history
  • Loading branch information
sunrabbit123 committed Sep 22, 2023
1 parent ed42972 commit af5ad98
Showing 1 changed file with 19 additions and 41 deletions.
60 changes: 19 additions & 41 deletions crates/stc_ts_file_analyzer/src/analyzer/types/intersection.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,14 @@ use swc_ecma_ast::TsKeywordTypeKind;
use super::NormalizeTypeOpts;
use crate::{analyzer::Analyzer, VResult};

macro_rules! never {
($span:ident) => {{
Ok(Some(Type::never($span, Default::default())))
}};
}

impl Analyzer<'_, '_> {
pub(crate) fn normalize_intersection_types(&mut self, span: Span, types: &[Type], opts: NormalizeTypeOpts) -> VResult<Option<Type>> {
macro_rules! never {
() => {{
Ok(Some(Type::Keyword(KeywordType {
span,
kind: TsKeywordTypeKind::TsNeverKeyword,
metadata: KeywordTypeMetadata { ..Default::default() },
tracker: Default::default(),
})))
}};
}

let mut normalized_types = vec![];
// set normalize all
for el in types.iter() {
Expand Down Expand Up @@ -67,7 +62,7 @@ impl Analyzer<'_, '_> {
}
// has never; return never
if normalized_types.iter().any(|ty| ty.is_never()) {
return never!();
return never!(span);
}
// has any, return any
if normalized_types.iter().any(|ty| ty.is_any()) {
Expand All @@ -91,7 +86,7 @@ impl Analyzer<'_, '_> {
let is_type_lit = normalized_types.iter().any(|ty| ty.is_type_lit());

if (is_null || is_undefined) && is_type_lit {
return never!();
return never!(span);
}

let sum = u32::from(is_symbol)
Expand All @@ -108,15 +103,15 @@ impl Analyzer<'_, '_> {
if sum == 2 && is_undefined && is_void {
return Ok(Some(Type::undefined(span, Default::default())));
}
return never!();
return never!(span);
}

if normalized_types.len() == 2 {
let (a, b) = (&normalized_types[0], &normalized_types[1]);
if ((a.is_str_lit() && b.is_str_lit()) || (a.is_num_lit() && b.is_num_lit()) || (a.is_bool_lit() && b.is_bool_lit()))
&& !a.type_eq(b)
{
return never!();
return never!(span);
}
if let (Type::Conditional(c), other) | (other, Type::Conditional(c)) = (a.normalize(), b.normalize()) {
return Ok(Some(
Expand All @@ -139,7 +134,7 @@ impl Analyzer<'_, '_> {

if enum_variant_len > 0 {
if normalized_types.iter().any(|ty| matches!(ty.normalize(), Type::Lit(..))) {
return never!();
return never!(span);
}
if let Some(first_enum) = enum_variant_iter.first() {
let mut enum_temp = first_enum.normalize();
Expand All @@ -152,14 +147,14 @@ impl Analyzer<'_, '_> {
}

if en.def.id != el.def.id {
return never!();
return never!(span);
}

// eq two argument enum_name
if let Ok(el_lit) = self.expand_enum_variant(elem.clone()) {
if let Ok(etl) = self.expand_enum_variant(enum_temp.clone()) {
if !etl.type_eq(&el_lit) {
return never!();
return never!(span);
}
}
}
Expand Down Expand Up @@ -215,10 +210,10 @@ impl Analyzer<'_, '_> {
});

if str_lits.is_empty() && is_str {
return never!();
return never!(span);
}
if num_lits.is_empty() && is_num {
return never!();
return never!(span);
}
if str_lits.is_empty() && is_num || num_lits.is_empty() && is_str {
return Ok(Some(elem.clone().freezed()));
Expand All @@ -231,7 +226,7 @@ impl Analyzer<'_, '_> {
} else if is_num {
num_lits
} else {
return never!();
return never!(span);
},
);

Expand Down Expand Up @@ -273,12 +268,6 @@ impl Analyzer<'_, '_> {
}

fn flat_intersection_type(&mut self, span: Span, mut normalized_types: Vec<Type>) -> VResult<Option<Type>> {
macro_rules! never {
() => {{
Ok(Some(Type::never(span, Default::default())))
}};
}

let normalized_len = normalized_types.len();
normalized_types.freeze();

Expand Down Expand Up @@ -402,12 +391,12 @@ impl Analyzer<'_, '_> {
new_types.retain(|ty| !ty.is_never());

acc_type = match new_types.len() {
0 => return never!(),
0 => return never!(span),
1 => {
if let Some(ty) = new_types.pop() {
ty
} else {
return never!();
return never!(span);
}
}
_ => Type::new_union(span, new_types).freezed(),
Expand All @@ -428,17 +417,6 @@ impl Analyzer<'_, '_> {
property_types: &mut Vec<TypeElement>,
opts: NormalizeTypeOpts,
) -> VResult<Option<Type>> {
macro_rules! never {
() => {{
Ok(Some(Type::Keyword(KeywordType {
span,
kind: TsKeywordTypeKind::TsNeverKeyword,
metadata: KeywordTypeMetadata { ..Default::default() },
tracker: Default::default(),
})))
}};
}

// Intersect property types
'outer: for e in elements.iter() {
if let TypeElement::Property(p) = e {
Expand All @@ -450,7 +428,7 @@ impl Analyzer<'_, '_> {

if let Some(new) = self.normalize_intersection_types(span, &[prev_type, other], opts)? {
if new.is_never() {
return never!();
return never!(span);
}

prev.type_ann = Some(Box::new(new));
Expand Down

0 comments on commit af5ad98

Please sign in to comment.