Skip to content

Commit 7a13025

Browse files
authored
fix: deduplicate definition for rune-mode components (#2759)
Wrap it in ignore comments so they're filtered out #2697
1 parent 3d6e12f commit 7a13025

File tree

38 files changed

+129
-69
lines changed

38 files changed

+129
-69
lines changed

packages/language-server/test/plugins/typescript/TypescriptPlugin.test.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { ignoredBuildDirectories } from '../../../src/plugins/typescript/Snapsho
1818
import { pathToUrl } from '../../../src/utils';
1919
import { serviceWarmup } from './test-utils';
2020
import { internalHelpers } from 'svelte2tsx';
21+
import { VERSION } from 'svelte/compiler';
2122

2223
const testDir = path.join(__dirname, 'testfiles');
2324

@@ -818,4 +819,51 @@ describe('TypescriptPlugin', function () {
818819
after(() => {
819820
__resetCache();
820821
});
822+
823+
const isSvelte5Plus = Number(VERSION.split('.')[0]) >= 5;
824+
if (!isSvelte5Plus) {
825+
return;
826+
}
827+
828+
it('provides definitions from svelte to rune-mode svelte doc', async () => {
829+
const { plugin, document } = setup('definition/definition-rune.svelte');
830+
831+
const definitions = await plugin.getDefinitions(document, Position.create(4, 3));
832+
833+
assert.deepStrictEqual(definitions, [
834+
{
835+
originSelectionRange: {
836+
start: {
837+
character: 1,
838+
line: 4
839+
},
840+
end: {
841+
character: 13,
842+
line: 4
843+
}
844+
},
845+
targetRange: {
846+
start: {
847+
character: 1,
848+
line: 0
849+
},
850+
end: {
851+
character: 1,
852+
line: 0
853+
}
854+
},
855+
targetSelectionRange: {
856+
start: {
857+
character: 1,
858+
line: 0
859+
},
860+
end: {
861+
character: 1,
862+
line: 0
863+
}
864+
},
865+
targetUri: getUri('definition/imported-rune.svelte')
866+
}
867+
]);
868+
});
821869
});
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<script lang="ts">
2+
import ImportedRune from './imported-rune.svelte';
3+
</script>
4+
5+
<ImportedRune></ImportedRune>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<script lang="ts">
2+
let {} = $props();
3+
</script>

packages/svelte2tsx/src/svelte2tsx/addComponentExport.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,11 @@ declare function $$__sveltets_2_isomorphic_component<
260260
if (exportedNames.usesRunes() && !usesSlots && !events.hasEvents()) {
261261
statement =
262262
`\n${doc}const ${componentName} = __sveltets_2_fn_component(${internalHelpers.renderName}());\n` +
263-
`type ${componentName} = ReturnType<typeof ${componentName}>;\n` +
263+
// Surround the type with ignore comments so it is filtered out from go-to-definition etc,
264+
// which for some editors can cause duplicates
265+
surroundWithIgnoreComments(
266+
`type ${componentName} = ReturnType<typeof ${componentName}>;\n`
267+
) +
264268
`export default ${componentName};`;
265269
} else {
266270
statement =

packages/svelte2tsx/test/svelte2tsx/samples/export-list-runes.v5/expectedv2.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,5 @@ async () => { { svelteHTML.createElement("svelte:options", {"runes":true,});}
2222
};
2323
return { props: /** @type {Record<string, never>} */ ({}), exports: /** @type {{name1: typeof name1,name2: typeof name2,renamed1: typeof rename1,renamed2: typeof rename2,Foo: typeof Foo,bar: typeof bar,baz: typeof baz,RenamedFoo: typeof RenameFoo,renamedbar: typeof renamebar,renamedbaz: typeof renamebaz}} */ ({}), bindings: __sveltets_$$bindings(''), slots: {}, events: {} }}
2424
const Input__SvelteComponent_ = __sveltets_2_fn_component($$render());
25-
type Input__SvelteComponent_ = ReturnType<typeof Input__SvelteComponent_>;
26-
export default Input__SvelteComponent_;
25+
/*Ωignore_startΩ*/type Input__SvelteComponent_ = ReturnType<typeof Input__SvelteComponent_>;
26+
/*Ωignore_endΩ*/export default Input__SvelteComponent_;

packages/svelte2tsx/test/svelte2tsx/samples/props-variable-and-$props.id-destructured.v5/expectedv2.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ async () => {
99
id; props;};
1010
return { props: /** @type {$$ComponentProps} */({}), exports: {}, bindings: __sveltets_$$bindings(''), slots: {}, events: {} }}
1111
const Input__SvelteComponent_ = __sveltets_2_fn_component($$render());
12-
type Input__SvelteComponent_ = ReturnType<typeof Input__SvelteComponent_>;
13-
export default Input__SvelteComponent_;
12+
/*Ωignore_startΩ*/type Input__SvelteComponent_ = ReturnType<typeof Input__SvelteComponent_>;
13+
/*Ωignore_endΩ*/export default Input__SvelteComponent_;

