Skip to content

Commit 98af589

Browse files
authored
feat(es/typescript): Improve fast TS strip (#9167)
1 parent 18080f7 commit 98af589

File tree

4 files changed

+60
-29
lines changed

4 files changed

+60
-29
lines changed

bindings/binding_typescript_wasm/__tests__/__snapshots__/transform.js.snap

+11-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,18 @@
22

33
exports[`transform in strip-only mode should remove declare enum 1`] = `" "`;
44

5-
exports[`transform in strip-only mode should remove declare enum 2`] = `" "`;
5+
exports[`transform in strip-only mode should remove declare enum 2`] = `
6+
"
7+
8+
"
9+
`;
610

7-
exports[`transform in strip-only mode should remove declare enum 3`] = `" "`;
11+
exports[`transform in strip-only mode should remove declare enum 3`] = `
12+
"
13+
14+
15+
"
16+
`;
817

918
exports[`transform in strip-only mode should strip complex expressions 1`] = `
1019
"const foo = {

crates/swc_fast_ts_strip/src/lib.rs

+31-19
Original file line numberDiff line numberDiff line change
@@ -168,22 +168,28 @@ impl TsStrip {
168168
&self.src[(span.lo.0 - 1) as usize..(span.hi.0 - 1) as usize]
169169
}
170170

171-
fn get_next_token(&self, pos: BytePos) -> &TokenAndSpan {
171+
fn get_next_token_index(&self, pos: BytePos) -> usize {
172172
let index = self.tokens.binary_search_by_key(&pos, |t| t.span.lo);
173-
let index = match index {
173+
match index {
174174
Ok(index) => index,
175175
Err(index) => index,
176-
};
177-
&self.tokens[index]
176+
}
178177
}
179178

180-
fn get_prev_token(&self, pos: BytePos) -> &TokenAndSpan {
179+
fn get_next_token(&self, pos: BytePos) -> &TokenAndSpan {
180+
&self.tokens[self.get_next_token_index(pos)]
181+
}
182+
183+
fn get_prev_token_index(&self, pos: BytePos) -> usize {
181184
let index = self.tokens.binary_search_by_key(&pos, |t| t.span.lo);
182-
let index = match index {
185+
match index {
183186
Ok(index) => index,
184187
Err(index) => index - 1,
185-
};
186-
&self.tokens[index]
188+
}
189+
}
190+
191+
fn get_prev_token(&self, pos: BytePos) -> &TokenAndSpan {
192+
&self.tokens[self.get_prev_token_index(pos)]
187193
}
188194
}
189195

@@ -218,7 +224,7 @@ impl Visit for TsStrip {
218224
// 1;
219225
// ```
220226

221-
self.add_overwrite(ret.span_hi(), b')');
227+
self.add_overwrite(ret.span_hi() - BytePos(1), b')');
222228
}
223229
}
224230

@@ -264,6 +270,10 @@ impl Visit for TsStrip {
264270
if !n.implements.is_empty() {
265271
let implements =
266272
self.get_prev_token(n.implements.first().unwrap().span_lo() - BytePos(1));
273+
debug_assert_eq!(
274+
implements.token,
275+
Token::Word(Word::Ident(IdentLike::Known(KnownIdent::Implements)))
276+
);
267277

268278
let last = n.implements.last().unwrap();
269279
let span = span(implements.span.lo, last.span.hi);
@@ -279,13 +289,14 @@ impl Visit for TsStrip {
279289
return;
280290
}
281291

282-
let key_span = n.key.span_hi();
283-
let method_pos = n.function.span_lo();
292+
let key_pos = n.key.span_lo();
293+
let mut pos = n.span_lo();
294+
let mut index = self.get_next_token_index(pos);
284295

285-
let mut pos = method_pos;
286-
while pos < key_span {
287-
let TokenAndSpan { token, span, .. } = self.get_next_token(pos);
296+
while pos < key_pos {
297+
let TokenAndSpan { token, span, .. } = &self.tokens[index];
288298
pos = span.hi;
299+
index += 1;
289300
match token {
290301
Token::Word(Word::Ident(IdentLike::Known(
291302
KnownIdent::Public | KnownIdent::Protected | KnownIdent::Private,
@@ -308,13 +319,14 @@ impl Visit for TsStrip {
308319
return;
309320
}
310321

311-
let key_span = n.key.span_hi();
312-
let method_pos = n.span_lo();
322+
let key_pos = n.key.span_lo();
323+
let mut pos = n.span_lo();
324+
let mut index = self.get_next_token_index(pos);
313325

314-
let mut pos = method_pos;
315-
while pos < key_span {
316-
let TokenAndSpan { token, span, .. } = self.get_next_token(pos);
326+
while pos < key_pos {
327+
let TokenAndSpan { token, span, .. } = &self.tokens[index];
317328
pos = span.hi;
329+
index += 1;
318330
match token {
319331
Token::Word(Word::Ident(IdentLike::Known(
320332
KnownIdent::Readonly

crates/swc_fast_ts_strip/tests/fixture/test-case-1.js

+12-7
Original file line numberDiff line numberDiff line change
@@ -142,36 +142,41 @@ void 0;
142142
// `=>` spanning line cases:
143143
{
144144
(
145-
)=>
145+
) =>
146146
1
147147
};
148148
{
149149
(
150-
)=>
150+
) =>
151151
1
152152
};
153153
{
154154
(
155155

156-
)=>
156+
) =>
157157
1
158158
};
159159
{
160160
(
161161

162162

163-
)=>
163+
) =>
164164
1
165165
};
166166
{
167167
(
168168

169169

170-
)=>
170+
) =>
171171
1
172172
};
173173
{
174174
(a, b, c = [] /*comment-1*/ /*comment-2*/
175-
)=>
175+
) =>
176176
1
177-
};
177+
};
178+
179+
180+
(
181+
)=>
182+
1;

crates/swc_fast_ts_strip/tests/fixture/test-case-1.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -174,4 +174,9 @@ void 0;
174174
(a, b, c: D = [] as any/*comment-1*/)/*comment-2*/:
175175
any =>
176176
1
177-
};
177+
};
178+
179+
180+
():
181+
any=>
182+
1;

0 commit comments

Comments
 (0)