Skip to content

Commit 3ee82e2

Browse files
authoredJul 31, 2024··
fix(es/typescript): Fix ASI in expression for fast strip (#9358)
- Closes #9355
1 parent 24e8798 commit 3ee82e2

File tree

5 files changed

+107
-2
lines changed

5 files changed

+107
-2
lines changed
 

‎.changeset/polite-tools-lie.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
swc_fast_ts_strip: patch
3+
---
4+
5+
fix(es/typescript): Fix ASI in expression for TypeScript strip

‎crates/swc_fast_ts_strip/src/lib.rs

+48-2
Original file line numberDiff line numberDiff line change
@@ -389,13 +389,21 @@ impl TsStrip {
389389
..
390390
} = &self.tokens[index - 1];
391391

392-
let index = self.get_prev_token_index(span.hi);
392+
let index = self.get_prev_token_index(span.hi - BytePos(1));
393393
if index == self.tokens.len() - 1 {
394394
// Skip if the token is the last token.
395395
return;
396396
}
397397

398-
let TokenAndSpan { token, .. } = &self.tokens[index + 1];
398+
let TokenAndSpan {
399+
token,
400+
had_line_break,
401+
..
402+
} = &self.tokens[index + 1];
403+
404+
if !*had_line_break {
405+
return;
406+
}
399407

400408
// Add a semicolon if the next token is `[`, `(`, `/`, `+`, or `-`
401409
match token {
@@ -413,6 +421,23 @@ impl TsStrip {
413421
_ => {}
414422
}
415423
}
424+
425+
fn fix_asi_in_expr(&mut self, span: Span) {
426+
let index = self.get_prev_token_index(span.hi - BytePos(1));
427+
if index == self.tokens.len() - 1 {
428+
return;
429+
}
430+
431+
if let TokenAndSpan {
432+
// Only `([` affect ASI.
433+
token: Token::LParen | Token::LBracket,
434+
had_line_break: true,
435+
..
436+
} = &self.tokens[index + 1]
437+
{
438+
self.add_overwrite(span.lo, b';');
439+
}
440+
}
416441
}
417442

418443
impl Visit for TsStrip {
@@ -708,6 +733,16 @@ impl Visit for TsStrip {
708733

709734
fn visit_ts_as_expr(&mut self, n: &TsAsExpr) {
710735
self.add_replacement(span(n.expr.span().hi, n.span.hi));
736+
let TokenAndSpan {
737+
token,
738+
span: as_span,
739+
..
740+
} = self.get_next_token(n.expr.span_hi());
741+
debug_assert_eq!(
742+
token,
743+
&Token::Word(Word::Ident(IdentLike::Known(KnownIdent::As)))
744+
);
745+
self.fix_asi_in_expr(span(as_span.lo, n.span.hi));
711746

712747
n.expr.visit_children_with(self);
713748
}
@@ -820,6 +855,17 @@ impl Visit for TsStrip {
820855
fn visit_ts_satisfies_expr(&mut self, n: &TsSatisfiesExpr) {
821856
self.add_replacement(span(n.expr.span().hi, n.span.hi));
822857

858+
let TokenAndSpan {
859+
token,
860+
span: as_span,
861+
..
862+
} = self.get_next_token(n.expr.span_hi());
863+
debug_assert_eq!(
864+
token,
865+
&Token::Word(Word::Ident(IdentLike::Known(KnownIdent::Satisfies)))
866+
);
867+
self.fix_asi_in_expr(span(as_span.lo, n.span.hi));
868+
823869
n.expr.visit_children_with(self);
824870
}
825871

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const x1 = 10 ;
2+
(1)
3+
4+
const x2 = (10);
5+
(1)
6+
7+
const x3 = 10 ;
8+
(1)
9+
10+
const x4 = (10);
11+
(1)
12+
13+
const y = 10
14+
+ 1
15+
16+
const z = 10
17+
/ 1
18+
19+
const w = 10 ;
20+
[1];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
const x1 = 10;
2+
1;
3+
const x2 = 10;
4+
1;
5+
const x3 = 10;
6+
1;
7+
const x4 = 10;
8+
1;
9+
const y = 10 + 1;
10+
const z = 10 / 1;
11+
const w = 10;
12+
[
13+
1
14+
];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const x1 = 10 as any
2+
(1)
3+
4+
const x2 = (10)as any
5+
(1)
6+
7+
const x3 = 10 satisfies any
8+
(1)
9+
10+
const x4 = (10)satisfies any
11+
(1)
12+
13+
const y = 10 as any
14+
+ 1
15+
16+
const z = 10 as any
17+
/ 1
18+
19+
const w = 10 as any
20+
[1];

0 commit comments

Comments
 (0)
Please sign in to comment.