From dddedf07943cfd55a3f4f12264b6e0b45cd9a13a Mon Sep 17 00:00:00 2001 From: "Lyu, Wei-Da" <36730922+jasonlyu123@users.noreply.github.com> Date: Thu, 10 Aug 2023 18:17:20 +0800 Subject: [PATCH] fix: generic const modifier (#2118) #2107 Switching to let TypeScript parse the generic attribute by wrapping it with an arrow function. --- .../src/svelte2tsx/nodes/Generics.ts | 27 +++++++++++++++++-- packages/svelte2tsx/test/helpers.ts | 2 +- .../expectedv2.ts | 23 ++++++++++++++++ .../input.svelte | 3 +++ 4 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 packages/svelte2tsx/test/svelte2tsx/samples/generic-attribute-const-modifier/expectedv2.ts create mode 100644 packages/svelte2tsx/test/svelte2tsx/samples/generic-attribute-const-modifier/input.svelte diff --git a/packages/svelte2tsx/src/svelte2tsx/nodes/Generics.ts b/packages/svelte2tsx/src/svelte2tsx/nodes/Generics.ts index 12832c669..857687234 100644 --- a/packages/svelte2tsx/src/svelte2tsx/nodes/Generics.ts +++ b/packages/svelte2tsx/src/svelte2tsx/nodes/Generics.ts @@ -14,13 +14,36 @@ export class Generics { this.genericsAttr = script.attributes.find((attr) => attr.name === 'generics'); const generics = this.genericsAttr?.value[0]?.raw as string | undefined; if (generics) { - this.definitions = generics.split(',').map((g) => g.trim()); - this.references = this.definitions.map((def) => def.split(/\s/)[0]); + const typeParameters = this.getGenericTypeParameters(generics); + + this.definitions = typeParameters?.map((param) => param.getText()) ?? []; + this.references = typeParameters?.map((param) => param.name.getText()) ?? []; } else { this.genericsAttr = undefined; } } + private getGenericTypeParameters(rawGenericsAttr: string) { + const sourceFile = ts.createSourceFile( + 'index.ts', + `<${rawGenericsAttr}>() => {}`, + ts.ScriptTarget.Latest, + true + ); + const firstStatement = sourceFile.statements[0]; + + if (!firstStatement || !ts.isExpressionStatement(firstStatement)) { + return; + } + + const arrowFunction = firstStatement.expression; + if (!ts.isArrowFunction(arrowFunction)) { + return; + } + + return arrowFunction.typeParameters; + } + addIfIsGeneric(node: ts.Node) { if (ts.isTypeAliasDeclaration(node) && this.is$$GenericType(node.type)) { if (this.genericsAttr) { diff --git a/packages/svelte2tsx/test/helpers.ts b/packages/svelte2tsx/test/helpers.ts index 34fc365db..8ba702e71 100644 --- a/packages/svelte2tsx/test/helpers.ts +++ b/packages/svelte2tsx/test/helpers.ts @@ -11,7 +11,7 @@ function can_auto_update() { if (!process.argv.includes('--auto') && !all_tests_skipped) { if (update_count++ === 0) { process.on('exit', () => { - const command = color.yellow('yarn run test --auto'); + const command = color.yellow('pnpm run test -- --auto'); console.log(` Run ${command} to update ${update_count} files\n`); }); } diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/generic-attribute-const-modifier/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/generic-attribute-const-modifier/expectedv2.ts new file mode 100644 index 000000000..2d6b82d01 --- /dev/null +++ b/packages/svelte2tsx/test/svelte2tsx/samples/generic-attribute-const-modifier/expectedv2.ts @@ -0,0 +1,23 @@ +/// +;function render() { + + let items: T/*Ωignore_startΩ*/;items = __sveltets_2_any(items);/*Ωignore_endΩ*/; +; +async () => {}; +return { props: {items: items}, slots: {}, events: {} }} +class __sveltets_Render { + props() { + return render().props; + } + events() { + return __sveltets_2_with_any_event(render()).events; + } + slots() { + return render().slots; + } +} + + +import { SvelteComponentTyped as __SvelteComponentTyped__ } from "svelte" +export default class Input__SvelteComponent_ extends __SvelteComponentTyped__['props']>, ReturnType<__sveltets_Render['events']>, ReturnType<__sveltets_Render['slots']>> { +} \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/generic-attribute-const-modifier/input.svelte b/packages/svelte2tsx/test/svelte2tsx/samples/generic-attribute-const-modifier/input.svelte new file mode 100644 index 000000000..0da7da49d --- /dev/null +++ b/packages/svelte2tsx/test/svelte2tsx/samples/generic-attribute-const-modifier/input.svelte @@ -0,0 +1,3 @@ +