packages/svelte2tsx/test/svelte2tsx/samples/props-variable-and-$props.id-spread.v5/expectedv2.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ async () => {
99
id; props;};
1010
return { props: /** @type {$$ComponentProps} */({}), exports: {}, bindings: __sveltets_$$bindings(''), slots: {}, events: {} }}
1111
const Input__SvelteComponent_ = __sveltets_2_fn_component($$render());
12-
type Input__SvelteComponent_ = ReturnType<typeof Input__SvelteComponent_>;
13-
export default Input__SvelteComponent_;
12+
/*Ωignore_startΩ*/type Input__SvelteComponent_ = ReturnType<typeof Input__SvelteComponent_>;
13+
/*Ωignore_endΩ*/export default Input__SvelteComponent_;

packages/svelte2tsx/test/svelte2tsx/samples/props-variable-and-$props.id.v5/expectedv2.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ async () => {
99
id; props;};
1010
return { props: /** @type {$$ComponentProps} */({}), exports: {}, bindings: __sveltets_$$bindings(''), slots: {}, events: {} }}
1111
const Input__SvelteComponent_ = __sveltets_2_fn_component($$render());
12-
type Input__SvelteComponent_ = ReturnType<typeof Input__SvelteComponent_>;
13-
export default Input__SvelteComponent_;
12+
/*Ωignore_startΩ*/type Input__SvelteComponent_ = ReturnType<typeof Input__SvelteComponent_>;
13+
/*Ωignore_endΩ*/export default Input__SvelteComponent_;

packages/svelte2tsx/test/svelte2tsx/samples/renamed-exports-runes.v5/expectedv2.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ async () => { { svelteHTML.createElement("svelte:options", {"runes":true,});}
1010
};
1111
return { props: /** @type {Record<string, never>} */ ({}), exports: /** @type {{name3: typeof name,name4: typeof name2}} */ ({}), bindings: __sveltets_$$bindings(''), slots: {}, events: {} }}
1212
const Input__SvelteComponent_ = __sveltets_2_fn_component($$render());
13-
type Input__SvelteComponent_ = ReturnType<typeof Input__SvelteComponent_>;
14-
export default Input__SvelteComponent_;
13+
/*Ωignore_startΩ*/type Input__SvelteComponent_ = ReturnType<typeof Input__SvelteComponent_>;
14+
/*Ωignore_endΩ*/export default Input__SvelteComponent_;

packages/svelte2tsx/test/svelte2tsx/samples/runes-best-effort-types.v5/expectedv2.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66
async () => {};
77
return { props: /** @type {$$ComponentProps} */({}), exports: {}, bindings: __sveltets_$$bindings('j', 'k'), slots: {}, events: {} }}
88
const Input__SvelteComponent_ = __sveltets_2_fn_component($$render());
9-
type Input__SvelteComponent_ = ReturnType<typeof Input__SvelteComponent_>;
10-
export default Input__SvelteComponent_;
9+
/*Ωignore_startΩ*/type Input__SvelteComponent_ = ReturnType<typeof Input__SvelteComponent_>;
10+
/*Ωignore_endΩ*/export default Input__SvelteComponent_;

0 commit comments

Comments
 (0)