Skip to content

Commit a24d819

Browse files
fix: disambiguate render in module script (#2667)
call it $$render to ensure it's not going to clash with a username, and make it a exported name for better consistency
1 parent 0af4119 commit a24d819

File tree

293 files changed

+691
-659
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

293 files changed

+691
-659
lines changed

packages/language-server/src/plugins/typescript/features/CallHierarchyProvider.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {
2727
toGeneratedSvelteComponentName
2828
} from '../utils';
2929
import { findNodeAtSpan, gatherDescendants, SnapshotMap } from './utils';
30+
import { internalHelpers } from 'svelte2tsx';
3031

3132
const ENSURE_COMPONENT_HELPER = '__sveltets_2_ensureComponent';
3233

@@ -200,7 +201,7 @@ export class CallHierarchyProviderImpl implements CallHierarchyProvider {
200201
.find(
201202
(statement): statement is ts.FunctionDeclaration =>
202203
ts.isFunctionDeclaration(statement) &&
203-
statement.name?.getText() === 'render'
204+
statement.name?.getText() === internalHelpers.renderName
204205
)
205206
?.name?.getStart()
206207
: -1;
@@ -304,7 +305,7 @@ export class CallHierarchyProviderImpl implements CallHierarchyProvider {
304305
return this.toComponentCallHierarchyItem(snapshot, item);
305306
}
306307

307-
if (item.name === 'render') {
308+
if (item.name === internalHelpers.renderName) {
308309
const end = item.selectionSpan.start + item.selectionSpan.length;
309310
const renderFunction = sourceFile.statements.find(
310311
(statement) =>

packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import {
5656
import { DiagnosticCode } from './DiagnosticsProvider';
5757
import { createGetCanonicalFileName } from '../../../utils';
5858
import { LanguageServiceContainer } from '../service';
59+
import { internalHelpers } from 'svelte2tsx';
5960

6061
/**
6162
* TODO change this to protocol constant if it's part of the protocol
@@ -1319,10 +1320,13 @@ export class CodeActionsProviderImpl implements CodeActionsProvider {
13191320
...refactor,
13201321
title: refactor.title
13211322
.replace(
1322-
"Extract to inner function in function 'render'",
1323+
`Extract to inner function in function '${internalHelpers.renderName}'`,
13231324
'Extract to function'
13241325
)
1325-
.replace("Extract to constant in function 'render'", 'Extract to constant')
1326+
.replace(
1327+
`Extract to constant in function '${internalHelpers.renderName}'`,
1328+
'Extract to constant'
1329+
)
13261330
}))
13271331
);
13281332
}

packages/language-server/src/plugins/typescript/features/CodeLensProvider.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { SvelteDocumentSnapshot } from '../DocumentSnapshot';
88
import { LSAndTSDocResolver } from '../LSAndTSDocResolver';
99
import { convertRange } from '../utils';
1010
import { isTextSpanInGeneratedCode } from './utils';
11+
import { internalHelpers } from 'svelte2tsx';
1112

1213
type CodeLensType = 'reference' | 'implementation';
1314

@@ -79,7 +80,9 @@ export class CodeLensProviderImpl implements CodeLensProvider {
7980
}
8081

8182
const navigationTree = lang.getNavigationTree(tsDoc.filePath);
82-
const renderFunction = navigationTree?.childItems?.find((item) => item.text === 'render');
83+
const renderFunction = navigationTree?.childItems?.find(
84+
(item) => item.text === internalHelpers.renderName
85+
);
8386
if (renderFunction) {
8487
// pretty rare that there is anything to show in the template, so we skip it
8588
const notTemplate = renderFunction.childItems?.filter(

packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
import { not, flatten, passMap, swapRangeStartEndIfNecessary, memoize } from '../../../utils';
2525
import { LSConfigManager } from '../../../ls-config';
2626
import { isAttributeName, isEventHandler } from '../svelte-ast-utils';
27+
import { internalHelpers } from 'svelte2tsx';
2728

2829
export enum DiagnosticCode {
2930
MODIFIERS_CANNOT_APPEAR_HERE = 1184, // "Modifiers cannot appear here."
@@ -546,7 +547,8 @@ function get$$PropsDef(lang: ts.LanguageService, snapshot: SvelteDocumentSnapsho
546547

547548
const renderFunction = sourceFile.statements.find(
548549
(statement): statement is ts.FunctionDeclaration =>
549-
ts.isFunctionDeclaration(statement) && statement.name?.getText() === 'render'
550+
ts.isFunctionDeclaration(statement) &&
551+
statement.name?.getText() === internalHelpers.renderName
550552
);
551553
return renderFunction?.body?.statements.find(
552554
(node): node is ts.TypeAliasDeclaration | ts.InterfaceDeclaration =>

packages/language-server/src/plugins/typescript/features/SemanticTokensProvider.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { SvelteDocumentSnapshot } from '../DocumentSnapshot';
1111
import { LSAndTSDocResolver } from '../LSAndTSDocResolver';
1212
import { convertToTextSpan } from '../utils';
1313
import { isInGeneratedCode } from './utils';
14+
import { internalHelpers } from 'svelte2tsx';
1415

1516
const CONTENT_LENGTH_LIMIT = 50000;
1617

@@ -111,7 +112,8 @@ export class SemanticTokensProviderImpl implements SemanticTokensProvider {
111112
if (
112113
isInGeneratedCode(text, generatedOffset, generatedOffset + generatedLength) ||
113114
(encodedClassification === 2817 /* top level function */ &&
114-
text.substring(generatedOffset, generatedOffset + generatedLength) === 'render')
115+
text.substring(generatedOffset, generatedOffset + generatedLength) ===
116+
internalHelpers.renderName)
115117
) {
116118
return;
117119
}

packages/language-server/src/plugins/typescript/features/utils.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { or } from '../../../utils';
1313
import { FileMap } from '../../../lib/documents/fileCollection';
1414
import { LSConfig } from '../../../ls-config';
1515
import { LanguageServiceContainer } from '../service';
16+
import { internalHelpers } from 'svelte2tsx';
1617

1718
type NodePredicate = (node: ts.Node) => boolean;
1819

@@ -299,7 +300,11 @@ function nodeAndParentsSatisfyRespectivePredicates<T extends ts.Node>(
299300

300301
const isRenderFunction = nodeAndParentsSatisfyRespectivePredicates<
301302
ts.FunctionDeclaration & { name: ts.Identifier }
302-
>((node) => ts.isFunctionDeclaration(node) && node?.name?.getText() === 'render', ts.isSourceFile);
303+
>(
304+
(node) =>
305+
ts.isFunctionDeclaration(node) && node?.name?.getText() === internalHelpers.renderName,
306+
ts.isSourceFile
307+
);
303308

304309
const isRenderFunctionBody = nodeAndParentsSatisfyRespectivePredicates(
305310
ts.isBlock,
@@ -309,11 +314,11 @@ const isRenderFunctionBody = nodeAndParentsSatisfyRespectivePredicates(
309314
export const isReactiveStatement = nodeAndParentsSatisfyRespectivePredicates<ts.LabeledStatement>(
310315
(node) => ts.isLabeledStatement(node) && node.label.getText() === '$',
311316
or(
312-
// function render() {
317+
// function $$render() {
313318
// $: x2 = __sveltets_2_invalidate(() => x * x)
314319
// }
315320
isRenderFunctionBody,
316-
// function render() {
321+
// function $$render() {
317322
// ;() => {$: x, update();
318323
// }
319324
nodeAndParentsSatisfyRespectivePredicates(

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { __resetCache } from '../../../src/plugins/typescript/service';
1717
import { ignoredBuildDirectories } from '../../../src/plugins/typescript/SnapshotManager';
1818
import { pathToUrl } from '../../../src/utils';
1919
import { serviceWarmup } from './test-utils';
20+
import { internalHelpers } from 'svelte2tsx';
2021

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

@@ -89,7 +90,7 @@ describe('TypescriptPlugin', function () {
8990
}
9091
}
9192
},
92-
containerName: 'render'
93+
containerName: internalHelpers.renderName
9394
},
9495
{
9596
name: 'hello',
@@ -107,7 +108,7 @@ describe('TypescriptPlugin', function () {
107108
}
108109
}
109110
},
110-
containerName: 'render'
111+
containerName: internalHelpers.renderName
111112
},
112113
{
113114
name: "$: if (hello) {\n console.log('hi');\n }",
@@ -125,7 +126,7 @@ describe('TypescriptPlugin', function () {
125126
}
126127
}
127128
},
128-
containerName: 'render'
129+
containerName: internalHelpers.renderName
129130
},
130131
{
131132
name: '$on("click") callback',

packages/language-server/test/plugins/typescript/features/CodeActionsProvider.test.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { pathToUrl } from '../../../../src/utils';
2222
import { recursiveServiceWarmup } from '../test-utils';
2323
import { DiagnosticCode } from '../../../../src/plugins/typescript/features/DiagnosticsProvider';
2424
import { VERSION } from 'svelte/compiler';
25+
import { internalHelpers } from 'svelte2tsx';
2526

2627
const testDir = path.join(__dirname, '..');
2728
const indent = ' '.repeat(4);
@@ -1880,8 +1881,8 @@ describe('CodeActionsProvider', function () {
18801881
},
18811882
// is from generated code
18821883
textRange: {
1883-
pos: 179,
1884-
end: 213
1884+
pos: 181,
1885+
end: 215
18851886
}
18861887
}
18871888
],
@@ -2028,13 +2029,13 @@ describe('CodeActionsProvider', function () {
20282029
},
20292030
// is from generated code
20302031
textRange: {
2031-
pos: 179,
2032-
end: 213
2032+
pos: 181,
2033+
end: 215
20332034
}
20342035
}
20352036
],
20362037
command: 'function_scope_0',
2037-
title: "Extract to inner function in function 'render'"
2038+
title: `Extract to inner function in function '${internalHelpers.renderName}'`
20382039
},
20392040
title: 'Extract to function'
20402041
});

packages/svelte2tsx/index.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ export const internalHelpers: {
174174
hasTypeDefinition: boolean;
175175
}
176176
>,
177+
renderName: string
177178
};
178179

