Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ import {
modifyLines,
normalizePath,
pathToUrl,
possiblyComponent
possiblyComponent,
removeLineWithString
} from '../../../utils';
import { CodeActionsProvider } from '../../interfaces';
import { DocumentSnapshot, SvelteDocumentSnapshot } from '../DocumentSnapshot';
Expand Down Expand Up @@ -207,15 +208,13 @@ 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;

this.removeDuplicatedComponentImport(virtualDocInfo.insertedNames, change);
}
}
console.log(JSON.stringify(fix.changes, null, 2));

await this.lsAndTsDocResolver.deleteSnapshot(virtualDocPath);
}
Expand Down Expand Up @@ -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
)
);
})
);
Expand Down
6 changes: 6 additions & 0 deletions packages/language-server/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -334,3 +334,9 @@ export function memoize<T>(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');
}
Original file line number Diff line number Diff line change
Expand Up @@ -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');

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<script lang="ts">
import B from './B';
import A from './A';

type T = $$Generic;
export let t: T;
</script>

<A>{c}</A>
5 changes: 3 additions & 2 deletions packages/svelte2tsx/src/svelte2tsx/addComponentExport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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() +
Expand Down
6 changes: 3 additions & 3 deletions packages/svelte2tsx/svelte-shims.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<Props extends {}> {
/**
* An HTMLElement to render to. This option is required.
Expand All @@ -82,7 +82,7 @@ interface Svelte2TsxComponentConstructorParameters<Props extends {}> {

type AConstructorTypeOf<T, U extends any[] = any[]> = new (...args: U) => T;
/** @internal PRIVATE API, DO NOT USE */
type SvelteComponentConstructor<T, U extends Svelte2TsxComponentConstructorParameters<any>> = new (options: U) => T;
type SvelteComponentConstructor<T, U extends import('svelte').ComponentConstructorOptions<any>> = new (options: U) => T;

/** @internal PRIVATE API, DO NOT USE */
type SvelteActionReturnType = {
Expand Down Expand Up @@ -207,7 +207,7 @@ declare function __sveltets_2_unionType(...types: any[]): any;

declare function __sveltets_2_createSvelte2TsxComponent<Props, Events, Slots>(
render: {props: Props, events: Events, slots: Slots }
): SvelteComponentConstructor<import("svelte").SvelteComponentTyped<Props, Events, Slots>,Svelte2TsxComponentConstructorParameters<Props>>;
): SvelteComponentConstructor<import("svelte").SvelteComponentTyped<Props, Events, Slots>,import('svelte').ComponentConstructorOptions<Props>>;

declare function __sveltets_2_unwrapArr<T>(arr: ArrayLike<T>): T
declare function __sveltets_2_unwrapPromiseLike<T>(promise: PromiseLike<T> | T): T
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@ async () => {
return { props: /** @type {Record<string, never>} */ ({}), slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_2_createSvelte2TsxComponent(__sveltets_2_partial(__sveltets_2_with_any_event(render()))) {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ class __sveltets_Render<A> {
}


export default class Input__SvelteComponent_<A> extends Svelte2TsxComponent<ReturnType<__sveltets_Render<A>['props']>, ReturnType<__sveltets_Render<A>['events']>, ReturnType<__sveltets_Render<A>['slots']>> {
import { SvelteComponentTyped as __SvelteComponentTyped__ } from "svelte"
export default class Input__SvelteComponent_<A> extends __SvelteComponentTyped__<ReturnType<__sveltets_Render<A>['props']>, ReturnType<__sveltets_Render<A>['events']>, ReturnType<__sveltets_Render<A>['slots']>> {
get a() { return this.$$prop_def.a }
/**accessor*/
set a(_) {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,6 @@ class __sveltets_Render<A,B extends ReferencedByGeneric> {
}


export default class Input__SvelteComponent_<A,B extends ReferencedByGeneric> extends Svelte2TsxComponent<ReturnType<__sveltets_Render<A,B>['props']>, ReturnType<__sveltets_Render<A,B>['events']>, ReturnType<__sveltets_Render<A,B>['slots']>> {
import { SvelteComponentTyped as __SvelteComponentTyped__ } from "svelte"
export default class Input__SvelteComponent_<A,B extends ReferencedByGeneric> extends __SvelteComponentTyped__<ReturnType<__sveltets_Render<A,B>['props']>, ReturnType<__sveltets_Render<A,B>['events']>, ReturnType<__sveltets_Render<A,B>['slots']>> {
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ class __sveltets_Render<A,B extends keyof A,C extends boolean> {
}


export default class Input__SvelteComponent_<A,B extends keyof A,C extends boolean> extends Svelte2TsxComponent<ReturnType<__sveltets_Render<A,B,C>['props']>, ReturnType<__sveltets_Render<A,B,C>['events']>, ReturnType<__sveltets_Render<A,B,C>['slots']>> {
import { SvelteComponentTyped as __SvelteComponentTyped__ } from "svelte"
export default class Input__SvelteComponent_<A,B extends keyof A,C extends boolean> extends __SvelteComponentTyped__<ReturnType<__sveltets_Render<A,B,C>['props']>, ReturnType<__sveltets_Render<A,B,C>['events']>, ReturnType<__sveltets_Render<A,B,C>['slots']>> {
get getA() { return __sveltets_2_nonNullable(this.$$prop_def.getA) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -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()))) {
}
}