Skip to content

Commit 1f06249

Browse files
43081jbenmccanndummdidumm
authored
perf: avoid garbage colection in token type utils (#18)
* perf: avoid garbage colection in token type utils This changes the token type functions such that they no longer create a new array of token types every time, but instead use normal equality checks and `includes` on a pre-computed set. `acorn` token types can be mutated, but we already take a snapshot of the types at time of creating our `AcornTypeScript`. Due to this, we can just store the `Object.values` one time up front and call `includes` on the same array later. All of this means we no longer cause garbage collection (for creating a single-use array) and we save CPU cycles on calling `includes` against sets if we already matched. * chore: add changeset * Update .changeset/nine-carrots-share.md --------- Co-authored-by: Ben McCann <[email protected]> Co-authored-by: Simon H <[email protected]>
1 parent 31344cd commit 1f06249

File tree

2 files changed

+34
-21
lines changed

2 files changed

+34
-21
lines changed

.changeset/nine-carrots-share.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/acorn-typescript': patch
3+
---
4+
5+
perf: avoid garbage collection in token type utilities.

src/tokenType.ts

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ function kwLike(_name, options: any = {}) {
1212
}
1313

1414
const acornTypeScriptMap = new WeakMap();
15+
const keywordTypeValues = Object.values(keywordTypes);
1516

1617
export function generateAcornTypeScript(_acorn: any): AcornTypeScript {
1718
const acorn = _acorn.Parser.acorn || _acorn;
1819
let acornTypeScript = acornTypeScriptMap.get(acorn);
1920
if (!acornTypeScript) {
2021
const tsKwTokenType = generateTsKwTokenType();
22+
const tsKwTokenTypeValues = Object.values(tsKwTokenType);
2123
const tsTokenType = generateTsTokenType();
2224
const tsTokenContext = generateTsTokenContext();
2325
const tsKeywordsRegExp = new RegExp(`^(?:${Object.keys(tsKwTokenType).join('|')})$`);
@@ -43,39 +45,45 @@ export function generateAcornTypeScript(_acorn: any): AcornTypeScript {
4345
};
4446

4547
function tokenIsLiteralPropertyName(token: TokenType): boolean {
46-
return [
47-
...[tokTypes.name, tokTypes.string, tokTypes.num],
48-
...Object.values(keywordTypes),
49-
...Object.values(tsKwTokenType)
50-
].includes(token);
48+
return (
49+
token === tokTypes.name ||
50+
token === tokTypes.string ||
51+
token === tokTypes.num ||
52+
keywordTypeValues.includes(token) ||
53+
tsKwTokenTypeValues.includes(token)
54+
);
5155
}
5256

5357
function tokenIsKeywordOrIdentifier(token: TokenType): boolean {
54-
return [
55-
...[tokTypes.name],
56-
...Object.values(keywordTypes),
57-
...Object.values(tsKwTokenType)
58-
].includes(token);
58+
return (
59+
token === tokTypes.name ||
60+
keywordTypeValues.includes(token) ||
61+
tsKwTokenTypeValues.includes(token)
62+
);
5963
}
6064

6165
function tokenIsIdentifier(token: TokenType): boolean {
62-
return [...Object.values(tsKwTokenType), tokTypes.name].includes(token);
66+
return token === tokTypes.name || tsKwTokenTypeValues.includes(token);
6367
}
6468

6569
function tokenIsTSDeclarationStart(token: TokenType): boolean {
66-
return [
67-
tsKwTokenType.abstract,
68-
tsKwTokenType.declare,
69-
tsKwTokenType.enum,
70-
tsKwTokenType.module,
71-
tsKwTokenType.namespace,
72-
tsKwTokenType.interface,
73-
tsKwTokenType.type
74-
].includes(token);
70+
return (
71+
token === tsKwTokenType.abstract ||
72+
token === tsKwTokenType.declare ||
73+
token === tsKwTokenType.enum ||
74+
token === tsKwTokenType.module ||
75+
token === tsKwTokenType.namespace ||
76+
token === tsKwTokenType.interface ||
77+
token === tsKwTokenType.type
78+
);
7579
}
7680

7781
function tokenIsTSTypeOperator(token: TokenType): boolean {
78-
return [tsKwTokenType.keyof, tsKwTokenType.readonly, tsKwTokenType.unique].includes(token);
82+
return (
83+
token === tsKwTokenType.keyof ||
84+
token === tsKwTokenType.readonly ||
85+
token === tsKwTokenType.unique
86+
);
7987
}
8088

8189
function tokenIsTemplate(token: TokenType): boolean {

0 commit comments

Comments
 (0)