@@ -9,7 +9,7 @@ use swc_core::ecma::{ast::*, atoms::Atom};
99use swc_core:: plugin:: errors:: HANDLER ;
1010
1111fn expression_to_name ( expr : & Expr , ctx : & mut MacroCtx ) -> String {
12- let expr = unwrap_ts_as_expr ( expr) ;
12+ let expr = unwrap_ts_only_expr ( expr) ;
1313
1414 match expr {
1515 Expr :: Ident ( ident) => ident. sym . to_string ( ) ,
@@ -33,7 +33,7 @@ fn expression_to_name(expr: &Expr, ctx: &mut MacroCtx) -> String {
3333}
3434
3535fn expression_to_value ( expr : Box < Expr > ) -> Box < Expr > {
36- let unwrapped = unwrap_ts_as_expr ( & expr) ;
36+ let unwrapped = unwrap_ts_only_expr ( & expr) ;
3737
3838 match unwrapped {
3939 Expr :: Object ( object) => {
@@ -66,14 +66,18 @@ fn expression_to_value(expr: Box<Expr>) -> Box<Expr> {
6666 }
6767}
6868
69- // recursively expands TypeScript's as expressions until it reaches a real value
70- fn unwrap_ts_as_expr ( expr : & Expr ) -> & Expr {
69+ // recursively unwraps TypeScript-only expression wrappers (`x as T`, `x!`,
70+ // `x satisfies T`) until it reaches a real value, so the inner expression drives
71+ // placeholder naming (e.g. `${x!}` → `{x}`, not `{0}`).
72+ fn unwrap_ts_only_expr ( expr : & Expr ) -> & Expr {
7173 let mut current = expr;
72- while let Expr :: TsAs ( TsAsExpr {
73- expr : inner_expr, ..
74- } ) = current
75- {
76- current = inner_expr;
74+ loop {
75+ current = match current {
76+ Expr :: TsAs ( TsAsExpr { expr, .. } )
77+ | Expr :: TsNonNull ( TsNonNullExpr { expr, .. } )
78+ | Expr :: TsSatisfies ( TsSatisfiesExpr { expr, .. } ) => expr,
79+ _ => break ,
80+ } ;
7781 }
7882 current
7983}
0 commit comments