From 474a27fe39a8b628c47b3f45319a47c79e31a30f Mon Sep 17 00:00:00 2001 From: James Garbutt <43081j@users.noreply.github.com> Date: Wed, 17 Sep 2025 19:50:29 +0100 Subject: [PATCH 1/3] 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. --- src/tokenType.ts | 50 ++++++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/src/tokenType.ts b/src/tokenType.ts index e87a2df..acc50ff 100644 --- a/src/tokenType.ts +++ b/src/tokenType.ts @@ -12,12 +12,14 @@ function kwLike(_name, options: any = {}) { } const acornTypeScriptMap = new WeakMap(); +const keywordTypeValues = Object.values(keywordTypes); export function generateAcornTypeScript(_acorn: any): AcornTypeScript { const acorn = _acorn.Parser.acorn || _acorn; let acornTypeScript = acornTypeScriptMap.get(acorn); if (!acornTypeScript) { const tsKwTokenType = generateTsKwTokenType(); + const tsKwTokenTypeValues = Object.values(tsKwTokenType); const tsTokenType = generateTsTokenType(); const tsTokenContext = generateTsTokenContext(); const tsKeywordsRegExp = new RegExp(`^(?:${Object.keys(tsKwTokenType).join('|')})$`); @@ -43,39 +45,45 @@ export function generateAcornTypeScript(_acorn: any): AcornTypeScript { }; function tokenIsLiteralPropertyName(token: TokenType): boolean { - return [ - ...[tokTypes.name, tokTypes.string, tokTypes.num], - ...Object.values(keywordTypes), - ...Object.values(tsKwTokenType) - ].includes(token); + return ( + token === tokTypes.name || + token === tokTypes.string || + token === tokTypes.num || + keywordTypeValues.includes(token) || + tsKwTokenTypeValues.includes(token) + ); } function tokenIsKeywordOrIdentifier(token: TokenType): boolean { - return [ - ...[tokTypes.name], - ...Object.values(keywordTypes), - ...Object.values(tsKwTokenType) - ].includes(token); + return ( + token === tokTypes.name || + keywordTypeValues.includes(token) || + tsKwTokenTypeValues.includes(token) + ); } function tokenIsIdentifier(token: TokenType): boolean { - return [...Object.values(tsKwTokenType), tokTypes.name].includes(token); + return token === tokTypes.name || tsKwTokenTypeValues.includes(token); } function tokenIsTSDeclarationStart(token: TokenType): boolean { - return [ - tsKwTokenType.abstract, - tsKwTokenType.declare, - tsKwTokenType.enum, - tsKwTokenType.module, - tsKwTokenType.namespace, - tsKwTokenType.interface, - tsKwTokenType.type - ].includes(token); + return ( + token === tsKwTokenType.abstract || + token === tsKwTokenType.declare || + token === tsKwTokenType.enum || + token === tsKwTokenType.module || + token === tsKwTokenType.namespace || + token === tsKwTokenType.interface || + token === tsKwTokenType.type + ); } function tokenIsTSTypeOperator(token: TokenType): boolean { - return [tsKwTokenType.keyof, tsKwTokenType.readonly, tsKwTokenType.unique].includes(token); + return ( + token === tsKwTokenType.keyof || + token === tsKwTokenType.readonly || + token === tsKwTokenType.unique + ); } function tokenIsTemplate(token: TokenType): boolean { From 15c7a74db8b77fbb9c6ae3a33fb7d00c3ec11836 Mon Sep 17 00:00:00 2001 From: James Garbutt <43081j@users.noreply.github.com> Date: Wed, 17 Sep 2025 19:54:35 +0100 Subject: [PATCH 2/3] chore: add changeset --- .changeset/nine-carrots-share.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/nine-carrots-share.md diff --git a/.changeset/nine-carrots-share.md b/.changeset/nine-carrots-share.md new file mode 100644 index 0000000..d6c2c58 --- /dev/null +++ b/.changeset/nine-carrots-share.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/acorn-typescript': patch +--- + +Avoid garbage collection in token type utilities. From 2c518182fb99f423135294a893f69176bc257754 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Fri, 26 Sep 2025 15:20:58 +0200 Subject: [PATCH 3/3] Update .changeset/nine-carrots-share.md --- .changeset/nine-carrots-share.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/nine-carrots-share.md b/.changeset/nine-carrots-share.md index d6c2c58..05bec7e 100644 --- a/.changeset/nine-carrots-share.md +++ b/.changeset/nine-carrots-share.md @@ -2,4 +2,4 @@ '@sveltejs/acorn-typescript': patch --- -Avoid garbage collection in token type utilities. +perf: avoid garbage collection in token type utilities.