From 917aea4f22edb6ce052a373175af8de9c6011f44 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Fri, 31 Mar 2023 18:34:49 +0200 Subject: [PATCH] (fix) use Svelte's ComponentConstructorOptions ...and remove reliance on Svelte2TsxComponent Everything required is available from Svelte now --- .../features/CodeActionsProvider.ts | 38 +++++++----- packages/language-server/src/utils.ts | 6 ++ .../features/CodeActionsProvider.test.ts | 59 +++++++++++++++++++ .../organize-imports-with-generics.svelte | 9 +++ .../src/svelte2tsx/addComponentExport.ts | 5 +- packages/svelte2tsx/svelte-shims.d.ts | 6 +- .../samples/svelte-element/expectedv2.ts | 2 +- .../ts-$$generics-accessor/expectedv2.ts | 3 +- .../expectedv2.ts | 3 +- .../samples/ts-$$generics/expectedv2.ts | 3 +- .../samples/uses-$$props-script/expectedv2.ts | 2 +- 11 files changed, 112 insertions(+), 24 deletions(-) create mode 100644 packages/language-server/test/plugins/typescript/testfiles/code-actions/organize-imports-with-generics.svelte diff --git a/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts b/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts index 8ceee0a0c..853e7e83a 100644 --- a/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts @@ -31,7 +31,8 @@ import { modifyLines, normalizePath, pathToUrl, - possiblyComponent + possiblyComponent, + removeLineWithString } from '../../../utils'; import { CodeActionsProvider } from '../../interfaces'; import { DocumentSnapshot, SvelteDocumentSnapshot } from '../DocumentSnapshot'; @@ -207,7 +208,6 @@ export class CodeActionsProviderImpl implements CodeActionsProvider { normalizePath(virtualDocInfo.virtualDoc.getFilePath()!) ); - console.log(JSON.stringify(fix.changes, null, 2)); for (const change of fix.changes) { if (getCanonicalFileName(normalizePath(change.fileName)) === virtualDocPath) { change.fileName = tsDoc.filePath; @@ -215,7 +215,6 @@ export class CodeActionsProviderImpl implements CodeActionsProvider { this.removeDuplicatedComponentImport(virtualDocInfo.insertedNames, change); } } - console.log(JSON.stringify(fix.changes, null, 2)); await this.lsAndTsDocResolver.deleteSnapshot(virtualDocPath); } @@ -432,18 +431,29 @@ export class CodeActionsProviderImpl implements CodeActionsProvider { // Organize Imports will only affect the current file, so no need to check the file path return TextDocumentEdit.create( OptionalVersionedTextDocumentIdentifier.create(document.url, null), - change.textChanges.map((edit) => { - const range = this.checkRemoveImportCodeActionRange( - edit, - tsDoc, - mapRangeToOriginal(tsDoc, convertRange(tsDoc, edit.span)) - ); + change.textChanges + .map((edit) => { + const range = this.checkRemoveImportCodeActionRange( + edit, + tsDoc, + mapRangeToOriginal(tsDoc, convertRange(tsDoc, edit.span)) + ); - return this.fixIndentationOfImports( - TextEdit.replace(range, edit.newText), - document - ); - }) + edit.newText = removeLineWithString( + edit.newText, + 'SvelteComponentTyped as __SvelteComponentTyped__' + ); + + return this.fixIndentationOfImports( + TextEdit.replace(range, edit.newText), + document + ); + }) + .filter( + (edit) => + // The __SvelteComponentTyped__ import is added by us and will have a negative mapped line + edit.range.start.line !== -1 + ) ); }) ); diff --git a/packages/language-server/src/utils.ts b/packages/language-server/src/utils.ts index 9151fd525..3194cf82a 100644 --- a/packages/language-server/src/utils.ts +++ b/packages/language-server/src/utils.ts @@ -334,3 +334,9 @@ export function memoize(callback: () => T): () => T { return value; }; } + +export function removeLineWithString(str: string, keyword: string) { + const lines = str.split('\n'); + const filteredLines = lines.filter((line) => !line.includes(keyword)); + return filteredLines.join('\n'); +} diff --git a/packages/language-server/test/plugins/typescript/features/CodeActionsProvider.test.ts b/packages/language-server/test/plugins/typescript/features/CodeActionsProvider.test.ts index 441440828..7ae41ab93 100644 --- a/packages/language-server/test/plugins/typescript/features/CodeActionsProvider.test.ts +++ b/packages/language-server/test/plugins/typescript/features/CodeActionsProvider.test.ts @@ -1787,6 +1787,65 @@ describe('CodeActionsProvider', () => { }); }); + it('organize imports ignores generated __SvelteComponentTyped__', async () => { + const { provider, document } = setup('organize-imports-with-generics.svelte'); + + const codeActions = await provider.getCodeActions( + document, + Range.create(Position.create(1, 4), Position.create(1, 5)), + { + diagnostics: [], + only: [CodeActionKind.SourceOrganizeImports] + } + ); + + console.log(JSON.stringify(codeActions, null, 2)); + assert.deepStrictEqual(codeActions, [ + { + title: 'Organize Imports', + edit: { + documentChanges: [ + { + textDocument: { + uri: getUri('organize-imports-with-generics.svelte'), + version: null + }, + edits: [ + { + range: { + start: { + line: 1, + character: 2 + }, + end: { + line: 2, + character: 2 + } + }, + newText: "import A from './A';\n" + }, + { + range: { + start: { + line: 2, + character: 2 + }, + end: { + line: 3, + character: 0 + } + }, + newText: '' + } + ] + } + ] + }, + kind: 'source.organizeImports' + } + ]); + }); + it('should do extract into function refactor', async () => { const { provider, document } = setup('codeactions.svelte'); diff --git a/packages/language-server/test/plugins/typescript/testfiles/code-actions/organize-imports-with-generics.svelte b/packages/language-server/test/plugins/typescript/testfiles/code-actions/organize-imports-with-generics.svelte new file mode 100644 index 000000000..e2bb55b71 --- /dev/null +++ b/packages/language-server/test/plugins/typescript/testfiles/code-actions/organize-imports-with-generics.svelte @@ -0,0 +1,9 @@ + + +{c} \ No newline at end of file diff --git a/packages/svelte2tsx/src/svelte2tsx/addComponentExport.ts b/packages/svelte2tsx/src/svelte2tsx/addComponentExport.ts index 234e07c60..9d940e070 100644 --- a/packages/svelte2tsx/src/svelte2tsx/addComponentExport.ts +++ b/packages/svelte2tsx/src/svelte2tsx/addComponentExport.ts @@ -84,9 +84,10 @@ class __sveltets_Render${genericsDef} { '\n}'; } else { statement += - `\n\n${doc}export default class${ + '\n\nimport { SvelteComponentTyped as __SvelteComponentTyped__ } from "svelte" \n' + + `${doc}export default class${ className ? ` ${className}` : '' - }${genericsDef} extends Svelte2TsxComponent<${returnType('props')}, ${returnType( + }${genericsDef} extends __SvelteComponentTyped__<${returnType('props')}, ${returnType( 'events' )}, ${returnType('slots')}> {` + exportedNames.createClassGetters() + diff --git a/packages/svelte2tsx/svelte-shims.d.ts b/packages/svelte2tsx/svelte-shims.d.ts index 0a2d6941c..bf0a4c22e 100644 --- a/packages/svelte2tsx/svelte-shims.d.ts +++ b/packages/svelte2tsx/svelte-shims.d.ts @@ -60,7 +60,7 @@ declare class Svelte2TsxComponent< $inject_state(): void; } -/** @internal PRIVATE API, DO NOT USE */ +/** @deprecated PRIVATE API, DO NOT USE, REMOVED SOON */ interface Svelte2TsxComponentConstructorParameters { /** * An HTMLElement to render to. This option is required. @@ -82,7 +82,7 @@ interface Svelte2TsxComponentConstructorParameters { type AConstructorTypeOf = new (...args: U) => T; /** @internal PRIVATE API, DO NOT USE */ -type SvelteComponentConstructor> = new (options: U) => T; +type SvelteComponentConstructor> = new (options: U) => T; /** @internal PRIVATE API, DO NOT USE */ type SvelteActionReturnType = { @@ -207,7 +207,7 @@ declare function __sveltets_2_unionType(...types: any[]): any; declare function __sveltets_2_createSvelte2TsxComponent( render: {props: Props, events: Events, slots: Slots } -): SvelteComponentConstructor,Svelte2TsxComponentConstructorParameters>; +): SvelteComponentConstructor,import('svelte').ComponentConstructorOptions>; declare function __sveltets_2_unwrapArr(arr: ArrayLike): T declare function __sveltets_2_unwrapPromiseLike(promise: PromiseLike | T): T diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/svelte-element/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/svelte-element/expectedv2.ts index 341c6572f..e7a454dc5 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/svelte-element/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/svelte-element/expectedv2.ts @@ -14,4 +14,4 @@ async () => { return { props: /** @type {Record} */ ({}), slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_2_createSvelte2TsxComponent(__sveltets_2_partial(__sveltets_2_with_any_event(render()))) { -} +} \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics-accessor/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics-accessor/expectedv2.ts index 02aebf014..4e67c97e4 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics-accessor/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics-accessor/expectedv2.ts @@ -22,7 +22,8 @@ class __sveltets_Render { } -export default class Input__SvelteComponent_ extends Svelte2TsxComponent['props']>, ReturnType<__sveltets_Render['events']>, ReturnType<__sveltets_Render['slots']>> { +import { SvelteComponentTyped as __SvelteComponentTyped__ } from "svelte" +export default class Input__SvelteComponent_ extends __SvelteComponentTyped__['props']>, ReturnType<__sveltets_Render['events']>, ReturnType<__sveltets_Render['slots']>> { get a() { return this.$$prop_def.a } /**accessor*/ set a(_) {} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics-interface-references/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics-interface-references/expectedv2.ts index a9692128d..5d63bc95e 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics-interface-references/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics-interface-references/expectedv2.ts @@ -34,5 +34,6 @@ class __sveltets_Render { } -export default class Input__SvelteComponent_ extends Svelte2TsxComponent['props']>, ReturnType<__sveltets_Render['events']>, ReturnType<__sveltets_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/ts-$$generics/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics/expectedv2.ts index bd957ff07..e08603058 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics/expectedv2.ts @@ -37,6 +37,7 @@ class __sveltets_Render { } -export default class Input__SvelteComponent_ extends Svelte2TsxComponent['props']>, ReturnType<__sveltets_Render['events']>, ReturnType<__sveltets_Render['slots']>> { +import { SvelteComponentTyped as __SvelteComponentTyped__ } from "svelte" +export default class Input__SvelteComponent_ extends __SvelteComponentTyped__['props']>, ReturnType<__sveltets_Render['events']>, ReturnType<__sveltets_Render['slots']>> { get getA() { return __sveltets_2_nonNullable(this.$$prop_def.getA) } } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props-script/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props-script/expectedv2.ts index 8a328f55e..fafe1b21c 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props-script/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props-script/expectedv2.ts @@ -8,4 +8,4 @@ async () => { { svelteHTML.createElement("h1", {});name; } return { props: {}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_2_createSvelte2TsxComponent(__sveltets_2_partial_with_any(__sveltets_2_with_any_event(render()))) { -} +} \ No newline at end of file