179180
/**
@@ -194,4 +195,4 @@ export namespace InternalHelpers {
194195
universalHooksPath: string;
195196
paramsPath: string;
196197
}
197-
}
198+
}

packages/svelte2tsx/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "svelte2tsx",
3-
"version": "0.7.25",
3+
"version": "0.7.35",
44
"description": "Convert Svelte components to TSX for type checking",
55
"author": "David Pershouse",
66
"license": "MIT",

packages/svelte2tsx/repl/index.svelte

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
<input bind:value={get, set} />
2-
<input bind:value={() => v, new_v => v = new_v} />
1+
<script module lang="ts">
2+
let foo = true;
3+
</script>
34

4-
<div bind:clientWidth={null, set} />
5-
<div bind:contentRect={null, set} />
5+
{#snippet hoistable1()}
6+
<div>hello</div>
7+
{/snippet}
68

7-
<Input bind:value={get, set} />
8-
<Input bind:value={() => v, new_v => v = new_v} />
9+
{#snippet hoistable2()}
10+
<div>{foo}</div>
11+
{/snippet}

packages/svelte2tsx/src/helpers/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,6 @@ export const internalHelpers = {
2525
toVirtualPos,
2626
toOriginalPos,
2727
findExports,
28-
get_global_types
28+
get_global_types,
29+
renderName: '$$render'
2930
};

packages/svelte2tsx/src/svelte2tsx/addComponentExport.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { ComponentDocumentation } from './nodes/ComponentDocumentation';
66
import { Generics } from './nodes/Generics';
77
import { surroundWithIgnoreComments } from '../utils/ignore';
88
import { ComponentEvents } from './nodes/ComponentEvents';
9+
import { internalHelpers } from '../helpers';
910

1011
export interface AddComponentExportPara {
1112
str: MagicString;
@@ -71,29 +72,29 @@ function addGenericsComponentExport({
7172
let statement = `
7273
class __sveltets_Render${genericsDef} {
7374
props() {
74-
return ${props(true, canHaveAnyProp, exportedNames, `render${genericsRef}()`)}.props;
75+
return ${props(true, canHaveAnyProp, exportedNames, `${internalHelpers.renderName}${genericsRef}()`)}.props;
7576
}
7677
events() {
77-
return ${_events(events.hasStrictEvents() || exportedNames.usesRunes(), `render${genericsRef}()`)}.events;
78+
return ${_events(events.hasStrictEvents() || exportedNames.usesRunes(), `${internalHelpers.renderName}${genericsRef}()`)}.events;
7879
}
7980
slots() {
80-
return render${genericsRef}().slots;
81+
return ${internalHelpers.renderName}${genericsRef}().slots;
8182
}
8283
`;
8384

8485
// For Svelte 5+ we assume TS > 4.7
8586
if (isSvelte5 && !isTsFile && exportedNames.usesRunes()) {
8687
statement = `
8788
class __sveltets_Render${genericsDef} {
88-
props(): ReturnType<typeof render${genericsRef}>['props'] { return null as any; }
89-
events(): ReturnType<typeof render${genericsRef}>['events'] { return null as any; }
90-
slots(): ReturnType<typeof render${genericsRef}>['slots'] { return null as any; }
89+
props(): ReturnType<typeof ${internalHelpers.renderName}${genericsRef}>['props'] { return null as any; }
90+
events(): ReturnType<typeof ${internalHelpers.renderName}${genericsRef}>['events'] { return null as any; }
91+
slots(): ReturnType<typeof ${internalHelpers.renderName}${genericsRef}>['slots'] { return null as any; }
9192
`;
9293
}
9394

9495
statement += isSvelte5
9596
? ` bindings() { return ${exportedNames.createBindingsStr()}; }
96-
exports() { return ${exportedNames.hasExports() ? `render${genericsRef}().exports` : '{}'}; }
97+
exports() { return ${exportedNames.hasExports() ? `${internalHelpers.renderName}${genericsRef}().exports` : '{}'}; }
9798
}\n`
9899
: '}\n';
99100

@@ -181,7 +182,7 @@ function addSimpleComponentExport({
181182
isTsFile,
182183
canHaveAnyProp,
183184
exportedNames,
184-
_events(events.hasStrictEvents(), 'render()')
185+
_events(events.hasStrictEvents(), `${internalHelpers.renderName}()`)
185186
);
186187

187188
const doc = componentDocumentation.getFormatted();
@@ -192,7 +193,7 @@ function addSimpleComponentExport({
192193
if (mode === 'dts') {
193194
if (isSvelte5 && exportedNames.usesRunes() && !usesSlots && !events.hasEvents()) {
194195
statement =
195-
`\n${doc}const ${componentName} = __sveltets_2_fn_component(render());\n` +
196+
`\n${doc}const ${componentName} = __sveltets_2_fn_component(${internalHelpers.renderName}());\n` +
196197
`type ${componentName} = ReturnType<typeof ${componentName}>;\n` +
197198
`export default ${componentName};`;
198199
} else if (isSvelte5) {
@@ -258,7 +259,7 @@ declare function $$__sveltets_2_isomorphic_component<
258259
if (isSvelte5) {
259260
if (exportedNames.usesRunes() && !usesSlots && !events.hasEvents()) {
260261
statement =
261-
`\n${doc}const ${componentName} = __sveltets_2_fn_component(render());\n` +
262+
`\n${doc}const ${componentName} = __sveltets_2_fn_component(${internalHelpers.renderName}());\n` +
262263
`type ${componentName} = ReturnType<typeof ${componentName}>;\n` +
263264
`export default ${componentName};`;
264265
} else {

packages/svelte2tsx/src/svelte2tsx/createRenderFunction.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
IGNORE_START_COMMENT,
88
surroundWithIgnoreComments
99
} from '../utils/ignore';
10+
import { internalHelpers } from '../helpers';
1011

1112
export interface CreateRenderFunctionPara extends InstanceScriptProcessResult {
1213
str: MagicString;
@@ -75,7 +76,8 @@ export function createRenderFunction({
7576
start++;
7677
end--;
7778
}
78-
str.overwrite(scriptTag.start + 1, start - 1, `function render`);
79+
80+
str.overwrite(scriptTag.start + 1, start - 1, `function ${internalHelpers.renderName}`);
7981
str.overwrite(start - 1, start, isTsFile ? '<' : `<${IGNORE_START_COMMENT}`); // if the generics are unused, only this char is colored opaque
8082
str.overwrite(
8183
end,
@@ -86,7 +88,7 @@ export function createRenderFunction({
8688
str.overwrite(
8789
scriptTag.start + 1,
8890
scriptTagEnd,
89-
`function render${generics.toDefinitionString(true)}() {${propsDecl}\n`
91+
`function ${internalHelpers.renderName}${generics.toDefinitionString(true)}() {${propsDecl}\n`
9092
);
9193
}
9294

@@ -98,7 +100,8 @@ export function createRenderFunction({
98100
} else {
99101
str.prependRight(
100102
scriptDestination,
101-
`;function render() {` + `${propsDecl}${slotsDeclaration}\nasync () => {`
103+
`;function ${internalHelpers.renderName}() {` +
104+
`${propsDecl}${slotsDeclaration}\nasync () => {`
102105
);
103106
}
104107

packages/svelte2tsx/src/svelte2tsx/nodes/ExportedNames.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,10 @@ export class ExportedNames {
506506
if (this.usesRunes()) {
507507
// In runes mode, exports are no longer part of props
508508
return Array.from(this.getters)
509-
.map((name) => `\n get ${name}() { return render${generics}().exports.${name} }`)
509+
.map(
510+
(name) =>
511+
`\n get ${name}() { return ${internalHelpers.renderName}${generics}().exports.${name} }`
512+
)
510513
.join('');
511514
} else {
512515
return Array.from(this.getters)

packages/svelte2tsx/src/svelte2tsx/processModuleScriptTag.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export function createModuleAst(str: MagicString, script: Node): ModuleAst {
2525
true,
2626
ts.ScriptKind.TS
2727
);
28+
2829
const astOffset = script.content.start;
2930

3031
return { htmlx, tsAst, astOffset };

packages/svelte2tsx/test/emitDts/samples/typescript-declarationMap/expected/Test.svelte.d.ts.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)