From ab36d060032e509c2f9980407eaed399de211e20 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 29 May 2022 22:01:47 +0200 Subject: [PATCH 01/16] go to definition --- .../plugins/typescript/TypeScriptPlugin.ts | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts b/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts index 386936026..352c95da0 100644 --- a/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts +++ b/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts @@ -335,19 +335,29 @@ export class TypeScriptPlugin const result = await Promise.all( defs.definitions.map(async (def) => { + if (def.fileName.endsWith('svelte-shims.d.ts')) { + return; + } + const { fragment, snapshot } = await docs.retrieve(def.fileName); - if ( - !def.fileName.endsWith('svelte-shims.d.ts') && - isNoTextSpanInGeneratedCode(snapshot.getFullText(), def.textSpan) - ) { - return LocationLink.create( - pathToUrl(def.fileName), - convertToLocationRange(fragment, def.textSpan), - convertToLocationRange(fragment, def.textSpan), - convertToLocationRange(mainFragment, defs.textSpan) - ); + if (!isNoTextSpanInGeneratedCode(snapshot.getFullText(), def.textSpan)) { + if (snapshot.getFullText().charAt(def.textSpan.start) !== '$') { + return; + } + // there will be exactly one definition, the store + def = lang.getDefinitionAndBoundSpan( + tsDoc.filePath, + tsDoc.getFullText().indexOf(');', def.textSpan.start) - 1 + )!.definitions![0]; } + + return LocationLink.create( + pathToUrl(def.fileName), + convertToLocationRange(fragment, def.textSpan), + convertToLocationRange(fragment, def.textSpan), + convertToLocationRange(mainFragment, defs.textSpan) + ); }) ); return result.filter(isNotNullOrUndefined); From 111fc7950028b154fc7f14e26e16981eca446495 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 29 May 2022 22:08:50 +0200 Subject: [PATCH 02/16] remove comma commands store transformation --- packages/svelte2tsx/src/svelte2tsx/index.ts | 4 +- .../svelte2tsx/src/svelte2tsx/nodes/Stores.ts | 111 ++-------------- .../processInstanceScriptContent.ts | 118 +----------------- .../samples/action-directive/mappings.jsx | 16 +-- .../samples/await-block/mappings.jsx | 8 +- .../samples/event-binding/mappings.jsx | 22 ++-- .../sourcemaps/samples/if-block/mappings.jsx | 8 +- .../samples/reactive-statements/mappings.jsx | 8 +- .../samples/$store-as-directive/expected.tsx | 10 +- .../samples/$store-as-directive/expectedv2.ts | 2 +- .../samples/$store-assign/expected.tsx | 26 ++-- .../samples/$store-assign/expectedv2.ts | 26 ++-- .../samples/$store-index/expected.tsx | 2 +- .../samples/$store-index/expectedv2.ts | 2 +- .../expected.tsx | 18 +-- .../expectedv2.ts | 18 +-- .../expected.tsx | 4 +- .../expectedv2.ts | 4 +- .../samples/$store-prop-init/expected.tsx | 4 +- .../samples/$store-prop-init/expectedv2.ts | 4 +- .../samples/ast-offset-none/expected.tsx | 2 +- .../samples/ast-offset-none/expectedv2.ts | 2 +- .../samples/ast-offset-some/expected.tsx | 2 +- .../samples/ast-offset-some/expectedv2.ts | 2 +- .../samples/await-with-$store/expected.tsx | 2 +- .../samples/await-with-$store/expectedv2.ts | 2 +- .../binding-assignment-$store/expected.tsx | 12 +- .../binding-assignment-$store/expectedv2.ts | 12 +- .../samples/binding-group-store/expected.tsx | 2 +- .../samples/binding-group-store/expectedv2.ts | 2 +- .../component-slot-object-key/expected.tsx | 2 +- .../component-slot-object-key/expectedv2.ts | 2 +- .../expected.tsx | 8 +- .../expectedv2.ts | 2 +- .../samples/debug-block/expected.tsx | 4 +- .../samples/debug-block/expectedv2.ts | 4 +- .../nested-$-variables-script/expected.tsx | 8 +- .../nested-$-variables-script/expectedv2.ts | 8 +- .../nested-$-variables-template/expected.tsx | 8 +- .../nested-$-variables-template/expectedv2.ts | 8 +- .../expected.tsx | 16 +-- .../expectedv2.ts | 16 +-- .../reactive-statements-store/expected.tsx | 16 +-- .../reactive-statements-store/expectedv2.ts | 16 +-- .../samples/reactive-store-set/expected.tsx | 2 +- .../samples/reactive-store-set/expectedv2.ts | 2 +- .../samples/store-destructuring/expected.tsx | 10 +- .../samples/store-destructuring/expectedv2.ts | 10 +- .../samples/store-from-module/expected.tsx | 8 +- .../samples/store-from-module/expectedv2.ts | 8 +- .../expected.tsx | 6 +- .../expectedv2.ts | 6 +- .../samples/store-import/expected.tsx | 6 +- .../samples/store-import/expectedv2.ts | 6 +- .../store-property-access/expected.tsx | 36 +++--- .../store-property-access/expectedv2.ts | 36 +++--- .../samples/stores-mustache/expected.tsx | 2 +- .../samples/stores-mustache/expectedv2.ts | 2 +- .../uses-$store-in-event-binding/expected.tsx | 4 +- .../expectedv2.ts | 4 +- .../expected.tsx | 20 +-- .../expectedv2.ts | 20 +-- .../expected.tsx | 48 +++---- .../expectedv2.ts | 48 +++---- .../uses-$store-with-increments/expected.tsx | 10 +- .../uses-$store-with-increments/expectedv2.ts | 10 +- .../expected.tsx | 16 +-- .../expectedv2.ts | 16 +-- .../samples/uses-$store/expected.tsx | 4 +- .../samples/uses-$store/expectedv2.ts | 4 +- 70 files changed, 357 insertions(+), 560 deletions(-) diff --git a/packages/svelte2tsx/src/svelte2tsx/index.ts b/packages/svelte2tsx/src/svelte2tsx/index.ts index 5073f1c4e..5bb42436a 100644 --- a/packages/svelte2tsx/src/svelte2tsx/index.ts +++ b/packages/svelte2tsx/src/svelte2tsx/index.ts @@ -71,7 +71,7 @@ function processSvelteTemplate( //which prevents us just changing all instances of Identity that start with $ const scopeStack = new ScopeStack(); - const stores = new Stores(scopeStack, str, isDeclaration); + const stores = new Stores(scopeStack, isDeclaration); const scripts = new Scripts(htmlxAst); const handleSvelteOptions = (node: Node) => { @@ -285,7 +285,7 @@ function processSvelteTemplate( scripts.blankOtherScriptTags(str); //resolve stores - const resolvedStores = stores.resolveStores(); + const resolvedStores = stores.getStoreNames(); return { htmlAst: htmlxAst, diff --git a/packages/svelte2tsx/src/svelte2tsx/nodes/Stores.ts b/packages/svelte2tsx/src/svelte2tsx/nodes/Stores.ts index b782e2b25..c1adf41a2 100644 --- a/packages/svelte2tsx/src/svelte2tsx/nodes/Stores.ts +++ b/packages/svelte2tsx/src/svelte2tsx/nodes/Stores.ts @@ -1,103 +1,20 @@ -import MagicString from 'magic-string'; import { Node } from 'estree-walker'; -import { ScopeStack, Scope } from '../utils/Scope'; -import { isObjectKey, isMember } from '../../utils/svelteAst'; -import { assignmentBindings } from '../../htmlxtojsx/nodes/binding'; - -export function handleStore(node: Node, parent: Node, str: MagicString): void { - const storename = node.name.slice(1); - - //handle assign to - if (parent.type == 'AssignmentExpression' && parent.left == node && parent.operator == '=') { - const dollar = str.original.indexOf('$', node.start); - str.remove(dollar, dollar + 1); - str.overwrite(node.end, str.original.indexOf('=', node.end) + 1, '.set('); - str.appendLeft(parent.end, ')'); - return; - } - - // handle Assignment operators ($store +=, -=, *=, /=, %=, **=, etc.) - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators#Assignment - const operators = ['+=', '-=', '*=', '/=', '%=', '**=', '<<=', '>>=', '>>>=', '&=', '^=', '|=']; - if ( - parent.type == 'AssignmentExpression' && - parent.left == node && - operators.includes(parent.operator) - ) { - const storename = node.name.slice(1); // drop the $ - const operator = parent.operator.substring(0, parent.operator.length - 1); // drop the = sign - str.overwrite( - parent.start, - str.original.indexOf('=', node.end) + 1, - `${storename}.set( $${storename} ${operator}` - ); - str.appendLeft(parent.end, ')'); - return; - } - - // handle $store++, $store--, ++$store, --$store - if (parent.type == 'UpdateExpression') { - let simpleOperator; - if (parent.operator === '++') { - simpleOperator = '+'; - } - if (parent.operator === '--') { - simpleOperator = '-'; - } - if (simpleOperator) { - const storename = node.name.slice(1); // drop the $ - str.overwrite( - parent.start, - parent.end, - `(${storename}.set( $${storename} ${simpleOperator} 1), $${storename})` - ); - } else { - console.warn( - `Warning - unrecognized UpdateExpression operator ${parent.operator}! - This is an edge case unaccounted for in svelte2tsx, please file an issue: - https://github.com/sveltejs/language-tools/issues/new/choose - `, - str.original.slice(parent.start, parent.end) - ); - } - return; - } - - const dollar = str.original.indexOf('$', node.start); - - // handle bindings which are transformed to assignments. These need special treatment because - // `(__sveltets_1_store_get(foo), foo$) = something` is syntactically invalid - // Therefore remove the outer commas. Note: This relies on the binding expression wrapping - // this statement with __sveltets_1_empty - if (parent.type === 'Binding' && assignmentBindings.has(parent.name)) { - str.overwrite(dollar, dollar + 1, '__sveltets_1_store_get(', { contentOnly: true }); - str.prependLeft(node.end, `), $${storename}`); - return; - } - - // we change "$store" references into "(__sveltets_1_store_get(store), $store)" - // - in order to get ts errors if store is not assignable to SvelteStore - // - use $store variable defined above to get ts flow control - str.overwrite(dollar, dollar + 1, '(__sveltets_1_store_get(', { contentOnly: true }); - str.prependLeft(node.end, `), $${storename})`); -} +import MagicString from 'magic-string'; +import { isMember, isObjectKey } from '../../utils/svelteAst'; +import { Scope, ScopeStack } from '../utils/Scope'; -type PendingStoreResolution = { - node: T; - parent: T; +type PossibleStore = { + node: Node; + parent: Node; scope: Scope; }; const reservedNames = new Set(['$$props', '$$restProps', '$$slots']); export class Stores { - pendingStoreResolutions: Array> = []; + possibleStores: PossibleStore[] = []; - constructor( - private scope: ScopeStack, - private str: MagicString, - private isDeclaration: { value: boolean } - ) {} + constructor(private scope: ScopeStack, private isDeclaration: { value: boolean }) {} handleDirective(node: Node, str: MagicString): void { if (this.notAStore(node.name) || this.isDeclaration.value) { @@ -106,7 +23,7 @@ export class Stores { const start = str.original.indexOf('$', node.start); const end = start + node.name.length; - this.pendingStoreResolutions.push({ + this.possibleStores.push({ node: { type: 'Identifier', start, end, name: node.name }, parent: { start: 0, end: 0, type: '' }, scope: this.scope.current @@ -131,21 +48,19 @@ export class Stores { if (isObjectKey(parent, prop)) { return; } - this.pendingStoreResolutions.push({ node, parent, scope: this.scope.current }); + this.possibleStores.push({ node, parent, scope: this.scope.current }); } } - resolveStores(): string[] { - const unresolvedStores = this.pendingStoreResolutions.filter(({ node, scope }) => { + getStoreNames(): string[] { + const stores = this.possibleStores.filter(({ node, scope }) => { const name = node.name; // if variable starting with '$' was manually declared by the user, // this isn't a store access. return !scope.hasDefined(name); }); - unresolvedStores.forEach(({ node, parent }) => handleStore(node, parent, this.str)); - - return unresolvedStores.map(({ node }) => node.name.slice(1)); + return stores.map(({ node }) => node.name.slice(1)); } private notAStore(name: string): boolean { diff --git a/packages/svelte2tsx/src/svelte2tsx/processInstanceScriptContent.ts b/packages/svelte2tsx/src/svelte2tsx/processInstanceScriptContent.ts index 6fe43bb10..bf9dc634e 100644 --- a/packages/svelte2tsx/src/svelte2tsx/processInstanceScriptContent.ts +++ b/packages/svelte2tsx/src/svelte2tsx/processInstanceScriptContent.ts @@ -1,11 +1,7 @@ import MagicString from 'magic-string'; import { Node } from 'estree-walker'; import * as ts from 'typescript'; -import { - getBinaryAssignmentExpr, - isSafeToPrefixWithSemicolon, - isNotPropertyNameOfImport -} from './utils/tsAst'; +import { getBinaryAssignmentExpr, isNotPropertyNameOfImport } from './utils/tsAst'; import { ExportedNames, is$$PropsDeclaration } from './nodes/ExportedNames'; import { ImplicitTopLevelNames } from './nodes/ImplicitTopLevelNames'; import { ComponentEvents, is$$EventsDeclaration } from './nodes/ComponentEvents'; @@ -72,116 +68,8 @@ export function processInstanceScriptContent( const pushScope = () => (scope = new Scope(scope)); const popScope = () => (scope = scope.parent); - const handleStore = (ident: ts.Identifier, parent: ts.Node) => { - // ignore "typeof $store" - if (parent && parent.kind === ts.SyntaxKind.TypeQuery) { - return; - } - // ignore break - if (parent && parent.kind === ts.SyntaxKind.BreakStatement) { - return; - } - - const storename = ident.getText().slice(1); // drop the $ - // handle assign to - if ( - parent && - ts.isBinaryExpression(parent) && - parent.operatorToken.kind == ts.SyntaxKind.EqualsToken && - parent.left == ident - ) { - //remove $ - const dollar = str.original.indexOf('$', ident.getStart() + astOffset); - str.remove(dollar, dollar + 1); - // replace = with .set( - str.overwrite(ident.end + astOffset, parent.operatorToken.end + astOffset, '.set('); - // append ) - str.appendLeft(parent.end + astOffset, ')'); - return; - } - - // handle Assignment operators ($store +=, -=, *=, /=, %=, **=, etc.) - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators#Assignment - const operators = { - [ts.SyntaxKind.PlusEqualsToken]: '+', - [ts.SyntaxKind.MinusEqualsToken]: '-', - [ts.SyntaxKind.AsteriskEqualsToken]: '*', - [ts.SyntaxKind.SlashEqualsToken]: '/', - [ts.SyntaxKind.PercentEqualsToken]: '%', - [ts.SyntaxKind.AsteriskAsteriskEqualsToken]: '**', - [ts.SyntaxKind.LessThanLessThanEqualsToken]: '<<', - [ts.SyntaxKind.GreaterThanGreaterThanEqualsToken]: '>>', - [ts.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken]: '>>>', - [ts.SyntaxKind.AmpersandEqualsToken]: '&', - [ts.SyntaxKind.CaretEqualsToken]: '^', - [ts.SyntaxKind.BarEqualsToken]: '|' - }; - if ( - ts.isBinaryExpression(parent) && - parent.left == ident && - Object.keys(operators).find((x) => x === String(parent.operatorToken.kind)) - ) { - const operator = operators[parent.operatorToken.kind]; - str.overwrite( - parent.getStart() + astOffset, - str.original.indexOf('=', ident.end + astOffset) + 1, - `${storename}.set( $${storename} ${operator}` - ); - str.appendLeft(parent.end + astOffset, ')'); - return; - } - // handle $store++, $store--, ++$store, --$store - if ( - (ts.isPrefixUnaryExpression(parent) || ts.isPostfixUnaryExpression(parent)) && - ![ - ts.SyntaxKind.ExclamationToken, // !$store - ts.SyntaxKind.PlusToken, // +$store - ts.SyntaxKind.MinusToken, // -$store - ts.SyntaxKind.TildeToken // ~$store - ].includes(parent.operator) /* `!$store` etc does not need processing */ - ) { - let simpleOperator: string; - if (parent.operator === ts.SyntaxKind.PlusPlusToken) { - simpleOperator = '+'; - } - if (parent.operator === ts.SyntaxKind.MinusMinusToken) { - simpleOperator = '-'; - } - - if (simpleOperator) { - str.overwrite( - parent.getStart() + astOffset, - parent.end + astOffset, - `(${storename}.set( $${storename} ${simpleOperator} 1), $${storename})` - ); - return; - } else { - console.warn( - `Warning - unrecognized UnaryExpression operator ${parent.operator}! - This is an edge case unaccounted for in svelte2tsx, please file an issue: - https://github.com/sveltejs/language-tools/issues/new/choose - `, - parent.getText() - ); - } - } - - // we change "$store" references into "(__sveltets_1_store_get(store), $store)" - // - in order to get ts errors if store is not assignable to SvelteStore - // - use $store variable defined above to get ts flow control - const dollar = str.original.indexOf('$', ident.getStart() + astOffset); - const getPrefix = isSafeToPrefixWithSemicolon(ident) - ? ';' - : ts.isShorthandPropertyAssignment(parent) - ? // { $store } --> { $store: __sveltets_1_store_get(..)} - ident.text + ': ' - : ''; - str.overwrite(dollar, dollar + 1, getPrefix + '(__sveltets_1_store_get('); - str.prependLeft(ident.end + astOffset, `), $${storename})`); - }; - const resolveStore = (pending: PendingStoreResolution) => { - let { node, parent, scope } = pending; + let { node, scope } = pending; const name = (node as ts.Identifier).text; while (scope) { if (scope.declared.has(name)) { @@ -190,8 +78,6 @@ export function processInstanceScriptContent( } scope = scope.parent; } - //We haven't been resolved, we must be a store read/write, handle it. - handleStore(node, parent); const storename = node.getText().slice(1); implicitStoreValues.addStoreAcess(storename); }; diff --git a/packages/svelte2tsx/test/sourcemaps/samples/action-directive/mappings.jsx b/packages/svelte2tsx/test/sourcemaps/samples/action-directive/mappings.jsx index 27e5312f9..c0a9ae6a4 100644 --- a/packages/svelte2tsx/test/sourcemaps/samples/action-directive/mappings.jsx +++ b/packages/svelte2tsx/test/sourcemaps/samples/action-directive/mappings.jsx @@ -29,11 +29,11 @@ @@ -55,12 +55,8 @@ ╚u action= {•↲ ╚use:action={{•↲ [original] line 18 ------------------------------------------------------------------------------------------------------------------------------------------------------ */} - ...leet, {/** ------------------------------------------------------------------------------------------------------------------------------------------------------- */} - foo: (__sveltets_1_store_get(bar), $bar) {/** - ╚╚foo:•(__sveltets_1_store_get(bar),•$bar)↲ [generated] line 22 - ╚╚foo:•$ bar ↲ - ╚╚foo:•$bar↲ [original] line 20 + ...leet, + foo: $bar {/** ------------------------------------------------------------------------------------------------------------------------------------------------------ */} })))} {/** ╚})))}↲ [generated] line 23 diff --git a/packages/svelte2tsx/test/sourcemaps/samples/await-block/mappings.jsx b/packages/svelte2tsx/test/sourcemaps/samples/await-block/mappings.jsx index 8186261c2..8cb732128 100644 --- a/packages/svelte2tsx/test/sourcemaps/samples/await-block/mappings.jsx +++ b/packages/svelte2tsx/test/sourcemaps/samples/await-block/mappings.jsx @@ -43,11 +43,11 @@ ------------------------------------------------------------------------------------------------------------------------------------------------------ */} {/** ------------------------------------------------------------------------------------------------------------------------------------------------------ */} -{() => {let _$$p = ((__sveltets_1_store_get(promise), $promise)); <> {/** -{()•=>•{let•_$$p•=•((__sveltets_1_store_get(promise),•$promise));•<>↲ [generated] line 13 -{ $ promise } ↲ +{() => {let _$$p = ($promise); <> {/** +{()•=>•{let•_$$p•=•($promise);•<>↲ [generated] line 13 +{ $promise} ↲ { $promise}↲ -{#await•$promise}↲ [original] line 11 +{#await•$promise}↲ [original] line 11 ------------------------------------------------------------------------------------------------------------------------------------------------------ */} {/** ------------------------------------------------------------------------------------------------------------------------------------------------------ */} diff --git a/packages/svelte2tsx/test/sourcemaps/samples/event-binding/mappings.jsx b/packages/svelte2tsx/test/sourcemaps/samples/event-binding/mappings.jsx index ceee71266..2e8667461 100644 --- a/packages/svelte2tsx/test/sourcemaps/samples/event-binding/mappings.jsx +++ b/packages/svelte2tsx/test/sourcemaps/samples/event-binding/mappings.jsx @@ -1,19 +1,19 @@ /// <>;function render() { {/** ------------------------------------------------------------------------------------------------------------------------------------------------------ */} -<>{/*Ωignore_startΩ*/new Component({target: __sveltets_1_any(''), props: {}})/*Ωignore_endΩ*/.$on('click', (__sveltets_1_store_get(check), $check) ? method1 : method2)}{/** -=# Originless mappings -<>{/*Ωignore_startΩ*/new•Component({target:•__sveltets_1_any(''),•props:•{}})/*Ωignore_endΩ*/.$on('click',•(__sveltets_1_store_get(check),•$check)•?•method1•:•method2)}↲ [generated] line 3 - on: click= $ check •?•method1•:•method2} ↲ - #============================================================================================= Order-breaking mappings -↲ -↲ [original] line 1 +<>{/*Ωignore_startΩ*/new Component({target: __sveltets_1_any(''), props: {}})/*Ωignore_endΩ*/.$on('click', $check ? method1 : method2)} {/** +=# Originless mappings +<>{/*Ωignore_startΩ*/new•Component({target:•__sveltets_1_any(''),•props:•{}})/*Ωignore_endΩ*/.$on('click',•$check•?•method1•:•method2)}↲ [generated] line 3 + on: click= $check•?•method1•:•method2} ↲ + #============================================================================================= Order-breaking mappings +↲ +↲ [original] line 1 ------------------------------------------------------------------------------------------------------------------------------------------------------ */} - {/** -Bla↲ [generated] line 4 -Bla + {/** +Bla↲ [generated] line 4 +Bla Bla -Bla [original] line 2 +Bla [original] line 2 ------------------------------------------------------------------------------------------------------------------------------------------------------ */} return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/sourcemaps/samples/if-block/mappings.jsx b/packages/svelte2tsx/test/sourcemaps/samples/if-block/mappings.jsx index 54a498eb5..a9debcae5 100644 --- a/packages/svelte2tsx/test/sourcemaps/samples/if-block/mappings.jsx +++ b/packages/svelte2tsx/test/sourcemaps/samples/if-block/mappings.jsx @@ -18,11 +18,11 @@ ------------------------------------------------------------------------------------------------------------------------------------------------------ */} {/** ------------------------------------------------------------------------------------------------------------------------------------------------------ */} -{((__sveltets_1_store_get(foo), $foo)) ? <> : <>} {/** -{((__sveltets_1_store_get(foo),•$foo))•?•<>•:•<>}↲ [generated] line 7 -{ $ foo } { ↲ +{($foo) ? <> : <>} {/** +{($foo)•?•<>•:•<>}↲ [generated] line 7 +{ $foo} { ↲ { $foo}{ ↲ -{#if•$foo}{/if}↲ [original] line 5 +{#if•$foo}{/if}↲ [original] line 5 ------------------------------------------------------------------------------------------------------------------------------------------------------ */} {/** ------------------------------------------------------------------------------------------------------------------------------------------------------ */} diff --git a/packages/svelte2tsx/test/sourcemaps/samples/reactive-statements/mappings.jsx b/packages/svelte2tsx/test/sourcemaps/samples/reactive-statements/mappings.jsx index 990843b03..f8f252b82 100644 --- a/packages/svelte2tsx/test/sourcemaps/samples/reactive-statements/mappings.jsx +++ b/packages/svelte2tsx/test/sourcemaps/samples/reactive-statements/mappings.jsx @@ -24,11 +24,11 @@ ╚ •foo•=•prop;↲ ╚$:•foo•=•prop;↲ [original] line 3 ------------------------------------------------------------------------------------------------------------------------------------------------------ */} - let bar = __sveltets_1_invalidate(() => (__sveltets_1_store_get(prop), $prop)); {/** - ╚let••bar•=•__sveltets_1_invalidate(()•=>•(__sveltets_1_store_get(prop),•$prop));↲ [generated] line 6 - ╚ •bar•=• $ prop ; ↲ + let bar = __sveltets_1_invalidate(() => $prop); {/** + ╚let••bar•=•__sveltets_1_invalidate(()•=>•$prop);↲ [generated] line 6 + ╚ •bar•=• $prop; ↲ ╚ •bar•=•$prop;↲ - ╚$:•bar•=•$prop;↲ [original] line 4 + ╚$:•bar•=•$prop;↲ [original] line 4 ------------------------------------------------------------------------------------------------------------------------------------------------------ */} ;() => {$: if (bar) ++foo} {/** ╚;()•=>•{$:•if•(bar)•++foo}↲ [generated] line 7 diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/$store-as-directive/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/$store-as-directive/expected.tsx index 9a57ff104..d1d9d377c 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/$store-as-directive/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/$store-as-directive/expected.tsx @@ -10,11 +10,11 @@ () => (<>
); return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/$store-as-directive/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/$store-as-directive/expectedv2.ts index 4e1765811..eec917c26 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/$store-as-directive/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/$store-as-directive/expectedv2.ts @@ -9,7 +9,7 @@ ; async () => { - { svelteHTML.createElement("div", { });__sveltets_2_ensureTransition((__sveltets_1_store_get(transitionStore), $transitionStore)(svelteHTML.mapElementTag('div'),({ y: 100 })));__sveltets_2_ensureAction((__sveltets_1_store_get(actionStore), $actionStore)(svelteHTML.mapElementTag('div')));__sveltets_2_ensureTransition((__sveltets_1_store_get(inStore), $inStore)(svelteHTML.mapElementTag('div')));__sveltets_2_ensureTransition((__sveltets_1_store_get(outStore), $outStore)(svelteHTML.mapElementTag('div')));__sveltets_2_ensureAnimation((__sveltets_1_store_get(animateStore), $animateStore)(svelteHTML.mapElementTag('div'),__sveltets_2_AnimationMove)); + { svelteHTML.createElement("div", { });__sveltets_2_ensureTransition($transitionStore(svelteHTML.mapElementTag('div'),({ y: 100 })));__sveltets_2_ensureAction($actionStore(svelteHTML.mapElementTag('div')));__sveltets_2_ensureTransition($inStore(svelteHTML.mapElementTag('div')));__sveltets_2_ensureTransition($outStore(svelteHTML.mapElementTag('div')));__sveltets_2_ensureAnimation($animateStore(svelteHTML.mapElementTag('div'),__sveltets_2_AnimationMove)); }}; return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/$store-assign/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/$store-assign/expected.tsx index ed34684bd..698c85625 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/$store-assign/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/$store-assign/expected.tsx @@ -3,24 +3,24 @@ const store = writable([])/*Ωignore_startΩ*/;let $store = __sveltets_1_store_get(store);/*Ωignore_endΩ*/; - ;(__sveltets_1_store_get(store), $store)[1] = true; - ;(__sveltets_1_store_get(store), $store).foo = true; + $store[1] = true; + $store.foo = true; - ;(__sveltets_1_store_get(store), $store)[1] = true - ;(__sveltets_1_store_get(store), $store).foo = true + $store[1] = true + $store.foo = true - store.set( true) - store.set( true); + $store = true + $store = true; - hello[(__sveltets_1_store_get(store), $store)] = true; + hello[$store] = true; - store.set( true), - store.set( false), - (__sveltets_1_store_get(store), $store), - (__sveltets_1_store_get(store), $store).a = true + $store = true, + $store = false, + $store, + $store.a = true - ;(__sveltets_1_store_get(store), $store).a = true, - (__sveltets_1_store_get(store), $store).b = false; + $store.a = true, + $store.b = false; ; () => (<>); return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/$store-assign/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/$store-assign/expectedv2.ts index a2cf2727c..720606d5a 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/$store-assign/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/$store-assign/expectedv2.ts @@ -3,24 +3,24 @@ const store = writable([])/*Ωignore_startΩ*/;let $store = __sveltets_1_store_get(store);/*Ωignore_endΩ*/; - ;(__sveltets_1_store_get(store), $store)[1] = true; - ;(__sveltets_1_store_get(store), $store).foo = true; + $store[1] = true; + $store.foo = true; - ;(__sveltets_1_store_get(store), $store)[1] = true - ;(__sveltets_1_store_get(store), $store).foo = true + $store[1] = true + $store.foo = true - store.set( true) - store.set( true); + $store = true + $store = true; - hello[(__sveltets_1_store_get(store), $store)] = true; + hello[$store] = true; - store.set( true), - store.set( false), - (__sveltets_1_store_get(store), $store), - (__sveltets_1_store_get(store), $store).a = true + $store = true, + $store = false, + $store, + $store.a = true - ;(__sveltets_1_store_get(store), $store).a = true, - (__sveltets_1_store_get(store), $store).b = false; + $store.a = true, + $store.b = false; ; async () => {}; return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/$store-index/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/$store-index/expected.tsx index cf544903d..271738992 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/$store-index/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/$store-index/expected.tsx @@ -1,6 +1,6 @@ /// <>;function render() { -<>{someRecordOrArr[(__sveltets_1_store_get(store), $store)]} +<>{someRecordOrArr[$store]} {someObject['$store']} {someObject.$store} return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/$store-index/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/$store-index/expectedv2.ts index 0e39bcbac..afff38610 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/$store-index/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/$store-index/expectedv2.ts @@ -1,6 +1,6 @@ /// ;function render() { -async () => {someRecordOrArr[(__sveltets_1_store_get(store), $store)]; +async () => {someRecordOrArr[$store]; someObject['$store']; someObject.$store;}; return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/$store-inside-block-without-braces/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/$store-inside-block-without-braces/expected.tsx index 10d432970..6e47c8882 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/$store-inside-block-without-braces/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/$store-inside-block-without-braces/expected.tsx @@ -4,27 +4,27 @@ const store1 = ''/*Ωignore_startΩ*/;let $store1 = __sveltets_1_store_get(store1);/*Ωignore_endΩ*/; if (store1) - (__sveltets_1_store_get(store1), $store1) + $store1 else if (store1) - (__sveltets_1_store_get(store1), $store1) + $store1 else - (__sveltets_1_store_get(store), $store) + $store if (store1) - store1.set( 1) + $store1 = 1 if (store1) - (__sveltets_1_store_get(store1), $store1).x = 1 + $store1.x = 1 for (let i=0; i < 1; i++) - (__sveltets_1_store_get(store1), $store1) + $store1 for (const a of b) - (__sveltets_1_store_get(store1), $store1) + $store1 for (const a in b) - (__sveltets_1_store_get(store1), $store1) + $store1 while (true) - (__sveltets_1_store_get(store1), $store1) + $store1 ; () => (<>); return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/$store-inside-block-without-braces/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/$store-inside-block-without-braces/expectedv2.ts index 17d7b5234..45d266a7b 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/$store-inside-block-without-braces/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/$store-inside-block-without-braces/expectedv2.ts @@ -4,27 +4,27 @@ const store1 = ''/*Ωignore_startΩ*/;let $store1 = __sveltets_1_store_get(store1);/*Ωignore_endΩ*/; if (store1) - (__sveltets_1_store_get(store1), $store1) + $store1 else if (store1) - (__sveltets_1_store_get(store1), $store1) + $store1 else - (__sveltets_1_store_get(store), $store) + $store if (store1) - store1.set( 1) + $store1 = 1 if (store1) - (__sveltets_1_store_get(store1), $store1).x = 1 + $store1.x = 1 for (let i=0; i < 1; i++) - (__sveltets_1_store_get(store1), $store1) + $store1 for (const a of b) - (__sveltets_1_store_get(store1), $store1) + $store1 for (const a in b) - (__sveltets_1_store_get(store1), $store1) + $store1 while (true) - (__sveltets_1_store_get(store1), $store1) + $store1 ; async () => {}; return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/$store-no-instance-only-module-script/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/$store-no-instance-only-module-script/expected.tsx index 6fec99a36..4ec6e09ec 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/$store-no-instance-only-module-script/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/$store-no-instance-only-module-script/expected.tsx @@ -5,8 +5,8 @@ ;<>;function render() { <>;/*Ωignore_startΩ*/;let $store1 = __sveltets_1_store_get(store1);/*Ωignore_endΩ*/<> -{(__sveltets_1_store_get(store1), $store1)} -{(__sveltets_1_store_get(store2), $store2)} +{$store1} +{$store2} return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/$store-no-instance-only-module-script/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/$store-no-instance-only-module-script/expectedv2.ts index 4b91ab57a..b0fbf4823 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/$store-no-instance-only-module-script/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/$store-no-instance-only-module-script/expectedv2.ts @@ -5,8 +5,8 @@ ;;function render() { async () => {/*Ωignore_startΩ*/;let $store1 = __sveltets_1_store_get(store1);/*Ωignore_endΩ*/ -(__sveltets_1_store_get(store1), $store1); -(__sveltets_1_store_get(store2), $store2);}; +$store1; +$store2;}; return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/$store-prop-init/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/$store-prop-init/expected.tsx index bf2276244..51d797f4a 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/$store-prop-init/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/$store-prop-init/expected.tsx @@ -2,8 +2,8 @@ <>;function render() { let store = null/*Ωignore_startΩ*/;let $store = __sveltets_1_store_get(store);/*Ωignore_endΩ*/; - const foo = { $store: (__sveltets_1_store_get(store), $store) }; - const bar = { $store: (__sveltets_1_store_get(store), $store) }; + const foo = { $store }; + const bar = { $store: $store }; ; () => (<>); return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/$store-prop-init/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/$store-prop-init/expectedv2.ts index e15ac7835..5f77ed225 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/$store-prop-init/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/$store-prop-init/expectedv2.ts @@ -2,8 +2,8 @@ ;function render() { let store = null/*Ωignore_startΩ*/;let $store = __sveltets_1_store_get(store);/*Ωignore_endΩ*/; - const foo = { $store: (__sveltets_1_store_get(store), $store) }; - const bar = { $store: (__sveltets_1_store_get(store), $store) }; + const foo = { $store }; + const bar = { $store: $store }; ; async () => {}; return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/ast-offset-none/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/ast-offset-none/expected.tsx index 791d7947f..7057971c1 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/ast-offset-none/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/ast-offset-none/expected.tsx @@ -1,6 +1,6 @@ /// <>;function render() { -;(__sveltets_1_store_get(var), $var); +$var; () => (<>); return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/ast-offset-none/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/ast-offset-none/expectedv2.ts index a7ecbe758..bfda92e78 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/ast-offset-none/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/ast-offset-none/expectedv2.ts @@ -1,6 +1,6 @@ /// ;function render() { -;(__sveltets_1_store_get(var), $var); +$var; async () => {}; return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/ast-offset-some/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/ast-offset-some/expected.tsx index 9a86c853e..f01c75553 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/ast-offset-some/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/ast-offset-some/expected.tsx @@ -1,6 +1,6 @@ /// <>;function render() { - ;(__sveltets_1_store_get(var), $var); + $var; () => (<>); return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/ast-offset-some/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/ast-offset-some/expectedv2.ts index 07ce748fd..eeea081e4 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/ast-offset-some/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/ast-offset-some/expectedv2.ts @@ -1,6 +1,6 @@ /// ;function render() { - ;(__sveltets_1_store_get(var), $var); + $var; async () => {}; return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/await-with-$store/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/await-with-$store/expected.tsx index d8025f98b..e343f6b1f 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/await-with-$store/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/await-with-$store/expected.tsx @@ -8,7 +8,7 @@ function render() { ; () => (<> -{() => {let _$$p = ((__sveltets_1_store_get(store), $store)); <> +{() => {let _$$p = ($store); <>

loading

; __sveltets_1_awaitThen(_$$p, (data) => {<> {data} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/await-with-$store/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/await-with-$store/expectedv2.ts index 86a837e37..dafdee8d8 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/await-with-$store/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/await-with-$store/expectedv2.ts @@ -10,7 +10,7 @@ async () => { { { svelteHTML.createElement("p", {}); } -const $$_value = await ((__sveltets_1_store_get(store), $store));{ const data = $$_value; +const $$_value = await ($store);{ const data = $$_value; data; }}}; return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/binding-assignment-$store/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/binding-assignment-$store/expected.tsx index b02a58471..7a31f309e 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/binding-assignment-$store/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/binding-assignment-$store/expected.tsx @@ -1,11 +1,11 @@ /// <>;function render() { -<>
-
-
-
-
-
+<>
+
+
+
+
+
return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/binding-assignment-$store/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/binding-assignment-$store/expectedv2.ts index d51f75821..49a4e21c5 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/binding-assignment-$store/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/binding-assignment-$store/expectedv2.ts @@ -1,11 +1,11 @@ /// ;function render() { -async () => { { const $$_div0 = svelteHTML.createElement("div", { });__sveltets_1_store_get(compile_options), $compile_options= $$_div0.offsetHeight;} - { const $$_div0 = svelteHTML.createElement("div", { });(__sveltets_1_store_get(compile_options), $compile_options).foo= $$_div0.offsetHeight;} - { const $$_div0 = svelteHTML.createElement("div", { });__sveltets_1_store_get(compile_options), $compile_options = $$_div0;} - { const $$_div0 = svelteHTML.createElement("div", { });(__sveltets_1_store_get(compile_options), $compile_options).foo = $$_div0;} - { svelteHTML.createElement("div", { noAssignment:(__sveltets_1_store_get(compile_options), $compile_options),});} - { svelteHTML.createElement("div", { noAssignment:(__sveltets_1_store_get(compile_options), $compile_options).foo,});}}; +async () => { { const $$_div0 = svelteHTML.createElement("div", { });$compile_options= $$_div0.offsetHeight;} + { const $$_div0 = svelteHTML.createElement("div", { });$compile_options.foo= $$_div0.offsetHeight;} + { const $$_div0 = svelteHTML.createElement("div", { });$compile_options = $$_div0;} + { const $$_div0 = svelteHTML.createElement("div", { });$compile_options.foo = $$_div0;} + { svelteHTML.createElement("div", { noAssignment:$compile_options,});} + { svelteHTML.createElement("div", { noAssignment:$compile_options.foo,});}}; return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/binding-group-store/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/binding-group-store/expected.tsx index 58ac9dc74..6a16c3f91 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/binding-group-store/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/binding-group-store/expected.tsx @@ -1,6 +1,6 @@ /// <>;function render() { -<> +<> return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/binding-group-store/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/binding-group-store/expectedv2.ts index e107051d0..c4257b30a 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/binding-group-store/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/binding-group-store/expectedv2.ts @@ -1,6 +1,6 @@ /// ;function render() { -async () => { { svelteHTML.createElement("input", { "id":`dom-input`,"type":`radio`,"value":`dom`,});(__sveltets_1_store_get(compile_options), $compile_options).generate;}}; +async () => { { svelteHTML.createElement("input", { "id":`dom-input`,"type":`radio`,"value":`dom`,});$compile_options.generate;}}; return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/component-slot-object-key/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/component-slot-object-key/expected.tsx index 7ab845809..209c75856 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/component-slot-object-key/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/component-slot-object-key/expected.tsx @@ -2,7 +2,7 @@ <>;function render() { /*Ωignore_startΩ*/;const __sveltets_ensureSlot = __sveltets_1_createEnsureSlot();/*Ωignore_endΩ*/ <>{__sveltets_1_each(items, (item) => <> - Hello + Hello )} return { props: {}, slots: {'default': {a:__sveltets_1_unwrapArr(items), b:{ item:__sveltets_1_unwrapArr(items) }, c:{ item: 'abc' }.item, d:{ item: __sveltets_1_unwrapArr(items) }, e:$item, f:$item, ...g, ...__sveltets_1_unwrapArr(items)}}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/component-slot-object-key/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/component-slot-object-key/expectedv2.ts index 02c98ce77..851744736 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/component-slot-object-key/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/component-slot-object-key/expectedv2.ts @@ -2,7 +2,7 @@ ;function render() { /*Ωignore_startΩ*/;const __sveltets_createSlot = __sveltets_2_createCreateSlot();/*Ωignore_endΩ*/ async () => { for(const item of __sveltets_2_ensureArray(items)){ - { __sveltets_createSlot("default", { "a":item,"b":{ item },"c":{ item: 'abc' }.item,"d":{ item: item },"e":(__sveltets_1_store_get(item), $item),"f":(__sveltets_1_store_get(item), $item),...g,...item,}); } + { __sveltets_createSlot("default", { "a":item,"b":{ item },"c":{ item: 'abc' }.item,"d":{ item: item },"e":$item,"f":$item,...g,...item,}); } }}; return { props: {}, slots: {'default': {a:__sveltets_1_unwrapArr(items), b:{ item:__sveltets_1_unwrapArr(items) }, c:{ item: 'abc' }.item, d:{ item: __sveltets_1_unwrapArr(items) }, e:$item, f:$item, ...g, ...__sveltets_1_unwrapArr(items)}}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/custom-css-properties-with-$store/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/custom-css-properties-with-$store/expected.tsx index b74f7a91a..ddfa308c6 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/custom-css-properties-with-$store/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/custom-css-properties-with-$store/expected.tsx @@ -1,10 +1,10 @@ /// <>;function render() { <> + {...__sveltets_1_cssProp({"--custom-css-property1": `${$jo}`})} + {...__sveltets_1_cssProp({"--custom-css-property2": `hi${$jo}hi`})} + {...__sveltets_1_cssProp({"--custom-css-property3": `hi${$jo}hi`})} + {...__sveltets_1_cssProp({"--custom-css-property4": `hi${$jo}hi`})} /> return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/custom-css-properties-with-$store/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/custom-css-properties-with-$store/expectedv2.ts index 93a054ff5..cb30a770d 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/custom-css-properties-with-$store/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/custom-css-properties-with-$store/expectedv2.ts @@ -1,6 +1,6 @@ /// ;function render() { -async () => { { const $$_Component0C = __sveltets_2_ensureComponent(Component); new $$_Component0C({ target: __sveltets_2_any(), props: { ...__sveltets_2_cssProp({"--custom-css-property1":(__sveltets_1_store_get(jo), $jo)}),...__sveltets_2_cssProp({"--custom-css-property2":`hi${(__sveltets_1_store_get(jo), $jo)}hi`}),...__sveltets_2_cssProp({"--custom-css-property3":`hi${(__sveltets_1_store_get(jo), $jo)}hi`}),...__sveltets_2_cssProp({"--custom-css-property4":`hi${(__sveltets_1_store_get(jo), $jo)}hi`}),}});}}; +async () => { { const $$_Component0C = __sveltets_2_ensureComponent(Component); new $$_Component0C({ target: __sveltets_2_any(), props: { ...__sveltets_2_cssProp({"--custom-css-property1":$jo}),...__sveltets_2_cssProp({"--custom-css-property2":`hi${$jo}hi`}),...__sveltets_2_cssProp({"--custom-css-property3":`hi${$jo}hi`}),...__sveltets_2_cssProp({"--custom-css-property4":`hi${$jo}hi`}),}});}}; return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/debug-block/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/debug-block/expected.tsx index 0f74d9c9a..45810da20 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/debug-block/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/debug-block/expected.tsx @@ -1,8 +1,8 @@ /// <>;function render() { <>{myfile} -{(__sveltets_1_store_get(myfile), $myfile)}{someOtherFile} -{myfile}{(__sveltets_1_store_get(someOtherFile), $someOtherFile)}{someThirdFile} +{$myfile}{someOtherFile} +{myfile}{$someOtherFile}{someThirdFile} return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/debug-block/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/debug-block/expectedv2.ts index 139bcac4d..cc2340843 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/debug-block/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/debug-block/expectedv2.ts @@ -1,8 +1,8 @@ /// ;function render() { async () => {;myfile; -;(__sveltets_1_store_get(myfile), $myfile);someOtherFile; -;myfile;(__sveltets_1_store_get(someOtherFile), $someOtherFile);someThirdFile;}; +;$myfile;someOtherFile; +;myfile;$someOtherFile;someThirdFile;}; return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/nested-$-variables-script/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/nested-$-variables-script/expected.tsx index 8148046c7..c63e48cc3 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/nested-$-variables-script/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/nested-$-variables-script/expected.tsx @@ -3,11 +3,11 @@ let top1 = someStore()/*Ωignore_startΩ*/;let $top1 = __sveltets_1_store_get(top1);/*Ωignore_endΩ*/ let top2 = someStore()/*Ωignore_startΩ*/;let $top2 = __sveltets_1_store_get(top2);/*Ωignore_endΩ*/ -let topLevelGet = (__sveltets_1_store_get(top1), $top1) -topLevelGet = (__sveltets_1_store_get(top2), $top2) +let topLevelGet = $top1 +topLevelGet = $top2 function test(top1) { - let passedGet = (__sveltets_1_store_get(top1), $top1) + let passedGet = $top1 } function test2($top1) { @@ -19,7 +19,7 @@ function test3() { let letshadowed = $top2 } -const test4 = ({a, b: { $top1: $top2 }}) => $top2 && (__sveltets_1_store_get(top1), $top1) +const test4 = ({a, b: { $top1: $top2 }}) => $top2 && $top1 ; () => (<>); diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/nested-$-variables-script/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/nested-$-variables-script/expectedv2.ts index 9a1bdec97..5cf2271ee 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/nested-$-variables-script/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/nested-$-variables-script/expectedv2.ts @@ -3,11 +3,11 @@ let top1 = someStore()/*Ωignore_startΩ*/;let $top1 = __sveltets_1_store_get(top1);/*Ωignore_endΩ*/ let top2 = someStore()/*Ωignore_startΩ*/;let $top2 = __sveltets_1_store_get(top2);/*Ωignore_endΩ*/ -let topLevelGet = (__sveltets_1_store_get(top1), $top1) -topLevelGet = (__sveltets_1_store_get(top2), $top2) +let topLevelGet = $top1 +topLevelGet = $top2 function test(top1) { - let passedGet = (__sveltets_1_store_get(top1), $top1) + let passedGet = $top1 } function test2($top1) { @@ -19,7 +19,7 @@ function test3() { let letshadowed = $top2 } -const test4 = ({a, b: { $top1: $top2 }}) => $top2 && (__sveltets_1_store_get(top1), $top1) +const test4 = ({a, b: { $top1: $top2 }}) => $top2 && $top1 ; async () => {}; diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/nested-$-variables-template/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/nested-$-variables-template/expected.tsx index 4a28fff90..151748df3 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/nested-$-variables-template/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/nested-$-variables-template/expected.tsx @@ -6,11 +6,11 @@ // it's therefore okay to not append "let top1$/top2$ = __svelte_store_get(..)" let top1 = someStore() let top2 = someStore() - let topLevelGet = (__sveltets_1_store_get(top1), $top1) - topLevelGet = (__sveltets_1_store_get(top2), $top2) + let topLevelGet = $top1 + topLevelGet = $top2 function test(top1) { - let passedGet = (__sveltets_1_store_get(top1), $top1) + let passedGet = $top1 } function test2($top1) { @@ -22,7 +22,7 @@ let letshadowed = $top2 } - const test4 = ({a, b: { $top1: $top2 }}) => $top2 && (__sveltets_1_store_get(top1), $top1) + const test4 = ({a, b: { $top1: $top2 }}) => $top2 && $top1 }}>Hi return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/nested-$-variables-template/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/nested-$-variables-template/expectedv2.ts index c8e44aa9a..f8816c6c4 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/nested-$-variables-template/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/nested-$-variables-template/expectedv2.ts @@ -6,11 +6,11 @@ async () => { { svelteHTML.createElement("h1", { "onclick":() => { // it's therefore okay to not append "let top1$/top2$ = __svelte_store_get(..)" let top1 = someStore() let top2 = someStore() - let topLevelGet = (__sveltets_1_store_get(top1), $top1) - topLevelGet = (__sveltets_1_store_get(top2), $top2) + let topLevelGet = $top1 + topLevelGet = $top2 function test(top1) { - let passedGet = (__sveltets_1_store_get(top1), $top1) + let passedGet = $top1 } function test2($top1) { @@ -22,7 +22,7 @@ async () => { { svelteHTML.createElement("h1", { "onclick":() => { let letshadowed = $top2 } - const test4 = ({a, b: { $top1: $top2 }}) => $top2 && (__sveltets_1_store_get(top1), $top1) + const test4 = ({a, b: { $top1: $top2 }}) => $top2 && $top1 },}); }}; return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/reactive-$store-destructuring/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/reactive-$store-destructuring/expected.tsx index 908f25be5..b2b382bfe 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/reactive-$store-destructuring/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/reactive-$store-destructuring/expected.tsx @@ -1,21 +1,21 @@ /// <>;function render() { - let { count } = __sveltets_1_invalidate(() => (__sveltets_1_store_get(data), $data)); - let { count2 } = __sveltets_1_invalidate(() => (__sveltets_1_store_get(data), $data)) + let { count } = __sveltets_1_invalidate(() => $data); + let { count2 } = __sveltets_1_invalidate(() => $data) let count3; - $: ({ count3 } = __sveltets_1_invalidate(() => (__sveltets_1_store_get(data), $data))) + $: ({ count3 } = __sveltets_1_invalidate(() => $data)) let bla4; let bla5; -$: ({ bla4, bla5 } = __sveltets_1_invalidate(() => (__sveltets_1_store_get(data), $data))) +$: ({ bla4, bla5 } = __sveltets_1_invalidate(() => $data)) - let [ count ] = __sveltets_1_invalidate(() => (__sveltets_1_store_get(data), $data)); - let [ count2 ] = __sveltets_1_invalidate(() => (__sveltets_1_store_get(data), $data)) + let [ count ] = __sveltets_1_invalidate(() => $data); + let [ count2 ] = __sveltets_1_invalidate(() => $data) let count3; - $: ([ count3 ] = __sveltets_1_invalidate(() => (__sveltets_1_store_get(data), $data))) + $: ([ count3 ] = __sveltets_1_invalidate(() => $data)) let bla4; let bla5; -$: ([ bla4, bla5 ] = __sveltets_1_invalidate(() => (__sveltets_1_store_get(data), $data))) +$: ([ bla4, bla5 ] = __sveltets_1_invalidate(() => $data)) ; () => (<>); return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/reactive-$store-destructuring/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/reactive-$store-destructuring/expectedv2.ts index e3b606260..0669e48c4 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/reactive-$store-destructuring/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/reactive-$store-destructuring/expectedv2.ts @@ -1,21 +1,21 @@ /// ;function render() { - let { count } = __sveltets_1_invalidate(() => (__sveltets_1_store_get(data), $data)); - let { count2 } = __sveltets_1_invalidate(() => (__sveltets_1_store_get(data), $data)) + let { count } = __sveltets_1_invalidate(() => $data); + let { count2 } = __sveltets_1_invalidate(() => $data) let count3; - $: ({ count3 } = __sveltets_1_invalidate(() => (__sveltets_1_store_get(data), $data))) + $: ({ count3 } = __sveltets_1_invalidate(() => $data)) let bla4; let bla5; -$: ({ bla4, bla5 } = __sveltets_1_invalidate(() => (__sveltets_1_store_get(data), $data))) +$: ({ bla4, bla5 } = __sveltets_1_invalidate(() => $data)) - let [ count ] = __sveltets_1_invalidate(() => (__sveltets_1_store_get(data), $data)); - let [ count2 ] = __sveltets_1_invalidate(() => (__sveltets_1_store_get(data), $data)) + let [ count ] = __sveltets_1_invalidate(() => $data); + let [ count2 ] = __sveltets_1_invalidate(() => $data) let count3; - $: ([ count3 ] = __sveltets_1_invalidate(() => (__sveltets_1_store_get(data), $data))) + $: ([ count3 ] = __sveltets_1_invalidate(() => $data)) let bla4; let bla5; -$: ([ bla4, bla5 ] = __sveltets_1_invalidate(() => (__sveltets_1_store_get(data), $data))) +$: ([ bla4, bla5 ] = __sveltets_1_invalidate(() => $data)) ; async () => {}; return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/reactive-statements-store/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/reactive-statements-store/expected.tsx index 07511ec22..a92bddaae 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/reactive-statements-store/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/reactive-statements-store/expected.tsx @@ -2,17 +2,17 @@ <>;function render() { const uid = readable('')/*Ωignore_startΩ*/;let $uid = __sveltets_1_store_get(uid);/*Ωignore_endΩ*/ - let foo1 = __sveltets_1_invalidate(() => getFoo1((__sveltets_1_store_get(uid), $uid)));/*Ωignore_startΩ*/;let $foo1 = __sveltets_1_store_get(foo1);/*Ωignore_endΩ*/ - ;() => {$: console.log({ foo1: (__sveltets_1_store_get(foo1), $foo1) });} + let foo1 = __sveltets_1_invalidate(() => getFoo1($uid));/*Ωignore_startΩ*/;let $foo1 = __sveltets_1_store_get(foo1);/*Ωignore_endΩ*/ + ;() => {$: console.log({ foo1: $foo1 });} - let foo2 = __sveltets_1_invalidate(() => getFoo2((__sveltets_1_store_get(uid), $uid)))/*Ωignore_startΩ*/;let $foo2 = __sveltets_1_store_get(foo2);/*Ωignore_endΩ*/ - ;() => {$: console.log({ foo2: (__sveltets_1_store_get(foo2), $foo2) })} + let foo2 = __sveltets_1_invalidate(() => getFoo2($uid))/*Ωignore_startΩ*/;let $foo2 = __sveltets_1_store_get(foo2);/*Ωignore_endΩ*/ + ;() => {$: console.log({ foo2: $foo2 })} - let {foo3} = __sveltets_1_invalidate(() => getFoo3((__sveltets_1_store_get(uid), $uid)));/*Ωignore_startΩ*/;let $foo3 = __sveltets_1_store_get(foo3);/*Ωignore_endΩ*/ - ;() => {$: console.log({ foo3: (__sveltets_1_store_get(foo3), $foo3) });} + let {foo3} = __sveltets_1_invalidate(() => getFoo3($uid));/*Ωignore_startΩ*/;let $foo3 = __sveltets_1_store_get(foo3);/*Ωignore_endΩ*/ + ;() => {$: console.log({ foo3: $foo3 });} - let {foo4} = __sveltets_1_invalidate(() => getFoo4((__sveltets_1_store_get(uid), $uid)))/*Ωignore_startΩ*/;let $foo4 = __sveltets_1_store_get(foo4);/*Ωignore_endΩ*/ - ;() => {$: console.log({ foo4: (__sveltets_1_store_get(foo4), $foo4) })} + let {foo4} = __sveltets_1_invalidate(() => getFoo4($uid))/*Ωignore_startΩ*/;let $foo4 = __sveltets_1_store_get(foo4);/*Ωignore_endΩ*/ + ;() => {$: console.log({ foo4: $foo4 })} ; () => (<>); return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/reactive-statements-store/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/reactive-statements-store/expectedv2.ts index ff06a07f0..726a67348 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/reactive-statements-store/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/reactive-statements-store/expectedv2.ts @@ -2,17 +2,17 @@ ;function render() { const uid = readable('')/*Ωignore_startΩ*/;let $uid = __sveltets_1_store_get(uid);/*Ωignore_endΩ*/ - let foo1 = __sveltets_1_invalidate(() => getFoo1((__sveltets_1_store_get(uid), $uid)));/*Ωignore_startΩ*/;let $foo1 = __sveltets_1_store_get(foo1);/*Ωignore_endΩ*/ - ;() => {$: console.log({ foo1: (__sveltets_1_store_get(foo1), $foo1) });} + let foo1 = __sveltets_1_invalidate(() => getFoo1($uid));/*Ωignore_startΩ*/;let $foo1 = __sveltets_1_store_get(foo1);/*Ωignore_endΩ*/ + ;() => {$: console.log({ foo1: $foo1 });} - let foo2 = __sveltets_1_invalidate(() => getFoo2((__sveltets_1_store_get(uid), $uid)))/*Ωignore_startΩ*/;let $foo2 = __sveltets_1_store_get(foo2);/*Ωignore_endΩ*/ - ;() => {$: console.log({ foo2: (__sveltets_1_store_get(foo2), $foo2) })} + let foo2 = __sveltets_1_invalidate(() => getFoo2($uid))/*Ωignore_startΩ*/;let $foo2 = __sveltets_1_store_get(foo2);/*Ωignore_endΩ*/ + ;() => {$: console.log({ foo2: $foo2 })} - let {foo3} = __sveltets_1_invalidate(() => getFoo3((__sveltets_1_store_get(uid), $uid)));/*Ωignore_startΩ*/;let $foo3 = __sveltets_1_store_get(foo3);/*Ωignore_endΩ*/ - ;() => {$: console.log({ foo3: (__sveltets_1_store_get(foo3), $foo3) });} + let {foo3} = __sveltets_1_invalidate(() => getFoo3($uid));/*Ωignore_startΩ*/;let $foo3 = __sveltets_1_store_get(foo3);/*Ωignore_endΩ*/ + ;() => {$: console.log({ foo3: $foo3 });} - let {foo4} = __sveltets_1_invalidate(() => getFoo4((__sveltets_1_store_get(uid), $uid)))/*Ωignore_startΩ*/;let $foo4 = __sveltets_1_store_get(foo4);/*Ωignore_endΩ*/ - ;() => {$: console.log({ foo4: (__sveltets_1_store_get(foo4), $foo4) })} + let {foo4} = __sveltets_1_invalidate(() => getFoo4($uid))/*Ωignore_startΩ*/;let $foo4 = __sveltets_1_store_get(foo4);/*Ωignore_endΩ*/ + ;() => {$: console.log({ foo4: $foo4 })} ; async () => {}; return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/reactive-store-set/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/reactive-store-set/expected.tsx index c7bbf641a..f85026644 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/reactive-store-set/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/reactive-store-set/expected.tsx @@ -1,7 +1,7 @@ /// <>;function render() { - $: store.set( __sveltets_1_invalidate(() => (__sveltets_1_store_get(store), $store) + 1)); + $: $store = __sveltets_1_invalidate(() => $store + 1); ; () => (<>); return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/reactive-store-set/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/reactive-store-set/expectedv2.ts index d6a71ebe1..8207bca50 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/reactive-store-set/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/reactive-store-set/expectedv2.ts @@ -1,7 +1,7 @@ /// ;function render() { - $: store.set( __sveltets_1_invalidate(() => (__sveltets_1_store_get(store), $store) + 1)); + $: $store = __sveltets_1_invalidate(() => $store + 1); ; async () => {}; return { props: {}, slots: {}, getters: {}, events: {} }} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/store-destructuring/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/store-destructuring/expected.tsx index ea6588129..80f6e8a22 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/store-destructuring/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/store-destructuring/expected.tsx @@ -6,11 +6,11 @@ const [ store3, store4, noStore ] = fromSomewhere()/*Ωignore_startΩ*/;let $store3 = __sveltets_1_store_get(store3);;let $store4 = __sveltets_1_store_get(store4);/*Ωignore_endΩ*/; ; () => (<> -

{(__sveltets_1_store_get(store), $store)}

-

{(__sveltets_1_store_get(store1), $store1)}

-

{(__sveltets_1_store_get(store2), $store2)}

-

{(__sveltets_1_store_get(store3), $store3)}

-

{(__sveltets_1_store_get(store4), $store4)}

); +

{$store}

+

{$store1}

+

{$store2}

+

{$store3}

+

{$store4}

); return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/store-destructuring/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/store-destructuring/expectedv2.ts index 5fa84da8d..86dc61bfb 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/store-destructuring/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/store-destructuring/expectedv2.ts @@ -6,11 +6,11 @@ const [ store3, store4, noStore ] = fromSomewhere()/*Ωignore_startΩ*/;let $store3 = __sveltets_1_store_get(store3);;let $store4 = __sveltets_1_store_get(store4);/*Ωignore_endΩ*/; ; async () => { - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store), $store); } - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store1), $store1); } - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store2), $store2); } - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store3), $store3); } - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store4), $store4); }}; + { svelteHTML.createElement("p", {});$store; } + { svelteHTML.createElement("p", {});$store1; } + { svelteHTML.createElement("p", {});$store2; } + { svelteHTML.createElement("p", {});$store3; } + { svelteHTML.createElement("p", {});$store4; }}; return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/store-from-module/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/store-from-module/expected.tsx index 2ab16d0ea..40830b8c3 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/store-from-module/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/store-from-module/expected.tsx @@ -5,15 +5,15 @@ const store4 = writable('')/*Ωignore_startΩ*/;let $store4 = __sveltets_1_store_get(store4);/*Ωignore_endΩ*/; ;<>;function render() { /*Ωignore_startΩ*/;let $store1 = __sveltets_1_store_get(store1);;let $store2 = __sveltets_1_store_get(store2);/*Ωignore_endΩ*/ - ;(__sveltets_1_store_get(store1), $store1); - ;(__sveltets_1_store_get(store3), $store3); + $store1; + $store3; ; () => (<> -

{(__sveltets_1_store_get(store2), $store2)}

-

{(__sveltets_1_store_get(store4), $store4)}

); +

{$store2}

+

{$store4}

); return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/store-from-module/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/store-from-module/expectedv2.ts index 9a6723f26..5ea3b27a0 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/store-from-module/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/store-from-module/expectedv2.ts @@ -5,15 +5,15 @@ const store4 = writable('')/*Ωignore_startΩ*/;let $store4 = __sveltets_1_store_get(store4);/*Ωignore_endΩ*/; ;;function render() { /*Ωignore_startΩ*/;let $store1 = __sveltets_1_store_get(store1);;let $store2 = __sveltets_1_store_get(store2);/*Ωignore_endΩ*/ - ;(__sveltets_1_store_get(store1), $store1); - ;(__sveltets_1_store_get(store3), $store3); + $store1; + $store3; ; async () => { - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store2), $store2); } - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store4), $store4); }}; + { svelteHTML.createElement("p", {});$store2; } + { svelteHTML.createElement("p", {});$store4; }}; return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/store-from-reactive-assignment/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/store-from-reactive-assignment/expected.tsx index a73d84f28..141cdef50 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/store-from-reactive-assignment/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/store-from-reactive-assignment/expected.tsx @@ -6,9 +6,9 @@ let [ store2, noStore ] = __sveltets_1_invalidate(() => fromSomewhere());/*Ωignore_startΩ*/;let $store2 = __sveltets_1_store_get(store2);/*Ωignore_endΩ*/ ; () => (<> -

{(__sveltets_1_store_get(store), $store)}

-

{(__sveltets_1_store_get(store1), $store1)}

-

{(__sveltets_1_store_get(store2), $store2)}

); +

{$store}

+

{$store1}

+

{$store2}

); return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/store-from-reactive-assignment/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/store-from-reactive-assignment/expectedv2.ts index 8337bbfe9..7f573b41d 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/store-from-reactive-assignment/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/store-from-reactive-assignment/expectedv2.ts @@ -6,9 +6,9 @@ let [ store2, noStore ] = __sveltets_1_invalidate(() => fromSomewhere());/*Ωignore_startΩ*/;let $store2 = __sveltets_1_store_get(store2);/*Ωignore_endΩ*/ ; async () => { - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store), $store); } - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store1), $store1); } - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store2), $store2); }}; + { svelteHTML.createElement("p", {});$store; } + { svelteHTML.createElement("p", {});$store1; } + { svelteHTML.createElement("p", {});$store2; }}; return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/store-import/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/store-import/expected.tsx index 2e508db83..129452e9e 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/store-import/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/store-import/expected.tsx @@ -11,9 +11,9 @@ function render() { ; () => (<> -

{(__sveltets_1_store_get(storeA), $storeA)}

-

{(__sveltets_1_store_get(storeB), $storeB)}

-

{(__sveltets_1_store_get(storeC), $storeC)}

); +

{$storeA}

+

{$storeB}

+

{$storeC}

); return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/store-import/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/store-import/expectedv2.ts index e0f6fd4fe..c7f3736a4 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/store-import/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/store-import/expectedv2.ts @@ -11,9 +11,9 @@ function render() { ; async () => { - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(storeA), $storeA); } - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(storeB), $storeB); } - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(storeC), $storeC); }}; + { svelteHTML.createElement("p", {});$storeA; } + { svelteHTML.createElement("p", {});$storeB; } + { svelteHTML.createElement("p", {});$storeC; }}; return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/store-property-access/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/store-property-access/expected.tsx index 042dbadea..53be44df8 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/store-property-access/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/store-property-access/expected.tsx @@ -2,26 +2,26 @@ <>;function render() { const store = someStore()/*Ωignore_startΩ*/;let $store = __sveltets_1_store_get(store);/*Ωignore_endΩ*/; - ;(__sveltets_1_store_get(store), $store); - ;(__sveltets_1_store_get(store), $store).prop; - ;(__sveltets_1_store_get(store), $store)['prop']; - ;(__sveltets_1_store_get(store), $store).prop.anotherProp; - ;(__sveltets_1_store_get(store), $store)['prop'].anotherProp; - ;(__sveltets_1_store_get(store), $store).prop['anotherProp']; - ;(__sveltets_1_store_get(store), $store)['prop']['anotherProp']; - ;(__sveltets_1_store_get(store), $store)?.prop.anotherProp; - ;(__sveltets_1_store_get(store), $store)?.prop?.anotherProp; + $store; + $store.prop; + $store['prop']; + $store.prop.anotherProp; + $store['prop'].anotherProp; + $store.prop['anotherProp']; + $store['prop']['anotherProp']; + $store?.prop.anotherProp; + $store?.prop?.anotherProp; ; () => (<> -

{(__sveltets_1_store_get(store), $store)}

-

{(__sveltets_1_store_get(store), $store).prop}

-

{(__sveltets_1_store_get(store), $store)['prop']}

-

{(__sveltets_1_store_get(store), $store).prop.anotherProp}

-

{(__sveltets_1_store_get(store), $store)['prop'].anotherProp}

-

{(__sveltets_1_store_get(store), $store).prop['anotherProp']}

-

{(__sveltets_1_store_get(store), $store)['prop']['anotherProp']}

-

{(__sveltets_1_store_get(store), $store)?.prop.anotherProp}

-

{(__sveltets_1_store_get(store), $store)?.prop?.anotherProp}

); +

{$store}

+

{$store.prop}

+

{$store['prop']}

+

{$store.prop.anotherProp}

+

{$store['prop'].anotherProp}

+

{$store.prop['anotherProp']}

+

{$store['prop']['anotherProp']}

+

{$store?.prop.anotherProp}

+

{$store?.prop?.anotherProp}

); return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/store-property-access/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/store-property-access/expectedv2.ts index 0beaeb399..7f962f5c6 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/store-property-access/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/store-property-access/expectedv2.ts @@ -2,26 +2,26 @@ ;function render() { const store = someStore()/*Ωignore_startΩ*/;let $store = __sveltets_1_store_get(store);/*Ωignore_endΩ*/; - ;(__sveltets_1_store_get(store), $store); - ;(__sveltets_1_store_get(store), $store).prop; - ;(__sveltets_1_store_get(store), $store)['prop']; - ;(__sveltets_1_store_get(store), $store).prop.anotherProp; - ;(__sveltets_1_store_get(store), $store)['prop'].anotherProp; - ;(__sveltets_1_store_get(store), $store).prop['anotherProp']; - ;(__sveltets_1_store_get(store), $store)['prop']['anotherProp']; - ;(__sveltets_1_store_get(store), $store)?.prop.anotherProp; - ;(__sveltets_1_store_get(store), $store)?.prop?.anotherProp; + $store; + $store.prop; + $store['prop']; + $store.prop.anotherProp; + $store['prop'].anotherProp; + $store.prop['anotherProp']; + $store['prop']['anotherProp']; + $store?.prop.anotherProp; + $store?.prop?.anotherProp; ; async () => { - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store), $store); } - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store), $store).prop; } - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store), $store)['prop']; } - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store), $store).prop.anotherProp; } - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store), $store)['prop'].anotherProp; } - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store), $store).prop['anotherProp']; } - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store), $store)['prop']['anotherProp']; } - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store), $store)?.prop.anotherProp; } - { svelteHTML.createElement("p", {});(__sveltets_1_store_get(store), $store)?.prop?.anotherProp; }}; + { svelteHTML.createElement("p", {});$store; } + { svelteHTML.createElement("p", {});$store.prop; } + { svelteHTML.createElement("p", {});$store['prop']; } + { svelteHTML.createElement("p", {});$store.prop.anotherProp; } + { svelteHTML.createElement("p", {});$store['prop'].anotherProp; } + { svelteHTML.createElement("p", {});$store.prop['anotherProp']; } + { svelteHTML.createElement("p", {});$store['prop']['anotherProp']; } + { svelteHTML.createElement("p", {});$store?.prop.anotherProp; } + { svelteHTML.createElement("p", {});$store?.prop?.anotherProp; }}; return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/stores-mustache/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/stores-mustache/expected.tsx index 644fd6af6..fb1355314 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/stores-mustache/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/stores-mustache/expected.tsx @@ -1,6 +1,6 @@ /// <>;function render() { -<> +<> return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/stores-mustache/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/stores-mustache/expectedv2.ts index e6e9f76b0..d7961cbe1 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/stores-mustache/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/stores-mustache/expectedv2.ts @@ -1,6 +1,6 @@ /// ;function render() { -async () => { { const $$_Me0C = __sveltets_2_ensureComponent(Me); new $$_Me0C({ target: __sveltets_2_any(), props: { "f":`${(__sveltets_1_store_get(s), $s)} `,}});}}; +async () => { { const $$_Me0C = __sveltets_2_ensureComponent(Me); new $$_Me0C({ target: __sveltets_2_any(), props: { "f":`${$s} `,}});}}; return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-in-event-binding/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-in-event-binding/expected.tsx index 7eaf02fbc..9846eacf4 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-in-event-binding/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-in-event-binding/expected.tsx @@ -1,7 +1,7 @@ /// <>;function render() { -<>{/*Ωignore_startΩ*/new Component({target: __sveltets_1_any(''), props: {}})/*Ωignore_endΩ*/.$on('click', (__sveltets_1_store_get(check), $check) ? method1 : method2)} - +<>{/*Ωignore_startΩ*/new Component({target: __sveltets_1_any(''), props: {}})/*Ωignore_endΩ*/.$on('click', $check ? method1 : method2)} + return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-in-event-binding/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-in-event-binding/expectedv2.ts index c8ebd932b..7c83db819 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-in-event-binding/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-in-event-binding/expectedv2.ts @@ -1,7 +1,7 @@ /// ;function render() { -async () => { { const $$_Component0C = __sveltets_2_ensureComponent(Component); const $$_Component0 = new $$_Component0C({ target: __sveltets_2_any(), props: { }});$$_Component0.$on("click", (__sveltets_1_store_get(check), $check) ? method1 : method2);} - { svelteHTML.createElement("button", { "onclick":(__sveltets_1_store_get(check), $check) ? method1 : method2,}); }}; +async () => { { const $$_Component0C = __sveltets_2_ensureComponent(Component); const $$_Component0 = new $$_Component0C({ target: __sveltets_2_any(), props: { }});$$_Component0.$on("click", $check ? method1 : method2);} + { svelteHTML.createElement("button", { "onclick":$check ? method1 : method2,}); }}; return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-multiple-variable-declaration/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-multiple-variable-declaration/expected.tsx index 483f57cb8..7d2ddcc0e 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-multiple-variable-declaration/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-multiple-variable-declaration/expected.tsx @@ -8,16 +8,16 @@ ; () => (<> -{(__sveltets_1_store_get(store1), $store1)} -{(__sveltets_1_store_get(store2), $store2)} -{(__sveltets_1_store_get(store3), $store3)} -{(__sveltets_1_store_get(store4), $store4)} -{(__sveltets_1_store_get(store5), $store5)} -{(__sveltets_1_store_get(store6), $store6)} -{(__sveltets_1_store_get(store7), $store7)} -{(__sveltets_1_store_get(store8), $store8)} -{(__sveltets_1_store_get(store9), $store9)} -{(__sveltets_1_store_get(store10), $store10)}); +{$store1} +{$store2} +{$store3} +{$store4} +{$store5} +{$store6} +{$store7} +{$store8} +{$store9} +{$store10}); return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-multiple-variable-declaration/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-multiple-variable-declaration/expectedv2.ts index baf9e8aea..259238c11 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-multiple-variable-declaration/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-multiple-variable-declaration/expectedv2.ts @@ -8,16 +8,16 @@ ; async () => { -(__sveltets_1_store_get(store1), $store1); -(__sveltets_1_store_get(store2), $store2); -(__sveltets_1_store_get(store3), $store3); -(__sveltets_1_store_get(store4), $store4); -(__sveltets_1_store_get(store5), $store5); -(__sveltets_1_store_get(store6), $store6); -(__sveltets_1_store_get(store7), $store7); -(__sveltets_1_store_get(store8), $store8); -(__sveltets_1_store_get(store9), $store9); -(__sveltets_1_store_get(store10), $store10);}; +$store1; +$store2; +$store3; +$store4; +$store5; +$store6; +$store7; +$store8; +$store9; +$store10;}; return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-assignment-operators/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-assignment-operators/expected.tsx index dcfeb047b..0ed8d3ab2 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-assignment-operators/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-assignment-operators/expected.tsx @@ -6,33 +6,33 @@ function render() { const count = writable(0)/*Ωignore_startΩ*/;let $count = __sveltets_1_store_get(count);/*Ωignore_endΩ*/; let myvar = 42 // to show that this is different from ++ or -- - const handler1 = () => count.set( $count + myvar) - const handler2 = () => count.set( $count - myvar) - const handler3 = () => count.set( $count * myvar) - const handler4 = () => count.set( $count / myvar) - const handler5 = () => count.set( $count ** myvar) - const handler6 = () => count.set( $count % myvar) - const handler7 = () => count.set( $count << myvar) - const handler8 = () => count.set( $count >> myvar) - const handler9 = () => count.set( $count >>> myvar) - const handler10 = () => count.set( $count & myvar) - const handler11 = () => count.set( $count ^ myvar) - const handler12 = () => count.set( $count | myvar) + const handler1 = () => $count += myvar + const handler2 = () => $count -= myvar + const handler3 = () => $count *= myvar + const handler4 = () => $count /= myvar + const handler5 = () => $count **= myvar + const handler6 = () => $count %= myvar + const handler7 = () => $count <<= myvar + const handler8 = () => $count >>= myvar + const handler9 = () => $count >>>= myvar + const handler10 = () => $count &= myvar + const handler11 = () => $count ^= myvar + const handler12 = () => $count |= myvar ; () => (<> - - - - - - - - - - - -); + + + + + + + + + + + +); return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-assignment-operators/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-assignment-operators/expectedv2.ts index 79cec992a..329b08940 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-assignment-operators/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-assignment-operators/expectedv2.ts @@ -6,33 +6,33 @@ function render() { const count = writable(0)/*Ωignore_startΩ*/;let $count = __sveltets_1_store_get(count);/*Ωignore_endΩ*/; let myvar = 42 // to show that this is different from ++ or -- - const handler1 = () => count.set( $count + myvar) - const handler2 = () => count.set( $count - myvar) - const handler3 = () => count.set( $count * myvar) - const handler4 = () => count.set( $count / myvar) - const handler5 = () => count.set( $count ** myvar) - const handler6 = () => count.set( $count % myvar) - const handler7 = () => count.set( $count << myvar) - const handler8 = () => count.set( $count >> myvar) - const handler9 = () => count.set( $count >>> myvar) - const handler10 = () => count.set( $count & myvar) - const handler11 = () => count.set( $count ^ myvar) - const handler12 = () => count.set( $count | myvar) + const handler1 = () => $count += myvar + const handler2 = () => $count -= myvar + const handler3 = () => $count *= myvar + const handler4 = () => $count /= myvar + const handler5 = () => $count **= myvar + const handler6 = () => $count %= myvar + const handler7 = () => $count <<= myvar + const handler8 = () => $count >>= myvar + const handler9 = () => $count >>>= myvar + const handler10 = () => $count &= myvar + const handler11 = () => $count ^= myvar + const handler12 = () => $count |= myvar ; async () => { - { svelteHTML.createElement("button", { "onclick":() => count.set( $count + myvar),}); } - { svelteHTML.createElement("button", { "onclick":() => count.set( $count - myvar),}); } - { svelteHTML.createElement("button", { "onclick":() => count.set( $count * myvar),}); } - { svelteHTML.createElement("button", { "onclick":() => count.set( $count / myvar),}); } - { svelteHTML.createElement("button", { "onclick":() => count.set( $count ** myvar),}); } - { svelteHTML.createElement("button", { "onclick":() => count.set( $count % myvar),}); } - { svelteHTML.createElement("button", { "onclick":() => count.set( $count << myvar),}); } - { svelteHTML.createElement("button", { "onclick":() => count.set( $count >> myvar),}); } - { svelteHTML.createElement("button", { "onclick":() => count.set( $count >>> myvar),}); } - { svelteHTML.createElement("button", { "onclick":() => count.set( $count & myvar),}); } - { svelteHTML.createElement("button", { "onclick":() => count.set( $count ^ myvar),}); } - { svelteHTML.createElement("button", { "onclick":() => count.set( $count | myvar),}); }}; + { svelteHTML.createElement("button", { "onclick":() => $count += myvar,}); } + { svelteHTML.createElement("button", { "onclick":() => $count -= myvar,}); } + { svelteHTML.createElement("button", { "onclick":() => $count *= myvar,}); } + { svelteHTML.createElement("button", { "onclick":() => $count /= myvar,}); } + { svelteHTML.createElement("button", { "onclick":() => $count **= myvar,}); } + { svelteHTML.createElement("button", { "onclick":() => $count %= myvar,}); } + { svelteHTML.createElement("button", { "onclick":() => $count <<= myvar,}); } + { svelteHTML.createElement("button", { "onclick":() => $count >>= myvar,}); } + { svelteHTML.createElement("button", { "onclick":() => $count >>>= myvar,}); } + { svelteHTML.createElement("button", { "onclick":() => $count &= myvar,}); } + { svelteHTML.createElement("button", { "onclick":() => $count ^= myvar,}); } + { svelteHTML.createElement("button", { "onclick":() => $count |= myvar,}); }}; return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-increments/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-increments/expected.tsx index d98823f06..c795d6ac1 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-increments/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-increments/expected.tsx @@ -5,14 +5,14 @@ function render() { const count = writable(0)/*Ωignore_startΩ*/;let $count = __sveltets_1_store_get(count);/*Ωignore_endΩ*/; - const handler1 = () => (count.set( $count + 1), $count) - const handler2 = () => (count.set( $count - 1), $count) + const handler1 = () => ++$count + const handler2 = () => $count-- ; () => (<> - - -); + + +); return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-increments/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-increments/expectedv2.ts index d613365d6..8a7ac317b 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-increments/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-increments/expectedv2.ts @@ -5,14 +5,14 @@ function render() { const count = writable(0)/*Ωignore_startΩ*/;let $count = __sveltets_1_store_get(count);/*Ωignore_endΩ*/; - const handler1 = () => (count.set( $count + 1), $count) - const handler2 = () => (count.set( $count - 1), $count) + const handler1 = () => ++$count + const handler2 = () => $count-- ; async () => { - { svelteHTML.createElement("button", { "onclick":() => (count.set( $count + 1), $count),}); } - { svelteHTML.createElement("button", { "onclick":() => (count.set( $count - 1), $count),}); } - { svelteHTML.createElement("button", { "onclick":() => (count.set( $count + 1), $count),}); }}; + { svelteHTML.createElement("button", { "onclick":() => ++$count,}); } + { svelteHTML.createElement("button", { "onclick":() => $count--,}); } + { svelteHTML.createElement("button", { "onclick":() => $count++,}); }}; return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-unary-operators/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-unary-operators/expected.tsx index 5227e6003..ee5eb0848 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-unary-operators/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-unary-operators/expected.tsx @@ -5,17 +5,17 @@ function render() { const count = writable(0)/*Ωignore_startΩ*/;let $count = __sveltets_1_store_get(count);/*Ωignore_endΩ*/; - const handler1 = () => !(__sveltets_1_store_get(count), $count) - const handler2 = () => +(__sveltets_1_store_get(count), $count) - const handler3 = () => -(__sveltets_1_store_get(count), $count) - const handler4 = () => ~(__sveltets_1_store_get(count), $count) + const handler1 = () => !$count + const handler2 = () => +$count + const handler3 = () => -$count + const handler4 = () => ~$count ; () => (<> - - - -); + + + +); return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-unary-operators/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-unary-operators/expectedv2.ts index 4c8dd0a09..b63ffa3dd 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-unary-operators/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store-with-unary-operators/expectedv2.ts @@ -5,17 +5,17 @@ function render() { const count = writable(0)/*Ωignore_startΩ*/;let $count = __sveltets_1_store_get(count);/*Ωignore_endΩ*/; - const handler1 = () => !(__sveltets_1_store_get(count), $count) - const handler2 = () => +(__sveltets_1_store_get(count), $count) - const handler3 = () => -(__sveltets_1_store_get(count), $count) - const handler4 = () => ~(__sveltets_1_store_get(count), $count) + const handler1 = () => !$count + const handler2 = () => +$count + const handler3 = () => -$count + const handler4 = () => ~$count ; async () => { - { svelteHTML.createElement("button", { "onclick":() => !(__sveltets_1_store_get(count), $count),}); } - { svelteHTML.createElement("button", { "onclick":() => +(__sveltets_1_store_get(count), $count),}); } - { svelteHTML.createElement("button", { "onclick":() => -(__sveltets_1_store_get(count), $count),}); } - { svelteHTML.createElement("button", { "onclick":() => ~(__sveltets_1_store_get(count), $count),}); }}; + { svelteHTML.createElement("button", { "onclick":() => !$count,}); } + { svelteHTML.createElement("button", { "onclick":() => +$count,}); } + { svelteHTML.createElement("button", { "onclick":() => -$count,}); } + { svelteHTML.createElement("button", { "onclick":() => ~$count,}); }}; return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store/expected.tsx index ec947cd37..26a082df2 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store/expected.tsx @@ -1,8 +1,8 @@ /// <>;function render() { -b.set((__sveltets_1_store_get(b), $b).concat(5)); +$b=$b.concat(5); () => (<> -

b.set((__sveltets_1_store_get(b), $b).concat(5))}>{(__sveltets_1_store_get(b), $b)}

); +

$b=$b.concat(5)}>{$b}

); return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store/expectedv2.ts index 369c1d8ab..2ee7d1999 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$store/expectedv2.ts @@ -1,8 +1,8 @@ /// ;function render() { -b.set((__sveltets_1_store_get(b), $b).concat(5)); +$b=$b.concat(5); async () => { - { svelteHTML.createElement("h1", { "onclick":() => b.set((__sveltets_1_store_get(b), $b).concat(5)),});(__sveltets_1_store_get(b), $b); }}; + { svelteHTML.createElement("h1", { "onclick":() => $b=$b.concat(5),});$b; }}; return { props: {}, slots: {}, getters: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) { From f67d4b85918783418b01055796a31c8b1cc9c9b9 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 29 May 2022 22:09:05 +0200 Subject: [PATCH 03/16] find references --- .../features/FindReferencesProvider.ts | 36 +++++++++++-- .../src/language-service/find-references.ts | 52 ++++++++++++++++--- .../typescript-plugin/src/svelte-snapshots.ts | 2 +- 3 files changed, 79 insertions(+), 11 deletions(-) diff --git a/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts b/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts index b3c3b1e28..29fe72832 100644 --- a/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts @@ -5,7 +5,7 @@ import { flatten, pathToUrl } from '../../../utils'; import { FindReferencesProvider } from '../../interfaces'; import { LSAndTSDocResolver } from '../LSAndTSDocResolver'; import { convertToLocationRange, hasNonZeroRange } from '../utils'; -import { isNoTextSpanInGeneratedCode, SnapshotFragmentMap } from './utils'; +import { isInGeneratedCode, isNoTextSpanInGeneratedCode, SnapshotFragmentMap } from './utils'; export class FindReferencesProviderImpl implements FindReferencesProvider { constructor(private readonly lsAndTsDocResolver: LSAndTSDocResolver) {} @@ -18,19 +18,47 @@ export class FindReferencesProviderImpl implements FindReferencesProvider { const { lang, tsDoc } = await this.getLSAndTSDoc(document); const fragment = tsDoc.getFragment(); - const references = lang.findReferences( + const rawReferences = lang.findReferences( tsDoc.filePath, fragment.offsetAt(fragment.getGeneratedPosition(position)) ); - if (!references) { + if (!rawReferences) { return null; } + const references = flatten(rawReferences.map((ref) => ref.references)); + + const storeReference = references.find( + (ref) => + isInGeneratedCode( + tsDoc.getFullText(), + ref.textSpan.start, + ref.textSpan.start + ref.textSpan.length + ) && + // handle both cases of references triggered at store and triggered at $store + (tsDoc.getFullText().substring(ref.textSpan.start).startsWith('$') || + tsDoc + .getFullText() + .lastIndexOf('__sveltets_1_store_get(', ref.textSpan.start) === + ref.textSpan.start - '__sveltets_1_store_get('.length) + ); + if (storeReference) { + const storeReferences = + lang.findReferences( + tsDoc.filePath, + // handle both cases of references triggered at store and triggered at $store + tsDoc.getFullText().charAt(storeReference.textSpan.start) === '$' + ? tsDoc.getFullText().indexOf(');', storeReference.textSpan.start) - 1 + : tsDoc.getFullText().lastIndexOf(' =', storeReference.textSpan.start) - 1 + ) || []; + references.push(...flatten(storeReferences.map((ref) => ref.references))); + // TODO all $store usages in other Svelte files, too? + } const docs = new SnapshotFragmentMap(this.lsAndTsDocResolver); docs.set(tsDoc.filePath, { fragment, snapshot: tsDoc }); const locations = await Promise.all( - flatten(references.map((ref) => ref.references)) + references .filter((ref) => context.includeDeclaration || !ref.isDefinition) .filter(notInGeneratedCode(tsDoc.getFullText())) .map(async (ref) => { diff --git a/packages/typescript-plugin/src/language-service/find-references.ts b/packages/typescript-plugin/src/language-service/find-references.ts index 7d1c4ecf0..b88a61af8 100644 --- a/packages/typescript-plugin/src/language-service/find-references.ts +++ b/packages/typescript-plugin/src/language-service/find-references.ts @@ -18,6 +18,13 @@ function _decorateFindReferences( logger: Logger ) { const findReferences = ls.findReferences; + + const getReferences = (fileName: string, position: number): ts.ReferenceEntry[] | undefined => + findReferences(fileName, position)?.reduce( + (acc, curr) => acc.concat(curr.references), + [] + ); + ls.findReferences = (fileName, position) => { const references = findReferences(fileName, position); return references @@ -26,7 +33,12 @@ function _decorateFindReferences( if (!isSvelteFilePath(reference.definition.fileName) || !snapshot) { return { ...reference, - references: mapReferences(reference.references, snapshotManager, logger) + references: mapReferences( + reference.references, + snapshotManager, + logger, + getReferences + ) }; } @@ -34,7 +46,6 @@ function _decorateFindReferences( if (!textSpan) { return null; } - return { definition: { ...reference.definition, @@ -42,7 +53,12 @@ function _decorateFindReferences( // Spare the work for now originalTextSpan: undefined }, - references: mapReferences(reference.references, snapshotManager, logger) + references: mapReferences( + reference.references, + snapshotManager, + logger, + getReferences + ) }; }) .filter(isNotNullOrUndefined); @@ -57,16 +73,21 @@ function decorateGetReferencesAtPosition( const getReferencesAtPosition = ls.getReferencesAtPosition; ls.getReferencesAtPosition = (fileName, position) => { const references = getReferencesAtPosition(fileName, position); - return references && mapReferences(references, snapshotManager, logger); + return ( + references && + mapReferences(references, snapshotManager, logger, getReferencesAtPosition) + ); }; } function mapReferences( references: ts.ReferenceEntry[], snapshotManager: SvelteSnapshotManager, - logger: Logger + logger: Logger, + getReferences?: (fileName: string, position: number) => ts.ReferenceEntry[] | undefined ): ts.ReferenceEntry[] { - return references + const additionalStoreReferences: ts.ReferenceEntry[] = []; + const mappedReferences = references .map((reference) => { const snapshot = snapshotManager.get(reference.fileName); if (!isSvelteFilePath(reference.fileName) || !snapshot) { @@ -75,6 +96,24 @@ function mapReferences( const textSpan = snapshot.getOriginalTextSpan(reference.textSpan); if (!textSpan) { + if ( + getReferences && + snapshot + .getText() + .lastIndexOf('__sveltets_1_store_get(', reference.textSpan.start) === + reference.textSpan.start - '__sveltets_1_store_get('.length + ) { + additionalStoreReferences.push( + ...mapReferences( + getReferences( + reference.fileName, + snapshot.getText().lastIndexOf(' =', reference.textSpan.start) - 1 + ) || [], + snapshotManager, + logger + ) + ); + } return null; } @@ -95,4 +134,5 @@ function mapReferences( }; }) .filter(isNotNullOrUndefined); + return mappedReferences.concat(additionalStoreReferences); } diff --git a/packages/typescript-plugin/src/svelte-snapshots.ts b/packages/typescript-plugin/src/svelte-snapshots.ts index d1a3e5e78..ea2254d2a 100644 --- a/packages/typescript-plugin/src/svelte-snapshots.ts +++ b/packages/typescript-plugin/src/svelte-snapshots.ts @@ -218,7 +218,7 @@ export class SvelteSnapshot { this.convertInternalCodePositions = convertInternalCodePositions; } - private getText() { + getText() { const snapshot = this.scriptInfo?.getSnapshot(); if (!snapshot) { return ''; From 8bb8d696dae47fa1522678b8a83bda21348b42be Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 30 May 2022 10:44:51 +0200 Subject: [PATCH 04/16] diagnostics --- .../features/DiagnosticsProvider.ts | 38 +++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts b/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts index fecb9282d..adfa417f5 100644 --- a/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts @@ -82,9 +82,41 @@ export class DiagnosticsProviderImpl implements DiagnosticsProvider { ...lang.getSuggestionDiagnostics(tsDoc.filePath), ...lang.getSemanticDiagnostics(tsDoc.filePath) ]; - diagnostics = diagnostics - .filter(isNotGenerated(tsDoc.getText(0, tsDoc.getLength()))) - .filter(not(isUnusedReactiveStatementLabel)); + + const additionalStoreDiagnostics: ts.Diagnostic[] = []; + const notGenerated = isNotGenerated(tsDoc.getFullText()); + for (const diagnostic of diagnostics) { + if (!notGenerated(diagnostic)) { + if ( + tsDoc + .getFullText() + .lastIndexOf('__sveltets_1_store_get(', diagnostic.start!) === + diagnostic.start! - '__sveltets_1_store_get('.length + ) { + const storeName = tsDoc + .getFullText() + .substring(diagnostic.start!, diagnostic.start! + diagnostic.length!); + const storeUsages = lang.findReferences( + tsDoc.filePath, + tsDoc.getFullText().lastIndexOf(' =', diagnostic.start!) - 1 + )![0].references; + for (const storeUsage of storeUsages) { + additionalStoreDiagnostics.push({ + ...diagnostic, + messageText: `Cannot subscribe to '${storeName}', it's not a store.\n\n${ts.flattenDiagnosticMessageText( + diagnostic.messageText, + '\n' + )}`, + start: storeUsage.textSpan.start, + length: storeUsage.textSpan.length + }); + } + } + } + } + diagnostics.push(...additionalStoreDiagnostics); + + diagnostics = diagnostics.filter(notGenerated).filter(not(isUnusedReactiveStatementLabel)); diagnostics = resolveNoopsInReactiveStatements(lang, diagnostics); return diagnostics From 5ab1d3dfced5347a4c6fadf23b67a7cff58cdc53 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 30 May 2022 22:05:27 +0200 Subject: [PATCH 05/16] rename --- .../typescript/features/RenameProvider.ts | 92 ++++++++++++++----- .../src/language-service/rename.ts | 87 +++++++++++++----- 2 files changed, 135 insertions(+), 44 deletions(-) diff --git a/packages/language-server/src/plugins/typescript/features/RenameProvider.ts b/packages/language-server/src/plugins/typescript/features/RenameProvider.ts index 0c400e770..3684c7b71 100644 --- a/packages/language-server/src/plugins/typescript/features/RenameProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/RenameProvider.ts @@ -28,6 +28,11 @@ import { import { LSConfigManager } from '../../../ls-config'; import { isAttributeName, isEventHandler } from '../svelte-ast-utils'; +interface TsRenameLocation extends ts.RenameLocation { + range: Range; + newName?: string; +} + export class RenameProviderImpl implements RenameProvider { constructor( private readonly lsAndTsDocResolver: LSAndTSDocResolver, @@ -63,24 +68,64 @@ export class RenameProviderImpl implements RenameProvider { return null; } - const renameLocations = lang.findRenameLocations( - tsDoc.filePath, - offset, - false, - false, - true - ); + let renameLocations = lang.findRenameLocations(tsDoc.filePath, offset, false, false, true); if (!renameLocations) { return null; } const docs = new SnapshotFragmentMap(this.lsAndTsDocResolver); docs.set(tsDoc.filePath, { fragment, snapshot: tsDoc }); - let convertedRenameLocations: Array< - ts.RenameLocation & { - range: Range; + + let convertedRenameLocations: TsRenameLocation[] = await this.mapAndFilterRenameLocations( + renameLocations, + docs + ); + + for (const loc of renameLocations) { + const { snapshot } = await docs.retrieve(loc.fileName); + if (!isNoTextSpanInGeneratedCode(snapshot.getFullText(), loc.textSpan)) { + if ( + snapshot + .getFullText() + .lastIndexOf('__sveltets_1_store_get(', loc.textSpan.start) === + loc.textSpan.start - '__sveltets_1_store_get('.length + ) { + // User renamed $store, also rename corresponding store + const storeRenameLocations = lang.findRenameLocations( + snapshot.filePath, + snapshot.getFullText().lastIndexOf(' =', loc.textSpan.start) - 1, + false, + false, + true + ); + convertedRenameLocations.push( + ...(await this.mapAndFilterRenameLocations( + storeRenameLocations!, + docs, + `$${newName}` + )) + ); + // TODO once we allow providePrefixAndSuffixTextForRename to be configurable, + // we need to add one more step to update all other $store usages in other files + } else if (snapshot.getFullText().charAt(loc.textSpan.start) === '$') { + // User renamed store, also rename correspondig $store locations + const storeRenameLocations = lang.findRenameLocations( + snapshot.filePath, + snapshot.getFullText().indexOf(');', loc.textSpan.start) - 1, + false, + false, + true + ); + convertedRenameLocations.push( + ...(await this.mapAndFilterRenameLocations( + storeRenameLocations!, + docs, + newName.substring(1) + )) + ); + } } - > = await this.mapAndFilterRenameLocations(renameLocations, docs); + } convertedRenameLocations = this.checkShortHandBindingOrSlotLetLocation( lang, @@ -124,7 +169,8 @@ export class RenameProviderImpl implements RenameProvider { acc.changes[uri] = []; } acc.changes[uri].push({ - newText: (loc.prefixText || '') + newName + (loc.suffixText || ''), + newText: + (loc.prefixText || '') + (loc.newName || newName) + (loc.suffixText || ''), range: loc.range }); return acc; @@ -190,7 +236,7 @@ export class RenameProviderImpl implements RenameProvider { tsDoc: SvelteDocumentSnapshot, fragment: SvelteSnapshotFragment, position: Position, - convertedRenameLocations: Array, + convertedRenameLocations: TsRenameLocation[], fragments: SnapshotFragmentMap, lang: ts.LanguageService ) { @@ -246,7 +292,7 @@ export class RenameProviderImpl implements RenameProvider { * This additional logic/propagation is done in this method. */ private async getAdditionalLocationsForRenameOfPropInsideOtherComponent( - convertedRenameLocations: Array, + convertedRenameLocations: TsRenameLocation[], fragments: SnapshotFragmentMap, lang: ts.LanguageService ) { @@ -293,7 +339,7 @@ export class RenameProviderImpl implements RenameProvider { } private findLocationWhichWantsToUpdatePropName( - convertedRenameLocations: Array, + convertedRenameLocations: TsRenameLocation[], fragments: SnapshotFragmentMap ) { return convertedRenameLocations.find((loc) => { @@ -325,8 +371,9 @@ export class RenameProviderImpl implements RenameProvider { */ private async mapAndFilterRenameLocations( renameLocations: readonly ts.RenameLocation[], - fragments: SnapshotFragmentMap - ): Promise> { + fragments: SnapshotFragmentMap, + newName?: string + ): Promise { const mappedLocations = await Promise.all( renameLocations.map(async (loc) => { const { fragment, snapshot } = await fragments.retrieve(loc.fileName); @@ -334,7 +381,8 @@ export class RenameProviderImpl implements RenameProvider { if (isNoTextSpanInGeneratedCode(snapshot.getFullText(), loc.textSpan)) { return { ...loc, - range: this.mapRangeToOriginal(fragment, loc.textSpan) + range: this.mapRangeToOriginal(fragment, loc.textSpan), + newName }; } }) @@ -343,8 +391,8 @@ export class RenameProviderImpl implements RenameProvider { } private filterWrongRenameLocations( - mappedLocations: Array - ): Promise> { + mappedLocations: TsRenameLocation[] + ): Promise { return filterAsync(mappedLocations, async (loc) => { const snapshot = await this.getSnapshot(loc.fileName); if (!(snapshot instanceof SvelteDocumentSnapshot)) { @@ -408,9 +456,9 @@ export class RenameProviderImpl implements RenameProvider { private checkShortHandBindingOrSlotLetLocation( lang: ts.LanguageService, - renameLocations: Array, + renameLocations: TsRenameLocation[], fragments: SnapshotFragmentMap - ): Array { + ): TsRenameLocation[] { const bind = 'bind:'; return renameLocations.map((location) => { diff --git a/packages/typescript-plugin/src/language-service/rename.ts b/packages/typescript-plugin/src/language-service/rename.ts index 4d920b61c..096147be2 100644 --- a/packages/typescript-plugin/src/language-service/rename.ts +++ b/packages/typescript-plugin/src/language-service/rename.ts @@ -23,30 +23,73 @@ export function decorateRename( findInComments, providePrefixAndSuffixTextForRename ); - return renameLocations - ?.map((renameLocation) => { - const snapshot = snapshotManager.get(renameLocation.fileName); - if (!isSvelteFilePath(renameLocation.fileName) || !snapshot) { - return renameLocation; - } + if (!renameLocations) { + return undefined; + } - // TODO more needed to filter invalid locations, see RenameProvider - const textSpan = snapshot.getOriginalTextSpan(renameLocation.textSpan); - if (!textSpan) { - return null; - } + const convertedRenameLocations: ts.RenameLocation[] = []; + const additionalStoreRenameLocations: ts.RenameLocation[] = []; + + for (const renameLocation of renameLocations) { + const snapshot = snapshotManager.get(renameLocation.fileName); + if (!isSvelteFilePath(renameLocation.fileName) || !snapshot) { + convertedRenameLocations.push(renameLocation); + continue; + } - const converted = { - ...renameLocation, - textSpan - }; - if (converted.contextSpan) { - // Not important, spare the work - converted.contextSpan = undefined; + // TODO more needed to filter invalid locations, see RenameProvider + const textSpan = snapshot.getOriginalTextSpan(renameLocation.textSpan); + if (!textSpan) { + if ( + additionalStoreRenameLocations && + snapshot + .getText() + .lastIndexOf('__sveltets_1_store_get(', renameLocation.textSpan.start) === + renameLocation.textSpan.start - '__sveltets_1_store_get('.length + ) { + additionalStoreRenameLocations.push( + ...findRenameLocations( + renameLocation.fileName, + snapshot.getText().lastIndexOf(' =', renameLocation.textSpan.start) - 1, + false, + false, + false + )! + ); } - logger.debug('Converted rename location ', converted); - return converted; - }) - .filter(isNotNullOrUndefined); + continue; + } + + convertedRenameLocations.push(convert(renameLocation, textSpan)); + } + + for (const renameLocation of additionalStoreRenameLocations) { + // We know these are Svelte files + const snapshot = snapshotManager.get(renameLocation.fileName)!; + + const textSpan = snapshot.getOriginalTextSpan(renameLocation.textSpan); + if (!textSpan) { + continue; + } + + // |$store| would be renamed, make it $|store| + textSpan.start += 1; + convertedRenameLocations.push(convert(renameLocation, textSpan)); + } + + return convertedRenameLocations; }; + + function convert(renameLocation: ts.RenameLocation, textSpan: ts.TextSpan) { + const converted = { + ...renameLocation, + textSpan + }; + if (converted.contextSpan) { + // Not important, spare the work + converted.contextSpan = undefined; + } + logger.debug('Converted rename location ', converted); + return converted; + } } From a970c2d1555183c2b62279a7e041a03ec09592a7 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 30 May 2022 22:33:05 +0200 Subject: [PATCH 06/16] deduplicate and cleanup --- .../features/DiagnosticsProvider.ts | 13 +-- .../features/FindReferencesProvider.ts | 34 +++--- .../typescript/features/RenameProvider.ts | 19 ++-- .../src/plugins/typescript/features/utils.ts | 19 ++++ .../src/language-service/find-references.ts | 103 ++++++++++-------- .../src/language-service/rename.ts | 7 +- packages/typescript-plugin/src/utils.ts | 11 ++ 7 files changed, 126 insertions(+), 80 deletions(-) diff --git a/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts b/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts index adfa417f5..9ea2affe6 100644 --- a/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts @@ -17,7 +17,9 @@ import { findNodeAtSpan, isReactiveStatement, isInReactiveStatement, - gatherIdentifiers + gatherIdentifiers, + isInsideStoreGetShim, + get$storeDeclarationStart } from './utils'; import { not, flatten, passMap, regexIndexOf, swapRangeStartEndIfNecessary } from '../../../utils'; import { LSConfigManager } from '../../../ls-config'; @@ -87,18 +89,13 @@ export class DiagnosticsProviderImpl implements DiagnosticsProvider { const notGenerated = isNotGenerated(tsDoc.getFullText()); for (const diagnostic of diagnostics) { if (!notGenerated(diagnostic)) { - if ( - tsDoc - .getFullText() - .lastIndexOf('__sveltets_1_store_get(', diagnostic.start!) === - diagnostic.start! - '__sveltets_1_store_get('.length - ) { + if (isInsideStoreGetShim(tsDoc.getFullText(), diagnostic.start!)) { const storeName = tsDoc .getFullText() .substring(diagnostic.start!, diagnostic.start! + diagnostic.length!); const storeUsages = lang.findReferences( tsDoc.filePath, - tsDoc.getFullText().lastIndexOf(' =', diagnostic.start!) - 1 + get$storeDeclarationStart(tsDoc.getFullText(), diagnostic.start!) )![0].references; for (const storeUsage of storeUsages) { additionalStoreDiagnostics.push({ diff --git a/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts b/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts index 29fe72832..4824d60ca 100644 --- a/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts @@ -5,7 +5,14 @@ import { flatten, pathToUrl } from '../../../utils'; import { FindReferencesProvider } from '../../interfaces'; import { LSAndTSDocResolver } from '../LSAndTSDocResolver'; import { convertToLocationRange, hasNonZeroRange } from '../utils'; -import { isInGeneratedCode, isNoTextSpanInGeneratedCode, SnapshotFragmentMap } from './utils'; +import { + get$storeDeclarationStart, + getStoreGetShimVarStart, + is$storeDeclarationVar, + isInsideStoreGetShim, + isNoTextSpanInGeneratedCode, + SnapshotFragmentMap +} from './utils'; export class FindReferencesProviderImpl implements FindReferencesProvider { constructor(private readonly lsAndTsDocResolver: LSAndTSDocResolver) {} @@ -29,26 +36,25 @@ export class FindReferencesProviderImpl implements FindReferencesProvider { const storeReference = references.find( (ref) => - isInGeneratedCode( - tsDoc.getFullText(), - ref.textSpan.start, - ref.textSpan.start + ref.textSpan.length - ) && + !isNoTextSpanInGeneratedCode(tsDoc.getFullText(), ref.textSpan) && // handle both cases of references triggered at store and triggered at $store - (tsDoc.getFullText().substring(ref.textSpan.start).startsWith('$') || - tsDoc - .getFullText() - .lastIndexOf('__sveltets_1_store_get(', ref.textSpan.start) === - ref.textSpan.start - '__sveltets_1_store_get('.length) + (is$storeDeclarationVar(tsDoc.getFullText(), ref.textSpan.start) || + isInsideStoreGetShim(tsDoc.getFullText(), ref.textSpan.start)) ); if (storeReference) { const storeReferences = lang.findReferences( tsDoc.filePath, // handle both cases of references triggered at store and triggered at $store - tsDoc.getFullText().charAt(storeReference.textSpan.start) === '$' - ? tsDoc.getFullText().indexOf(');', storeReference.textSpan.start) - 1 - : tsDoc.getFullText().lastIndexOf(' =', storeReference.textSpan.start) - 1 + is$storeDeclarationVar(tsDoc.getFullText(), storeReference.textSpan.start) + ? getStoreGetShimVarStart( + tsDoc.getFullText(), + storeReference.textSpan.start + ) + : get$storeDeclarationStart( + tsDoc.getFullText(), + storeReference.textSpan.start + ) ) || []; references.push(...flatten(storeReferences.map((ref) => ref.references))); // TODO all $store usages in other Svelte files, too? diff --git a/packages/language-server/src/plugins/typescript/features/RenameProvider.ts b/packages/language-server/src/plugins/typescript/features/RenameProvider.ts index 3684c7b71..bb2914600 100644 --- a/packages/language-server/src/plugins/typescript/features/RenameProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/RenameProvider.ts @@ -23,7 +23,11 @@ import { isAfterSvelte2TsxPropsReturn, isNoTextSpanInGeneratedCode, SnapshotFragmentMap, - findContainingNode + findContainingNode, + isInsideStoreGetShim, + get$storeDeclarationStart, + getStoreGetShimVarStart, + is$storeDeclarationVar } from './utils'; import { LSConfigManager } from '../../../ls-config'; import { isAttributeName, isEventHandler } from '../svelte-ast-utils'; @@ -84,16 +88,11 @@ export class RenameProviderImpl implements RenameProvider { for (const loc of renameLocations) { const { snapshot } = await docs.retrieve(loc.fileName); if (!isNoTextSpanInGeneratedCode(snapshot.getFullText(), loc.textSpan)) { - if ( - snapshot - .getFullText() - .lastIndexOf('__sveltets_1_store_get(', loc.textSpan.start) === - loc.textSpan.start - '__sveltets_1_store_get('.length - ) { + if (isInsideStoreGetShim(snapshot.getFullText(), loc.textSpan.start)) { // User renamed $store, also rename corresponding store const storeRenameLocations = lang.findRenameLocations( snapshot.filePath, - snapshot.getFullText().lastIndexOf(' =', loc.textSpan.start) - 1, + get$storeDeclarationStart(snapshot.getFullText(), loc.textSpan.start), false, false, true @@ -107,11 +106,11 @@ export class RenameProviderImpl implements RenameProvider { ); // TODO once we allow providePrefixAndSuffixTextForRename to be configurable, // we need to add one more step to update all other $store usages in other files - } else if (snapshot.getFullText().charAt(loc.textSpan.start) === '$') { + } else if (is$storeDeclarationVar(snapshot.getFullText(), loc.textSpan.start)) { // User renamed store, also rename correspondig $store locations const storeRenameLocations = lang.findRenameLocations( snapshot.filePath, - snapshot.getFullText().indexOf(');', loc.textSpan.start) - 1, + getStoreGetShimVarStart(snapshot.getFullText(), loc.textSpan.start), false, false, true diff --git a/packages/language-server/src/plugins/typescript/features/utils.ts b/packages/language-server/src/plugins/typescript/features/utils.ts index 068993055..7318d1af5 100644 --- a/packages/language-server/src/plugins/typescript/features/utils.ts +++ b/packages/language-server/src/plugins/typescript/features/utils.ts @@ -101,6 +101,25 @@ export function isPartOfImportStatement(text: string, position: Position): boole return /\s*from\s+["'][^"']*/.test(line.slice(0, position.character)); } +export function isInsideStoreGetShim(text: string, varStart: number) { + return ( + text.lastIndexOf('__sveltets_1_store_get(', varStart) === + varStart - '__sveltets_1_store_get('.length + ); +} + +export function get$storeDeclarationStart(text: string, storePosition: number) { + return text.lastIndexOf(' =', storePosition) - 1; +} + +export function is$storeDeclarationVar(text: string, varStart: number) { + return text.charAt(varStart) === '$'; +} + +export function getStoreGetShimVarStart(text: string, $storeVarStart: number) { + return text.indexOf(');', $storeVarStart) - 1; +} + export class SnapshotFragmentMap { private map = new Map(); constructor(private resolver: LSAndTSDocResolver) {} diff --git a/packages/typescript-plugin/src/language-service/find-references.ts b/packages/typescript-plugin/src/language-service/find-references.ts index b88a61af8..093510c91 100644 --- a/packages/typescript-plugin/src/language-service/find-references.ts +++ b/packages/typescript-plugin/src/language-service/find-references.ts @@ -1,7 +1,12 @@ import type ts from 'typescript/lib/tsserverlibrary'; import { Logger } from '../logger'; import { SvelteSnapshotManager } from '../svelte-snapshots'; -import { isNotNullOrUndefined, isSvelteFilePath } from '../utils'; +import { + get$storeDeclarationStart, + isInsideStoreGetShim, + isNotNullOrUndefined, + isSvelteFilePath +} from '../utils'; export function decorateFindReferences( ls: ts.LanguageService, @@ -87,52 +92,58 @@ function mapReferences( getReferences?: (fileName: string, position: number) => ts.ReferenceEntry[] | undefined ): ts.ReferenceEntry[] { const additionalStoreReferences: ts.ReferenceEntry[] = []; - const mappedReferences = references - .map((reference) => { - const snapshot = snapshotManager.get(reference.fileName); - if (!isSvelteFilePath(reference.fileName) || !snapshot) { - return reference; - } + const mappedReferences: ts.ReferenceEntry[] = []; - const textSpan = snapshot.getOriginalTextSpan(reference.textSpan); - if (!textSpan) { - if ( - getReferences && - snapshot - .getText() - .lastIndexOf('__sveltets_1_store_get(', reference.textSpan.start) === - reference.textSpan.start - '__sveltets_1_store_get('.length - ) { - additionalStoreReferences.push( - ...mapReferences( - getReferences( - reference.fileName, - snapshot.getText().lastIndexOf(' =', reference.textSpan.start) - 1 - ) || [], - snapshotManager, - logger - ) - ); - } - return null; + for (const reference of references) { + const snapshot = snapshotManager.get(reference.fileName); + if (!isSvelteFilePath(reference.fileName) || !snapshot) { + mappedReferences.push(reference); + continue; + } + + const textSpan = snapshot.getOriginalTextSpan(reference.textSpan); + if (!textSpan) { + if ( + getReferences && + isInsideStoreGetShim(snapshot.getText(), reference.textSpan.start) + ) { + additionalStoreReferences.push( + ...(getReferences( + reference.fileName, + get$storeDeclarationStart(snapshot.getText(), reference.textSpan.start) + ) || []) + ); } + continue; + } + + mappedReferences.push(mapReference(reference, textSpan)); + } + + for (const reference of additionalStoreReferences) { + // We know these are Svelte files + const snapshot = snapshotManager.get(reference.fileName)!; + + const textSpan = snapshot.getOriginalTextSpan(reference.textSpan); + if (!textSpan) { + continue; + } + + mappedReferences.push(mapReference(reference, textSpan)); + } + + return mappedReferences; + + function mapReference(reference: ts.ReferenceEntry, textSpan: ts.TextSpan) { + logger.debug('Find references; map textSpan: changed', reference.textSpan, 'to', textSpan); - logger.debug( - 'Find references; map textSpan: changed', - reference.textSpan, - 'to', - textSpan - ); - - return { - ...reference, - textSpan, - // Spare the work for now - contextSpan: undefined, - originalTextSpan: undefined, - originalContextSpan: undefined - }; - }) - .filter(isNotNullOrUndefined); - return mappedReferences.concat(additionalStoreReferences); + return { + ...reference, + textSpan, + // Spare the work for now + contextSpan: undefined, + originalTextSpan: undefined, + originalContextSpan: undefined + }; + } } diff --git a/packages/typescript-plugin/src/language-service/rename.ts b/packages/typescript-plugin/src/language-service/rename.ts index 096147be2..689a31599 100644 --- a/packages/typescript-plugin/src/language-service/rename.ts +++ b/packages/typescript-plugin/src/language-service/rename.ts @@ -1,7 +1,7 @@ import type ts from 'typescript/lib/tsserverlibrary'; import { Logger } from '../logger'; import { SvelteSnapshotManager } from '../svelte-snapshots'; -import { isNotNullOrUndefined, isSvelteFilePath } from '../utils'; +import { get$storeDeclarationStart, isSvelteFilePath } from '../utils'; export function decorateRename( ls: ts.LanguageService, @@ -50,7 +50,10 @@ export function decorateRename( additionalStoreRenameLocations.push( ...findRenameLocations( renameLocation.fileName, - snapshot.getText().lastIndexOf(' =', renameLocation.textSpan.start) - 1, + get$storeDeclarationStart( + snapshot.getText(), + renameLocation.textSpan.start + ), false, false, false diff --git a/packages/typescript-plugin/src/utils.ts b/packages/typescript-plugin/src/utils.ts index 3bd98b8e8..5412e5ecc 100644 --- a/packages/typescript-plugin/src/utils.ts +++ b/packages/typescript-plugin/src/utils.ts @@ -73,3 +73,14 @@ export function getConfigPathForProject(project: ts.server.Project) { (project.getCompilerOptions() as any).configFilePath ); } + +export function isInsideStoreGetShim(text: string, varStart: number) { + return ( + text.lastIndexOf('__sveltets_1_store_get(', varStart) === + varStart - '__sveltets_1_store_get('.length + ); +} + +export function get$storeDeclarationStart(text: string, storePosition: number) { + return text.lastIndexOf(' =', storePosition) - 1; +} From ff3df08dc084a399c2ef0d3b2815634a7f8e7ad5 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 16 Jun 2022 21:22:06 +0200 Subject: [PATCH 07/16] fix go to definition --- .../src/plugins/typescript/TypeScriptPlugin.ts | 3 ++- .../plugins/typescript/TypescriptPlugin.test.ts | 16 ++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts b/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts index 6ec57f369..3eebf2241 100644 --- a/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts +++ b/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts @@ -348,7 +348,7 @@ export class TypeScriptPlugin return; } - const snapshot = await snapshots.retrieve(def.fileName); + let snapshot = await snapshots.retrieve(def.fileName); if (!isNoTextSpanInGeneratedCode(snapshot.getFullText(), def.textSpan)) { if (snapshot.getFullText().charAt(def.textSpan.start) !== '$') { @@ -359,6 +359,7 @@ export class TypeScriptPlugin tsDoc.filePath, tsDoc.getFullText().indexOf(');', def.textSpan.start) - 1 )!.definitions![0]; + snapshot = await snapshots.retrieve(def.fileName); } return LocationLink.create( diff --git a/packages/language-server/test/plugins/typescript/TypescriptPlugin.test.ts b/packages/language-server/test/plugins/typescript/TypescriptPlugin.test.ts index 91d3e3409..1b2ae1ad5 100644 --- a/packages/language-server/test/plugins/typescript/TypescriptPlugin.test.ts +++ b/packages/language-server/test/plugins/typescript/TypescriptPlugin.test.ts @@ -731,28 +731,28 @@ function test(useNewTransformation: boolean) { it('(within script simple)', async () => { await test$StoreDef( Position.create(7, 1), - Range.create(Position.create(7, 1), Position.create(7, 6)) + Range.create(Position.create(7, 0), Position.create(7, 6)) ); }); it('(within script if)', async () => { await test$StoreDef( Position.create(8, 7), - Range.create(Position.create(8, 5), Position.create(8, 10)) + Range.create(Position.create(8, 4), Position.create(8, 10)) ); }); it('(within template simple)', async () => { await test$StoreDef( Position.create(13, 3), - Range.create(Position.create(13, 2), Position.create(13, 7)) + Range.create(Position.create(13, 1), Position.create(13, 7)) ); }); it('(within template if)', async () => { await test$StoreDef( Position.create(14, 7), - Range.create(Position.create(14, 6), Position.create(14, 11)) + Range.create(Position.create(14, 5), Position.create(14, 11)) ); }); }); @@ -794,28 +794,28 @@ function test(useNewTransformation: boolean) { it('(within script simple)', async () => { await test$StoreDef( Position.create(9, 1), - Range.create(Position.create(9, 1), Position.create(9, 6)) + Range.create(Position.create(9, 0), Position.create(9, 6)) ); }); it('(within script if)', async () => { await test$StoreDef( Position.create(10, 7), - Range.create(Position.create(10, 5), Position.create(10, 10)) + Range.create(Position.create(10, 4), Position.create(10, 10)) ); }); it('(within template simple)', async () => { await test$StoreDef( Position.create(16, 3), - Range.create(Position.create(16, 2), Position.create(16, 7)) + Range.create(Position.create(16, 1), Position.create(16, 7)) ); }); it('(within template if)', async () => { await test$StoreDef( Position.create(17, 7), - Range.create(Position.create(17, 6), Position.create(17, 11)) + Range.create(Position.create(17, 5), Position.create(17, 11)) ); }); }); From 28804d5ad1540dfb5d79c48dc7d6206d44d858da Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 16 Jun 2022 22:16:36 +0200 Subject: [PATCH 08/16] fix rename --- .../typescript/features/RenameProvider.ts | 47 ++++++++++++------- .../features/RenameProvider.test.ts | 38 ++++++++++----- .../testfiles/rename/rename5.svelte | 1 + 3 files changed, 57 insertions(+), 29 deletions(-) diff --git a/packages/language-server/src/plugins/typescript/features/RenameProvider.ts b/packages/language-server/src/plugins/typescript/features/RenameProvider.ts index fe9877ebb..df79b0f7f 100644 --- a/packages/language-server/src/plugins/typescript/features/RenameProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/RenameProvider.ts @@ -61,7 +61,8 @@ export class RenameProviderImpl implements RenameProvider { const offset = tsDoc.offsetAt(tsDoc.getGeneratedPosition(position)); - if (!this.getRenameInfo(lang, tsDoc, document, position, offset)) { + const renameInfo = this.getRenameInfo(lang, tsDoc, document, position, offset); + if (!renameInfo) { return null; } @@ -75,14 +76,15 @@ export class RenameProviderImpl implements RenameProvider { let convertedRenameLocations: TsRenameLocation[] = await this.mapAndFilterRenameLocations( renameLocations, - docs + docs, + renameInfo.isStore ? `$${newName}` : undefined ); for (const loc of renameLocations) { const snapshot = await docs.retrieve(loc.fileName); if (!isNoTextSpanInGeneratedCode(snapshot.getFullText(), loc.textSpan)) { if (isInsideStoreGetShim(snapshot.getFullText(), loc.textSpan.start)) { - // User renamed $store, also rename corresponding store + // User renamed store, also rename correspondig $store locations const storeRenameLocations = lang.findRenameLocations( snapshot.filePath, get$storeDeclarationStart(snapshot.getFullText(), loc.textSpan.start), @@ -97,10 +99,8 @@ export class RenameProviderImpl implements RenameProvider { `$${newName}` )) ); - // TODO once we allow providePrefixAndSuffixTextForRename to be configurable, - // we need to add one more step to update all other $store usages in other files } else if (is$storeDeclarationVar(snapshot.getFullText(), loc.textSpan.start)) { - // User renamed store, also rename correspondig $store locations + // User renamed $store, also rename corresponding store const storeRenameLocations = lang.findRenameLocations( snapshot.filePath, getStoreGetShimVarStart(snapshot.getFullText(), loc.textSpan.start), @@ -109,12 +109,10 @@ export class RenameProviderImpl implements RenameProvider { true ); convertedRenameLocations.push( - ...(await this.mapAndFilterRenameLocations( - storeRenameLocations!, - docs, - newName.substring(1) - )) + ...(await this.mapAndFilterRenameLocations(storeRenameLocations!, docs)) ); + // TODO once we allow providePrefixAndSuffixTextForRename to be configurable, + // we need to add one more step to update all other $store usages in other files } } } @@ -161,6 +159,7 @@ export class RenameProviderImpl implements RenameProvider { } acc.changes[uri].push({ newText: + // TODO test for { $store } -> { $store: $store1 } that would otherwise fail (loc.prefixText || '') + (loc.newName || newName) + (loc.suffixText || ''), range: loc.range }); @@ -176,13 +175,11 @@ export class RenameProviderImpl implements RenameProvider { doc: Document, originalPosition: Position, generatedOffset: number - ): { - canRename: true; - kind: ts.ScriptElementKind; - displayName: string; - fullDisplayName: string; - triggerSpan: { start: number; length: number }; - } | null { + ): + | (ts.RenameInfoSuccess & { + isStore?: boolean; + }) + | null { // Don't allow renames in error-state, because then there is no generated svelte2tsx-code // and rename cannot work if (tsDoc.parserError) { @@ -212,6 +209,20 @@ export class RenameProviderImpl implements RenameProvider { return null; } + // If $store is renamed, only allow rename for $|store| + if (tsDoc.getFullText().charAt(renameInfo.triggerSpan.start) === '$') { + const definition = lang.getDefinitionAndBoundSpan(tsDoc.filePath, generatedOffset) + ?.definitions?.[0]; + if ( + definition && + !isNoTextSpanInGeneratedCode(tsDoc.getFullText(), definition.textSpan) + ) { + renameInfo.triggerSpan.start++; + renameInfo.triggerSpan.length--; + (renameInfo as any).isStore = true; + } + } + return renameInfo; } diff --git a/packages/language-server/test/plugins/typescript/features/RenameProvider.test.ts b/packages/language-server/test/plugins/typescript/features/RenameProvider.test.ts index a77c6e6cc..0df3e36c9 100644 --- a/packages/language-server/test/plugins/typescript/features/RenameProvider.test.ts +++ b/packages/language-server/test/plugins/typescript/features/RenameProvider.test.ts @@ -343,6 +343,9 @@ function test(useNewTransformation: boolean) { const { provider, renameDoc5 } = await setup(); const result = await provider.rename(renameDoc5, pos, 'store1'); + result?.changes?.[getUri('rename5.svelte')].sort( + (c1, c2) => c1.range.start.line - c2.range.start.line + ); assert.deepStrictEqual(result, { changes: { [getUri('rename5.svelte')]: [ @@ -360,11 +363,11 @@ function test(useNewTransformation: boolean) { } }, { - newText: 'store1', + newText: '$store1', range: { start: { line: 2, - character: 5 + character: 4 }, end: { line: 2, @@ -373,11 +376,11 @@ function test(useNewTransformation: boolean) { } }, { - newText: 'store1', + newText: '$store1', range: { start: { line: 3, - character: 8 + character: 7 }, end: { line: 3, @@ -386,27 +389,40 @@ function test(useNewTransformation: boolean) { } }, { - newText: 'store1', + newText: '$store: $store1', range: { start: { - line: 6, - character: 2 + line: 4, + character: 18 }, end: { - line: 6, - character: 7 + line: 4, + character: 24 } } }, { - newText: 'store1', + newText: '$store1', range: { start: { line: 7, - character: 6 + character: 1 }, end: { line: 7, + character: 7 + } + } + }, + { + newText: '$store1', + range: { + start: { + line: 8, + character: 5 + }, + end: { + line: 8, character: 11 } } diff --git a/packages/language-server/test/plugins/typescript/testfiles/rename/rename5.svelte b/packages/language-server/test/plugins/typescript/testfiles/rename/rename5.svelte index 831ce3a1d..da18db78f 100644 --- a/packages/language-server/test/plugins/typescript/testfiles/rename/rename5.svelte +++ b/packages/language-server/test/plugins/typescript/testfiles/rename/rename5.svelte @@ -2,6 +2,7 @@ let store = null; $store; if($store) {} + const foo = { $store }; {$store} From 2364c32b9c694a951b5d35005433288245df8733 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 19 Jun 2022 08:11:49 +0200 Subject: [PATCH 09/16] fix tests --- .../features/DiagnosticsProvider.ts | 2 +- .../features/FindReferencesProvider.ts | 11 ++++++- .../typescript/features/HoverProvider.ts | 19 +---------- .../features/FindReferencesProvider.test.ts | 6 ++-- .../typescript/features/HoverProvider.test.ts | 8 ++--- .../fixtures/$store-bind/expected.json | 2 +- .../fixtures/$store-bind/expectedv2.json | 2 +- .../fixtures/$store-wrong-usage/expected.json | 32 +++++++++---------- .../$store-wrong-usage/expectedv2.json | 32 +++++++++---------- 9 files changed, 53 insertions(+), 61 deletions(-) diff --git a/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts b/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts index 80822d30a..b28a44b68 100644 --- a/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts @@ -98,7 +98,7 @@ export class DiagnosticsProviderImpl implements DiagnosticsProvider { for (const storeUsage of storeUsages) { additionalStoreDiagnostics.push({ ...diagnostic, - messageText: `Cannot subscribe to '${storeName}', it's not a store.\n\n${ts.flattenDiagnosticMessageText( + messageText: `Cannot use '${storeName}' as a store. '${storeName}' needs to be an object with a subscribe method on it.\n\n${ts.flattenDiagnosticMessageText( diagnostic.messageText, '\n' )}`, diff --git a/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts b/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts index 9657d366f..96d08533b 100644 --- a/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts @@ -88,7 +88,16 @@ export class FindReferencesProviderImpl implements FindReferencesProvider { }) ); - return locations.filter(isNotNullOrUndefined); + return ( + locations + .filter(isNotNullOrUndefined) + // Possible $store references are added afterwards, sort for correct order + .sort( + (l1, l2) => + (l1.range.start.line - l2.range.start.line) * 10000 + + (l1.range.start.character - l2.range.start.character) + ) + ); } private async getLSAndTSDoc(document: Document) { diff --git a/packages/language-server/src/plugins/typescript/features/HoverProvider.ts b/packages/language-server/src/plugins/typescript/features/HoverProvider.ts index 869f71380..723914345 100644 --- a/packages/language-server/src/plugins/typescript/features/HoverProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/HoverProvider.ts @@ -25,23 +25,6 @@ export class HoverProviderImpl implements HoverProvider { return null; } - const textSpan = info.textSpan; - - // show docs of $store instead of store if necessary - const is$store = tsDoc - .getFullText() - .substring(0, info.textSpan.start) - .endsWith('(__sveltets_1_store_get('); - if (is$store) { - const infoFor$store = lang.getQuickInfoAtPosition( - tsDoc.filePath, - textSpan.start + textSpan.length + 3 - ); - if (infoFor$store) { - info = infoFor$store; - } - } - const declaration = ts.displayPartsToString(info.displayParts); const documentation = getMarkdownDocumentation(info.documentation, info.tags); @@ -51,7 +34,7 @@ export class HoverProviderImpl implements HoverProvider { .join('\n'); return mapObjWithRangeToOriginal(tsDoc, { - range: convertRange(tsDoc, textSpan), + range: convertRange(tsDoc, info.textSpan), contents }); } diff --git a/packages/language-server/test/plugins/typescript/features/FindReferencesProvider.test.ts b/packages/language-server/test/plugins/typescript/features/FindReferencesProvider.test.ts index d0e91389d..bc6fe030b 100644 --- a/packages/language-server/test/plugins/typescript/features/FindReferencesProvider.test.ts +++ b/packages/language-server/test/plugins/typescript/features/FindReferencesProvider.test.ts @@ -114,7 +114,7 @@ function test(useNewTransformation: boolean) { line: 2 }, start: { - character: 9, + character: 8, line: 2 } }, @@ -127,7 +127,7 @@ function test(useNewTransformation: boolean) { line: 3 }, start: { - character: 9, + character: 8, line: 3 } }, @@ -140,7 +140,7 @@ function test(useNewTransformation: boolean) { line: 7 }, start: { - character: 2, + character: 1, line: 7 } }, diff --git a/packages/language-server/test/plugins/typescript/features/HoverProvider.test.ts b/packages/language-server/test/plugins/typescript/features/HoverProvider.test.ts index d04b551eb..80e876db4 100644 --- a/packages/language-server/test/plugins/typescript/features/HoverProvider.test.ts +++ b/packages/language-server/test/plugins/typescript/features/HoverProvider.test.ts @@ -124,7 +124,7 @@ function test(useNewTransformation: boolean) { line: 3 }, start: { - character: 5, + character: 4, line: 3 } } @@ -137,7 +137,7 @@ function test(useNewTransformation: boolean) { line: 5 }, start: { - character: 9, + character: 8, line: 5 } } @@ -167,7 +167,7 @@ function test(useNewTransformation: boolean) { line: 10 }, start: { - character: 2, + character: 1, line: 10 } } @@ -182,7 +182,7 @@ function test(useNewTransformation: boolean) { line: 12 }, start: { - character: 6, + character: 5, line: 12 } } diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-bind/expected.json b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-bind/expected.json index 79d969cee..bafdd2632 100644 --- a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-bind/expected.json +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-bind/expected.json @@ -1,7 +1,7 @@ [ { "range": { - "start": { "line": 19, "character": 33 }, + "start": { "line": 19, "character": 24 }, "end": { "line": 19, "character": 34 } }, "severity": 1, diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-bind/expectedv2.json b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-bind/expectedv2.json index 79d969cee..bafdd2632 100644 --- a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-bind/expectedv2.json +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-bind/expectedv2.json @@ -1,7 +1,7 @@ [ { "range": { - "start": { "line": 19, "character": 33 }, + "start": { "line": 19, "character": 24 }, "end": { "line": 19, "character": 34 } }, "severity": 1, diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-wrong-usage/expected.json b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-wrong-usage/expected.json index 74b43647c..2b3c11d5f 100644 --- a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-wrong-usage/expected.json +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-wrong-usage/expected.json @@ -1,55 +1,55 @@ [ { - "range": { "start": { "line": 6, "character": 1 }, "end": { "line": 6, "character": 6 } }, + "range": { "start": { "line": 8, "character": 0 }, "end": { "line": 8, "character": 14 } }, "severity": 1, "source": "ts", - "message": "No overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", + "message": "Cannot use 'noStoreModule' as a store. 'noStoreModule' needs to be an object with a subscribe method on it.\n\nNo overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", "code": 2769, "tags": [] }, { - "range": { "start": { "line": 7, "character": 4 }, "end": { "line": 7, "character": 9 } }, + "range": { + "start": { "line": 15, "character": 1 }, + "end": { "line": 15, "character": 15 } + }, "severity": 1, "source": "ts", - "message": "No overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", + "message": "Cannot use 'noStoreModule' as a store. 'noStoreModule' needs to be an object with a subscribe method on it.\n\nNo overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", "code": 2769, "tags": [] }, { - "range": { "start": { "line": 8, "character": 1 }, "end": { "line": 8, "character": 14 } }, + "range": { "start": { "line": 6, "character": 0 }, "end": { "line": 6, "character": 6 } }, "severity": 1, "source": "ts", - "message": "No overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", + "message": "Cannot use 'store' as a store. 'store' needs to be an object with a subscribe method on it.\n\nNo overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", "code": 2769, "tags": [] }, { - "range": { "start": { "line": 11, "character": 2 }, "end": { "line": 11, "character": 7 } }, + "range": { "start": { "line": 7, "character": 3 }, "end": { "line": 7, "character": 9 } }, "severity": 1, "source": "ts", - "message": "No overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", + "message": "Cannot use 'store' as a store. 'store' needs to be an object with a subscribe method on it.\n\nNo overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", "code": 2769, "tags": [] }, { - "range": { - "start": { "line": 12, "character": 6 }, - "end": { "line": 12, "character": 11 } - }, + "range": { "start": { "line": 11, "character": 1 }, "end": { "line": 11, "character": 7 } }, "severity": 1, "source": "ts", - "message": "No overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", + "message": "Cannot use 'store' as a store. 'store' needs to be an object with a subscribe method on it.\n\nNo overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", "code": 2769, "tags": [] }, { "range": { - "start": { "line": 15, "character": 2 }, - "end": { "line": 15, "character": 15 } + "start": { "line": 12, "character": 5 }, + "end": { "line": 12, "character": 11 } }, "severity": 1, "source": "ts", - "message": "No overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", + "message": "Cannot use 'store' as a store. 'store' needs to be an object with a subscribe method on it.\n\nNo overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", "code": 2769, "tags": [] } diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-wrong-usage/expectedv2.json b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-wrong-usage/expectedv2.json index 74b43647c..2b3c11d5f 100644 --- a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-wrong-usage/expectedv2.json +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-wrong-usage/expectedv2.json @@ -1,55 +1,55 @@ [ { - "range": { "start": { "line": 6, "character": 1 }, "end": { "line": 6, "character": 6 } }, + "range": { "start": { "line": 8, "character": 0 }, "end": { "line": 8, "character": 14 } }, "severity": 1, "source": "ts", - "message": "No overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", + "message": "Cannot use 'noStoreModule' as a store. 'noStoreModule' needs to be an object with a subscribe method on it.\n\nNo overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", "code": 2769, "tags": [] }, { - "range": { "start": { "line": 7, "character": 4 }, "end": { "line": 7, "character": 9 } }, + "range": { + "start": { "line": 15, "character": 1 }, + "end": { "line": 15, "character": 15 } + }, "severity": 1, "source": "ts", - "message": "No overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", + "message": "Cannot use 'noStoreModule' as a store. 'noStoreModule' needs to be an object with a subscribe method on it.\n\nNo overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", "code": 2769, "tags": [] }, { - "range": { "start": { "line": 8, "character": 1 }, "end": { "line": 8, "character": 14 } }, + "range": { "start": { "line": 6, "character": 0 }, "end": { "line": 6, "character": 6 } }, "severity": 1, "source": "ts", - "message": "No overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", + "message": "Cannot use 'store' as a store. 'store' needs to be an object with a subscribe method on it.\n\nNo overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", "code": 2769, "tags": [] }, { - "range": { "start": { "line": 11, "character": 2 }, "end": { "line": 11, "character": 7 } }, + "range": { "start": { "line": 7, "character": 3 }, "end": { "line": 7, "character": 9 } }, "severity": 1, "source": "ts", - "message": "No overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", + "message": "Cannot use 'store' as a store. 'store' needs to be an object with a subscribe method on it.\n\nNo overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", "code": 2769, "tags": [] }, { - "range": { - "start": { "line": 12, "character": 6 }, - "end": { "line": 12, "character": 11 } - }, + "range": { "start": { "line": 11, "character": 1 }, "end": { "line": 11, "character": 7 } }, "severity": 1, "source": "ts", - "message": "No overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", + "message": "Cannot use 'store' as a store. 'store' needs to be an object with a subscribe method on it.\n\nNo overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", "code": 2769, "tags": [] }, { "range": { - "start": { "line": 15, "character": 2 }, - "end": { "line": 15, "character": 15 } + "start": { "line": 12, "character": 5 }, + "end": { "line": 12, "character": 11 } }, "severity": 1, "source": "ts", - "message": "No overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", + "message": "Cannot use 'store' as a store. 'store' needs to be an object with a subscribe method on it.\n\nNo overload matches this call.\n Overload 1 of 2, '(store: SvelteStore): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.\n Overload 2 of 2, '(store: SvelteStore | null | undefined): any', gave the following error.\n Argument of type 'string' is not assignable to parameter of type 'SvelteStore'.", "code": 2769, "tags": [] } From 1f86ed73b6654f39719a36ce94d8dda8420508ae Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 19 Jun 2022 08:53:45 +0200 Subject: [PATCH 10/16] tidy up --- .../plugins/typescript/TypeScriptPlugin.ts | 5 +- .../features/CodeActionsProvider.ts | 4 +- .../features/DiagnosticsProvider.ts | 8 +- .../FindComponentReferencesProvider.ts | 4 +- .../features/FindReferencesProvider.ts | 146 ++++++++++-------- .../features/ImplementationProvider.ts | 4 +- .../typescript/features/RenameProvider.ts | 116 +++++++------- .../features/TypeDefinitionProvider.ts | 4 +- .../src/plugins/typescript/features/utils.ts | 16 +- packages/language-server/src/utils.ts | 5 + 10 files changed, 177 insertions(+), 135 deletions(-) diff --git a/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts b/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts index 3eebf2241..93e00dc09 100644 --- a/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts +++ b/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts @@ -68,7 +68,7 @@ import { SemanticTokensProviderImpl } from './features/SemanticTokensProvider'; import { SignatureHelpProviderImpl } from './features/SignatureHelpProvider'; import { TypeDefinitionProviderImpl } from './features/TypeDefinitionProvider'; import { UpdateImportsProviderImpl } from './features/UpdateImportsProvider'; -import { isNoTextSpanInGeneratedCode, SnapshotMap } from './features/utils'; +import { isTextSpanInGeneratedCode, SnapshotMap } from './features/utils'; import { LSAndTSDocResolver } from './LSAndTSDocResolver'; import { ignoredBuildDirectories } from './SnapshotManager'; import { isAttributeName, isAttributeShorthand, isEventHandler } from './svelte-ast-utils'; @@ -350,7 +350,8 @@ export class TypeScriptPlugin let snapshot = await snapshots.retrieve(def.fileName); - if (!isNoTextSpanInGeneratedCode(snapshot.getFullText(), def.textSpan)) { + // Go from generated $store to store if user wants to find definition for $store + if (isTextSpanInGeneratedCode(snapshot.getFullText(), def.textSpan)) { if (snapshot.getFullText().charAt(def.textSpan.start) !== '$') { return; } diff --git a/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts b/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts index 11cafb8de..7f7ec40bb 100644 --- a/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts @@ -25,7 +25,7 @@ import { DocumentSnapshot, SvelteDocumentSnapshot } from '../DocumentSnapshot'; import { LSAndTSDocResolver } from '../LSAndTSDocResolver'; import { changeSvelteComponentName, convertRange } from '../utils'; import { CompletionsProviderImpl } from './CompletionProvider'; -import { findContainingNode, isNoTextSpanInGeneratedCode, SnapshotMap } from './utils'; +import { findContainingNode, isTextSpanInGeneratedCode, SnapshotMap } from './utils'; /** * TODO change this to protocol constant if it's part of the protocol @@ -289,7 +289,7 @@ export class CodeActionsProviderImpl implements CodeActionsProvider { ); } - if (!isNoTextSpanInGeneratedCode(snapshot.getFullText(), edit.span)) { + if (isTextSpanInGeneratedCode(snapshot.getFullText(), edit.span)) { return undefined; } diff --git a/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts b/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts index b28a44b68..82fff2002 100644 --- a/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts @@ -18,8 +18,8 @@ import { isReactiveStatement, isInReactiveStatement, gatherIdentifiers, - isInsideStoreGetShim, - get$storeDeclarationStart + isStoreVariableIn$storeDeclaration, + get$storeOffsetOf$storeDeclaration } from './utils'; import { not, flatten, passMap, regexIndexOf, swapRangeStartEndIfNecessary } from '../../../utils'; import { LSConfigManager } from '../../../ls-config'; @@ -87,13 +87,13 @@ export class DiagnosticsProviderImpl implements DiagnosticsProvider { const notGenerated = isNotGenerated(tsDoc.getFullText()); for (const diagnostic of diagnostics) { if (!notGenerated(diagnostic)) { - if (isInsideStoreGetShim(tsDoc.getFullText(), diagnostic.start!)) { + if (isStoreVariableIn$storeDeclaration(tsDoc.getFullText(), diagnostic.start!)) { const storeName = tsDoc .getFullText() .substring(diagnostic.start!, diagnostic.start! + diagnostic.length!); const storeUsages = lang.findReferences( tsDoc.filePath, - get$storeDeclarationStart(tsDoc.getFullText(), diagnostic.start!) + get$storeOffsetOf$storeDeclaration(tsDoc.getFullText(), diagnostic.start!) )![0].references; for (const storeUsage of storeUsages) { additionalStoreDiagnostics.push({ diff --git a/packages/language-server/src/plugins/typescript/features/FindComponentReferencesProvider.ts b/packages/language-server/src/plugins/typescript/features/FindComponentReferencesProvider.ts index 3322c38d4..38fe88818 100644 --- a/packages/language-server/src/plugins/typescript/features/FindComponentReferencesProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/FindComponentReferencesProvider.ts @@ -4,7 +4,7 @@ import { FindComponentReferencesProvider } from '../../interfaces'; import { DocumentSnapshot, SvelteDocumentSnapshot } from '../DocumentSnapshot'; import { LSAndTSDocResolver } from '../LSAndTSDocResolver'; import { convertToLocationRange, hasNonZeroRange } from '../utils'; -import { isNoTextSpanInGeneratedCode, SnapshotMap } from './utils'; +import { isTextSpanInGeneratedCode, SnapshotMap } from './utils'; const COMPONENT_SUFFIX = '__SvelteComponent_'; @@ -40,7 +40,7 @@ export class FindComponentReferencesProviderImpl implements FindComponentReferen const snapshot = await snapshots.retrieve(ref.fileName); - if (!isNoTextSpanInGeneratedCode(snapshot.getFullText(), ref.textSpan)) { + if (isTextSpanInGeneratedCode(snapshot.getFullText(), ref.textSpan)) { return null; } diff --git a/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts b/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts index 96d08533b..4d4e88f48 100644 --- a/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts @@ -1,15 +1,17 @@ +import type ts from 'typescript'; import { Location, Position, ReferenceContext } from 'vscode-languageserver'; import { Document } from '../../../lib/documents'; import { flatten, isNotNullOrUndefined, pathToUrl } from '../../../utils'; import { FindReferencesProvider } from '../../interfaces'; +import { SvelteDocumentSnapshot } from '../DocumentSnapshot'; import { LSAndTSDocResolver } from '../LSAndTSDocResolver'; import { convertToLocationRange, hasNonZeroRange } from '../utils'; import { - get$storeDeclarationStart, - getStoreGetShimVarStart, - is$storeDeclarationVar, - isInsideStoreGetShim, - isNoTextSpanInGeneratedCode, + get$storeOffsetOf$storeDeclaration, + getStoreOffsetOf$storeDeclaration, + is$storeVariable, + isStoreVariableIn$storeDeclaration, + isTextSpanInGeneratedCode, SnapshotMap } from './utils'; @@ -30,77 +32,99 @@ export class FindReferencesProviderImpl implements FindReferencesProvider { if (!rawReferences) { return null; } - const references = flatten(rawReferences.map((ref) => ref.references)); - const storeReference = references.find( - (ref) => - !isNoTextSpanInGeneratedCode(tsDoc.getFullText(), ref.textSpan) && - // handle both cases of references triggered at store and triggered at $store - (is$storeDeclarationVar(tsDoc.getFullText(), ref.textSpan.start) || - isInsideStoreGetShim(tsDoc.getFullText(), ref.textSpan.start)) - ); - if (storeReference) { - const storeReferences = - lang.findReferences( - tsDoc.filePath, - // handle both cases of references triggered at store and triggered at $store - is$storeDeclarationVar(tsDoc.getFullText(), storeReference.textSpan.start) - ? getStoreGetShimVarStart( - tsDoc.getFullText(), - storeReference.textSpan.start - ) - : get$storeDeclarationStart( - tsDoc.getFullText(), - storeReference.textSpan.start - ) - ) || []; - references.push(...flatten(storeReferences.map((ref) => ref.references))); - // TODO all $store usages in other Svelte files, too? - } + const references = flatten(rawReferences.map((ref) => ref.references)); + references.push(...this.enhanceStoreReferences(references, tsDoc, lang)); const snapshots = new SnapshotMap(this.lsAndTsDocResolver); snapshots.set(tsDoc.filePath, tsDoc); - const locations = await Promise.all( - references.map(async (ref) => { - if (!context.includeDeclaration && ref.isDefinition) { - return null; - } - - const snapshot = await snapshots.retrieve(ref.fileName); - - if (!isNoTextSpanInGeneratedCode(snapshot.getFullText(), ref.textSpan)) { - return null; - } - - const location = Location.create( - pathToUrl(ref.fileName), - convertToLocationRange(snapshot, ref.textSpan) - ); - - // Some references are in generated code but not wrapped with explicit ignore comments. - // These show up as zero-length ranges, so filter them out. - if (!hasNonZeroRange(location)) { - return null; - } - - return location; - }) + references.map(async (ref) => this.mapReference(ref, context, snapshots)) ); return ( locations .filter(isNotNullOrUndefined) // Possible $store references are added afterwards, sort for correct order - .sort( - (l1, l2) => - (l1.range.start.line - l2.range.start.line) * 10000 + - (l1.range.start.character - l2.range.start.character) - ) + .sort(sortLocationByRange) ); } + /** + * If references of a $store are searched, also find references for the corresponding store + * and vice versa. + */ + private enhanceStoreReferences( + references: ts.ReferencedSymbolEntry[], + tsDoc: SvelteDocumentSnapshot, + lang: ts.LanguageService + ): ts.ReferencedSymbolEntry[] { + const storeReference = references.find( + (ref) => + isTextSpanInGeneratedCode(tsDoc.getFullText(), ref.textSpan) && + // handle both cases of references triggered at store and triggered at $store + (is$storeVariable(tsDoc.getFullText(), ref.textSpan.start) || + isStoreVariableIn$storeDeclaration(tsDoc.getFullText(), ref.textSpan.start)) + ); + if (!storeReference) { + return []; + } + + const storeReferences = + lang.findReferences( + tsDoc.filePath, + // handle both cases of references triggered at store and triggered at $store + is$storeVariable(tsDoc.getFullText(), storeReference.textSpan.start) + ? getStoreOffsetOf$storeDeclaration( + tsDoc.getFullText(), + storeReference.textSpan.start + ) + : get$storeOffsetOf$storeDeclaration( + tsDoc.getFullText(), + storeReference.textSpan.start + ) + ) || []; + return flatten(storeReferences.map((ref) => ref.references)); + // TODO all $store usages in other Svelte files, too? + } + + private async mapReference( + ref: ts.ReferencedSymbolEntry, + context: ReferenceContext, + snapshots: SnapshotMap + ) { + if (!context.includeDeclaration && ref.isDefinition) { + return null; + } + + const snapshot = await snapshots.retrieve(ref.fileName); + + if (isTextSpanInGeneratedCode(snapshot.getFullText(), ref.textSpan)) { + return null; + } + + const location = Location.create( + pathToUrl(ref.fileName), + convertToLocationRange(snapshot, ref.textSpan) + ); + + // Some references are in generated code but not wrapped with explicit ignore comments. + // These show up as zero-length ranges, so filter them out. + if (!hasNonZeroRange(location)) { + return null; + } + + return location; + } + private async getLSAndTSDoc(document: Document) { return this.lsAndTsDocResolver.getLSAndTSDoc(document); } } + +function sortLocationByRange(l1: Location, l2: Location): number { + return ( + (l1.range.start.line - l2.range.start.line) * 10000 + + (l1.range.start.character - l2.range.start.character) + ); +} diff --git a/packages/language-server/src/plugins/typescript/features/ImplementationProvider.ts b/packages/language-server/src/plugins/typescript/features/ImplementationProvider.ts index 29d1a9a85..1baba21a5 100644 --- a/packages/language-server/src/plugins/typescript/features/ImplementationProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/ImplementationProvider.ts @@ -4,7 +4,7 @@ import { pathToUrl, isNotNullOrUndefined } from '../../../utils'; import { ImplementationProvider } from '../../interfaces'; import { LSAndTSDocResolver } from '../LSAndTSDocResolver'; import { convertRange } from '../utils'; -import { isNoTextSpanInGeneratedCode, SnapshotMap } from './utils'; +import { isTextSpanInGeneratedCode, SnapshotMap } from './utils'; export class ImplementationProviderImpl implements ImplementationProvider { constructor(private readonly lsAndTsDocResolver: LSAndTSDocResolver) {} @@ -25,7 +25,7 @@ export class ImplementationProviderImpl implements ImplementationProvider { implementations.map(async (implementation) => { const snapshot = await snapshots.retrieve(implementation.fileName); - if (!isNoTextSpanInGeneratedCode(snapshot.getFullText(), implementation.textSpan)) { + if (isTextSpanInGeneratedCode(snapshot.getFullText(), implementation.textSpan)) { return; } diff --git a/packages/language-server/src/plugins/typescript/features/RenameProvider.ts b/packages/language-server/src/plugins/typescript/features/RenameProvider.ts index df79b0f7f..806954ea4 100644 --- a/packages/language-server/src/plugins/typescript/features/RenameProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/RenameProvider.ts @@ -6,23 +6,22 @@ import { getNodeIfIsInStartTag, isInHTMLTagRange } from '../../../lib/documents'; -import { filterAsync, isNotNullOrUndefined, pathToUrl } from '../../../utils'; +import { filterAsync, isNotNullOrUndefined, pathToUrl, unique } from '../../../utils'; import { RenameProvider } from '../../interfaces'; import { DocumentSnapshot, SvelteDocumentSnapshot } from '../DocumentSnapshot'; import { convertRange } from '../utils'; import { LSAndTSDocResolver } from '../LSAndTSDocResolver'; import ts from 'typescript'; -import { uniqWith, isEqual } from 'lodash'; import { isComponentAtPosition, isAfterSvelte2TsxPropsReturn, - isNoTextSpanInGeneratedCode, + isTextSpanInGeneratedCode, SnapshotMap, findContainingNode, - isInsideStoreGetShim, - get$storeDeclarationStart, - getStoreGetShimVarStart, - is$storeDeclarationVar + isStoreVariableIn$storeDeclaration, + get$storeOffsetOf$storeDeclaration, + getStoreOffsetOf$storeDeclaration, + is$storeVariable } from './utils'; import { LSConfigManager } from '../../../ls-config'; import { isAttributeName, isEventHandler } from '../svelte-ast-utils'; @@ -80,42 +79,9 @@ export class RenameProviderImpl implements RenameProvider { renameInfo.isStore ? `$${newName}` : undefined ); - for (const loc of renameLocations) { - const snapshot = await docs.retrieve(loc.fileName); - if (!isNoTextSpanInGeneratedCode(snapshot.getFullText(), loc.textSpan)) { - if (isInsideStoreGetShim(snapshot.getFullText(), loc.textSpan.start)) { - // User renamed store, also rename correspondig $store locations - const storeRenameLocations = lang.findRenameLocations( - snapshot.filePath, - get$storeDeclarationStart(snapshot.getFullText(), loc.textSpan.start), - false, - false, - true - ); - convertedRenameLocations.push( - ...(await this.mapAndFilterRenameLocations( - storeRenameLocations!, - docs, - `$${newName}` - )) - ); - } else if (is$storeDeclarationVar(snapshot.getFullText(), loc.textSpan.start)) { - // User renamed $store, also rename corresponding store - const storeRenameLocations = lang.findRenameLocations( - snapshot.filePath, - getStoreGetShimVarStart(snapshot.getFullText(), loc.textSpan.start), - false, - false, - true - ); - convertedRenameLocations.push( - ...(await this.mapAndFilterRenameLocations(storeRenameLocations!, docs)) - ); - // TODO once we allow providePrefixAndSuffixTextForRename to be configurable, - // we need to add one more step to update all other $store usages in other files - } - } - } + convertedRenameLocations.push( + ...(await this.enhanceRenamesInCaseOf$Store(renameLocations, newName, docs, lang)) + ); convertedRenameLocations = this.checkShortHandBindingOrSlotLetLocation( lang, @@ -213,10 +179,7 @@ export class RenameProviderImpl implements RenameProvider { if (tsDoc.getFullText().charAt(renameInfo.triggerSpan.start) === '$') { const definition = lang.getDefinitionAndBoundSpan(tsDoc.filePath, generatedOffset) ?.definitions?.[0]; - if ( - definition && - !isNoTextSpanInGeneratedCode(tsDoc.getFullText(), definition.textSpan) - ) { + if (definition && isTextSpanInGeneratedCode(tsDoc.getFullText(), definition.textSpan)) { renameInfo.triggerSpan.start++; renameInfo.triggerSpan.length--; (renameInfo as any).isStore = true; @@ -226,6 +189,59 @@ export class RenameProviderImpl implements RenameProvider { return renameInfo; } + /** + * If the user renames a store variable, we need to rename the corresponding $store variables + * and vice versa. + */ + private async enhanceRenamesInCaseOf$Store( + renameLocations: readonly ts.RenameLocation[], + newName: string, + docs: SnapshotMap, + lang: ts.LanguageService + ): Promise { + for (const loc of renameLocations) { + const snapshot = await docs.retrieve(loc.fileName); + if (isTextSpanInGeneratedCode(snapshot.getFullText(), loc.textSpan)) { + if ( + isStoreVariableIn$storeDeclaration(snapshot.getFullText(), loc.textSpan.start) + ) { + // User renamed store, also rename correspondig $store locations + const storeRenameLocations = lang.findRenameLocations( + snapshot.filePath, + get$storeOffsetOf$storeDeclaration( + snapshot.getFullText(), + loc.textSpan.start + ), + false, + false, + true + ); + return await this.mapAndFilterRenameLocations( + storeRenameLocations!, + docs, + `$${newName}` + ); + } else if (is$storeVariable(snapshot.getFullText(), loc.textSpan.start)) { + // User renamed $store, also rename corresponding store + const storeRenameLocations = lang.findRenameLocations( + snapshot.filePath, + getStoreOffsetOf$storeDeclaration( + snapshot.getFullText(), + loc.textSpan.start + ), + false, + false, + true + ); + return await this.mapAndFilterRenameLocations(storeRenameLocations!, docs); + // TODO once we allow providePrefixAndSuffixTextForRename to be configurable, + // we need to add one more step to update all other $store usages in other files + } + } + } + return []; + } + /** * If user renames prop of component A inside component A, * we need to handle the rename of the prop of A ourselves. @@ -378,7 +394,7 @@ export class RenameProviderImpl implements RenameProvider { renameLocations.map(async (loc) => { const snapshot = await fragments.retrieve(loc.fileName); - if (isNoTextSpanInGeneratedCode(snapshot.getFullText(), loc.textSpan)) { + if (!isTextSpanInGeneratedCode(snapshot.getFullText(), loc.textSpan)) { return { ...loc, range: this.mapRangeToOriginal(snapshot, loc.textSpan), @@ -624,7 +640,3 @@ export class RenameProviderImpl implements RenameProvider { return [bindingElement, identifierName]; } } - -function unique(array: T[]): T[] { - return uniqWith(array, isEqual); -} diff --git a/packages/language-server/src/plugins/typescript/features/TypeDefinitionProvider.ts b/packages/language-server/src/plugins/typescript/features/TypeDefinitionProvider.ts index b42979c53..be051795f 100644 --- a/packages/language-server/src/plugins/typescript/features/TypeDefinitionProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/TypeDefinitionProvider.ts @@ -4,7 +4,7 @@ import { pathToUrl, isNotNullOrUndefined } from '../../../utils'; import { TypeDefinitionProvider } from '../../interfaces'; import { LSAndTSDocResolver } from '../LSAndTSDocResolver'; import { convertRange } from '../utils'; -import { isNoTextSpanInGeneratedCode, SnapshotMap } from './utils'; +import { isTextSpanInGeneratedCode, SnapshotMap } from './utils'; export class TypeDefinitionProviderImpl implements TypeDefinitionProvider { constructor(private readonly lsAndTsDocResolver: LSAndTSDocResolver) {} @@ -25,7 +25,7 @@ export class TypeDefinitionProviderImpl implements TypeDefinitionProvider { typeDefs.map(async (typeDef) => { const snapshot = await snapshots.retrieve(typeDef.fileName); - if (!isNoTextSpanInGeneratedCode(snapshot.getFullText(), typeDef.textSpan)) { + if (isTextSpanInGeneratedCode(snapshot.getFullText(), typeDef.textSpan)) { return; } diff --git a/packages/language-server/src/plugins/typescript/features/utils.ts b/packages/language-server/src/plugins/typescript/features/utils.ts index ccfd8982a..ae498c456 100644 --- a/packages/language-server/src/plugins/typescript/features/utils.ts +++ b/packages/language-server/src/plugins/typescript/features/utils.ts @@ -88,11 +88,11 @@ export function isInGeneratedCode(text: string, start: number, end: number = sta } /** - * Checks that this isn't a text span that should be completely ignored - * because it's purely generated. + * Checks if this is a text span that is inside svelte2tsx-generated code + * (has no mapping to the original) */ -export function isNoTextSpanInGeneratedCode(text: string, span: ts.TextSpan) { - return !isInGeneratedCode(text, span.start, span.start + span.length); +export function isTextSpanInGeneratedCode(text: string, span: ts.TextSpan) { + return isInGeneratedCode(text, span.start, span.start + span.length); } export function isPartOfImportStatement(text: string, position: Position): boolean { @@ -100,22 +100,22 @@ export function isPartOfImportStatement(text: string, position: Position): boole return /\s*from\s+["'][^"']*/.test(line.slice(0, position.character)); } -export function isInsideStoreGetShim(text: string, varStart: number) { +export function isStoreVariableIn$storeDeclaration(text: string, varStart: number) { return ( text.lastIndexOf('__sveltets_1_store_get(', varStart) === varStart - '__sveltets_1_store_get('.length ); } -export function get$storeDeclarationStart(text: string, storePosition: number) { +export function get$storeOffsetOf$storeDeclaration(text: string, storePosition: number) { return text.lastIndexOf(' =', storePosition) - 1; } -export function is$storeDeclarationVar(text: string, varStart: number) { +export function is$storeVariable(text: string, varStart: number) { return text.charAt(varStart) === '$'; } -export function getStoreGetShimVarStart(text: string, $storeVarStart: number) { +export function getStoreOffsetOf$storeDeclaration(text: string, $storeVarStart: number) { return text.indexOf(');', $storeVarStart) - 1; } diff --git a/packages/language-server/src/utils.ts b/packages/language-server/src/utils.ts index 1b55c0818..798f1b6ef 100644 --- a/packages/language-server/src/utils.ts +++ b/packages/language-server/src/utils.ts @@ -1,3 +1,4 @@ +import { isEqual, uniqWith } from 'lodash'; import { Node } from 'vscode-html-languageservice'; import { Position, Range } from 'vscode-languageserver'; import { URI } from 'vscode-uri'; @@ -16,6 +17,10 @@ export function and(...predicates: Array>) { return (x: T) => predicates.every((predicate) => predicate(x)); } +export function unique(array: T[]): T[] { + return uniqWith(array, isEqual); +} + export function clamp(num: number, min: number, max: number): number { return Math.max(min, Math.min(max, num)); } From 6b00d056e99a3d7083d39fb949d681f1d1353e30 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 19 Jun 2022 09:11:07 +0200 Subject: [PATCH 11/16] cleanup --- .../src/language-service/find-references.ts | 11 +++++++---- .../src/language-service/rename.ts | 17 ++++++++++------- packages/typescript-plugin/src/utils.ts | 4 ++-- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/packages/typescript-plugin/src/language-service/find-references.ts b/packages/typescript-plugin/src/language-service/find-references.ts index 093510c91..03dda0aed 100644 --- a/packages/typescript-plugin/src/language-service/find-references.ts +++ b/packages/typescript-plugin/src/language-service/find-references.ts @@ -2,8 +2,8 @@ import type ts from 'typescript/lib/tsserverlibrary'; import { Logger } from '../logger'; import { SvelteSnapshotManager } from '../svelte-snapshots'; import { - get$storeDeclarationStart, - isInsideStoreGetShim, + get$storeOffsetOf$storeDeclaration, + isStoreVariableIn$storeDeclaration, isNotNullOrUndefined, isSvelteFilePath } from '../utils'; @@ -105,12 +105,15 @@ function mapReferences( if (!textSpan) { if ( getReferences && - isInsideStoreGetShim(snapshot.getText(), reference.textSpan.start) + isStoreVariableIn$storeDeclaration(snapshot.getText(), reference.textSpan.start) ) { additionalStoreReferences.push( ...(getReferences( reference.fileName, - get$storeDeclarationStart(snapshot.getText(), reference.textSpan.start) + get$storeOffsetOf$storeDeclaration( + snapshot.getText(), + reference.textSpan.start + ) ) || []) ); } diff --git a/packages/typescript-plugin/src/language-service/rename.ts b/packages/typescript-plugin/src/language-service/rename.ts index 689a31599..5cd24b762 100644 --- a/packages/typescript-plugin/src/language-service/rename.ts +++ b/packages/typescript-plugin/src/language-service/rename.ts @@ -1,7 +1,11 @@ import type ts from 'typescript/lib/tsserverlibrary'; import { Logger } from '../logger'; import { SvelteSnapshotManager } from '../svelte-snapshots'; -import { get$storeDeclarationStart, isSvelteFilePath } from '../utils'; +import { + get$storeOffsetOf$storeDeclaration, + isStoreVariableIn$storeDeclaration, + isSvelteFilePath +} from '../utils'; export function decorateRename( ls: ts.LanguageService, @@ -41,16 +45,15 @@ export function decorateRename( const textSpan = snapshot.getOriginalTextSpan(renameLocation.textSpan); if (!textSpan) { if ( - additionalStoreRenameLocations && - snapshot - .getText() - .lastIndexOf('__sveltets_1_store_get(', renameLocation.textSpan.start) === - renameLocation.textSpan.start - '__sveltets_1_store_get('.length + isStoreVariableIn$storeDeclaration( + snapshot.getText(), + renameLocation.textSpan.start + ) ) { additionalStoreRenameLocations.push( ...findRenameLocations( renameLocation.fileName, - get$storeDeclarationStart( + get$storeOffsetOf$storeDeclaration( snapshot.getText(), renameLocation.textSpan.start ), diff --git a/packages/typescript-plugin/src/utils.ts b/packages/typescript-plugin/src/utils.ts index 5412e5ecc..f35bac4fa 100644 --- a/packages/typescript-plugin/src/utils.ts +++ b/packages/typescript-plugin/src/utils.ts @@ -74,13 +74,13 @@ export function getConfigPathForProject(project: ts.server.Project) { ); } -export function isInsideStoreGetShim(text: string, varStart: number) { +export function isStoreVariableIn$storeDeclaration(text: string, varStart: number) { return ( text.lastIndexOf('__sveltets_1_store_get(', varStart) === varStart - '__sveltets_1_store_get('.length ); } -export function get$storeDeclarationStart(text: string, storePosition: number) { +export function get$storeOffsetOf$storeDeclaration(text: string, storePosition: number) { return text.lastIndexOf(' =', storePosition) - 1; } From dc6701f9d8eb3b753344efc12609fab0a55af84b Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 19 Jun 2022 09:16:52 +0200 Subject: [PATCH 12/16] more robust $store var detection --- .../typescript/features/FindReferencesProvider.ts | 9 ++++++--- .../src/plugins/typescript/features/RenameProvider.ts | 6 ++++-- .../src/plugins/typescript/features/utils.ts | 4 ++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts b/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts index 4d4e88f48..177e6c426 100644 --- a/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts @@ -9,7 +9,7 @@ import { convertToLocationRange, hasNonZeroRange } from '../utils'; import { get$storeOffsetOf$storeDeclaration, getStoreOffsetOf$storeDeclaration, - is$storeVariable, + is$storeVariableIn$storeDeclaration, isStoreVariableIn$storeDeclaration, isTextSpanInGeneratedCode, SnapshotMap @@ -63,7 +63,7 @@ export class FindReferencesProviderImpl implements FindReferencesProvider { (ref) => isTextSpanInGeneratedCode(tsDoc.getFullText(), ref.textSpan) && // handle both cases of references triggered at store and triggered at $store - (is$storeVariable(tsDoc.getFullText(), ref.textSpan.start) || + (is$storeVariableIn$storeDeclaration(tsDoc.getFullText(), ref.textSpan.start) || isStoreVariableIn$storeDeclaration(tsDoc.getFullText(), ref.textSpan.start)) ); if (!storeReference) { @@ -74,7 +74,10 @@ export class FindReferencesProviderImpl implements FindReferencesProvider { lang.findReferences( tsDoc.filePath, // handle both cases of references triggered at store and triggered at $store - is$storeVariable(tsDoc.getFullText(), storeReference.textSpan.start) + is$storeVariableIn$storeDeclaration( + tsDoc.getFullText(), + storeReference.textSpan.start + ) ? getStoreOffsetOf$storeDeclaration( tsDoc.getFullText(), storeReference.textSpan.start diff --git a/packages/language-server/src/plugins/typescript/features/RenameProvider.ts b/packages/language-server/src/plugins/typescript/features/RenameProvider.ts index 806954ea4..6acbeacea 100644 --- a/packages/language-server/src/plugins/typescript/features/RenameProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/RenameProvider.ts @@ -21,7 +21,7 @@ import { isStoreVariableIn$storeDeclaration, get$storeOffsetOf$storeDeclaration, getStoreOffsetOf$storeDeclaration, - is$storeVariable + is$storeVariableIn$storeDeclaration } from './utils'; import { LSConfigManager } from '../../../ls-config'; import { isAttributeName, isEventHandler } from '../svelte-ast-utils'; @@ -221,7 +221,9 @@ export class RenameProviderImpl implements RenameProvider { docs, `$${newName}` ); - } else if (is$storeVariable(snapshot.getFullText(), loc.textSpan.start)) { + } else if ( + is$storeVariableIn$storeDeclaration(snapshot.getFullText(), loc.textSpan.start) + ) { // User renamed $store, also rename corresponding store const storeRenameLocations = lang.findRenameLocations( snapshot.filePath, diff --git a/packages/language-server/src/plugins/typescript/features/utils.ts b/packages/language-server/src/plugins/typescript/features/utils.ts index ae498c456..cc0de7a72 100644 --- a/packages/language-server/src/plugins/typescript/features/utils.ts +++ b/packages/language-server/src/plugins/typescript/features/utils.ts @@ -111,8 +111,8 @@ export function get$storeOffsetOf$storeDeclaration(text: string, storePosition: return text.lastIndexOf(' =', storePosition) - 1; } -export function is$storeVariable(text: string, varStart: number) { - return text.charAt(varStart) === '$'; +export function is$storeVariableIn$storeDeclaration(text: string, varStart: number) { + return /^\$\w+ = __sveltets_1_store_get/.test(text.substring(varStart)); } export function getStoreOffsetOf$storeDeclaration(text: string, $storeVarStart: number) { From 652e7c1bff25da3d6201960cf2c4cc399cd01341 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 19 Jun 2022 22:37:41 +0200 Subject: [PATCH 13/16] finalize references, lint --- .../features/FindReferencesProvider.ts | 88 ++++++++++++------- .../typescript/features/HoverProvider.ts | 2 +- .../typescript/features/RenameProvider.ts | 8 +- .../features/FindReferencesProvider.test.ts | 70 +++++++++++++-- .../find-references-$store-other.svelte | 8 ++ .../testfiles/find-references-$store.svelte | 5 +- 6 files changed, 136 insertions(+), 45 deletions(-) create mode 100644 packages/language-server/test/plugins/typescript/testfiles/find-references-$store-other.svelte diff --git a/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts b/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts index 177e6c426..8bff80892 100644 --- a/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts @@ -33,11 +33,12 @@ export class FindReferencesProviderImpl implements FindReferencesProvider { return null; } - const references = flatten(rawReferences.map((ref) => ref.references)); - references.push(...this.enhanceStoreReferences(references, tsDoc, lang)); - const snapshots = new SnapshotMap(this.lsAndTsDocResolver); snapshots.set(tsDoc.filePath, tsDoc); + + const references = flatten(rawReferences.map((ref) => ref.references)); + references.push(...(await this.getStoreReferences(references, tsDoc, snapshots, lang))); + const locations = await Promise.all( references.map(async (ref) => this.mapReference(ref, context, snapshots)) ); @@ -46,7 +47,7 @@ export class FindReferencesProviderImpl implements FindReferencesProvider { locations .filter(isNotNullOrUndefined) // Possible $store references are added afterwards, sort for correct order - .sort(sortLocationByRange) + .sort(sortLocationByFileAndRange) ); } @@ -54,41 +55,59 @@ export class FindReferencesProviderImpl implements FindReferencesProvider { * If references of a $store are searched, also find references for the corresponding store * and vice versa. */ - private enhanceStoreReferences( + private async getStoreReferences( references: ts.ReferencedSymbolEntry[], tsDoc: SvelteDocumentSnapshot, + snapshots: SnapshotMap, lang: ts.LanguageService - ): ts.ReferencedSymbolEntry[] { + ): Promise { + // If user started finding references at $store, find references for store, too + let storeReferences: ts.ReferencedSymbolEntry[] = []; const storeReference = references.find( (ref) => + ref.fileName === tsDoc.filePath && isTextSpanInGeneratedCode(tsDoc.getFullText(), ref.textSpan) && - // handle both cases of references triggered at store and triggered at $store - (is$storeVariableIn$storeDeclaration(tsDoc.getFullText(), ref.textSpan.start) || - isStoreVariableIn$storeDeclaration(tsDoc.getFullText(), ref.textSpan.start)) + is$storeVariableIn$storeDeclaration(tsDoc.getFullText(), ref.textSpan.start) ); - if (!storeReference) { - return []; + if (storeReference) { + const additionalReferences = + lang.findReferences( + tsDoc.filePath, + getStoreOffsetOf$storeDeclaration( + tsDoc.getFullText(), + storeReference.textSpan.start + ) + ) || []; + storeReferences = flatten(additionalReferences.map((ref) => ref.references)); } - const storeReferences = - lang.findReferences( - tsDoc.filePath, - // handle both cases of references triggered at store and triggered at $store - is$storeVariableIn$storeDeclaration( - tsDoc.getFullText(), - storeReference.textSpan.start + // If user started finding references at store, find references for $store, too + // If user started finding references at $store, find references for $store in other files + const $storeReferences: ts.ReferencedSymbolEntry[] = []; + for (const ref of [...references, ...storeReferences]) { + const snapshot = await snapshots.retrieve(ref.fileName); + if ( + !( + isTextSpanInGeneratedCode(snapshot.getFullText(), ref.textSpan) && + isStoreVariableIn$storeDeclaration(snapshot.getFullText(), ref.textSpan.start) ) - ? getStoreOffsetOf$storeDeclaration( - tsDoc.getFullText(), - storeReference.textSpan.start - ) - : get$storeOffsetOf$storeDeclaration( - tsDoc.getFullText(), - storeReference.textSpan.start - ) - ) || []; - return flatten(storeReferences.map((ref) => ref.references)); - // TODO all $store usages in other Svelte files, too? + ) { + continue; + } + if (storeReference?.fileName === ref.fileName) { + // $store in X -> usages of store -> store in X -> we would add duplicate $store references + continue; + } + + const additionalReferences = + lang.findReferences( + snapshot.filePath, + get$storeOffsetOf$storeDeclaration(snapshot.getFullText(), ref.textSpan.start) + ) || []; + $storeReferences.push(...flatten(additionalReferences.map((ref) => ref.references))); + } + + return [...storeReferences, ...$storeReferences]; } private async mapReference( @@ -125,9 +144,10 @@ export class FindReferencesProviderImpl implements FindReferencesProvider { } } -function sortLocationByRange(l1: Location, l2: Location): number { - return ( - (l1.range.start.line - l2.range.start.line) * 10000 + - (l1.range.start.character - l2.range.start.character) - ); +function sortLocationByFileAndRange(l1: Location, l2: Location): number { + const localeCompare = l1.uri.localeCompare(l2.uri); + return localeCompare === 0 + ? (l1.range.start.line - l2.range.start.line) * 10000 + + (l1.range.start.character - l2.range.start.character) + : localeCompare; } diff --git a/packages/language-server/src/plugins/typescript/features/HoverProvider.ts b/packages/language-server/src/plugins/typescript/features/HoverProvider.ts index 723914345..feebf5717 100644 --- a/packages/language-server/src/plugins/typescript/features/HoverProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/HoverProvider.ts @@ -20,7 +20,7 @@ export class HoverProviderImpl implements HoverProvider { } const offset = tsDoc.offsetAt(tsDoc.getGeneratedPosition(position)); - let info = lang.getQuickInfoAtPosition(tsDoc.filePath, offset); + const info = lang.getQuickInfoAtPosition(tsDoc.filePath, offset); if (!info) { return null; } diff --git a/packages/language-server/src/plugins/typescript/features/RenameProvider.ts b/packages/language-server/src/plugins/typescript/features/RenameProvider.ts index 6acbeacea..2a67c3669 100644 --- a/packages/language-server/src/plugins/typescript/features/RenameProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/RenameProvider.ts @@ -65,7 +65,13 @@ export class RenameProviderImpl implements RenameProvider { return null; } - let renameLocations = lang.findRenameLocations(tsDoc.filePath, offset, false, false, true); + const renameLocations = lang.findRenameLocations( + tsDoc.filePath, + offset, + false, + false, + true + ); if (!renameLocations) { return null; } diff --git a/packages/language-server/test/plugins/typescript/features/FindReferencesProvider.test.ts b/packages/language-server/test/plugins/typescript/features/FindReferencesProvider.test.ts index bc6fe030b..a87cea395 100644 --- a/packages/language-server/test/plugins/typescript/features/FindReferencesProvider.test.ts +++ b/packages/language-server/test/plugins/typescript/features/FindReferencesProvider.test.ts @@ -34,7 +34,7 @@ function test(useNewTransformation: boolean) { ); const provider = new FindReferencesProviderImpl(lsAndTsDocResolver); const document = openDoc(filename); - return { provider, document }; + return { provider, document, openDoc }; function openDoc(filename: string) { const filePath = getFullPath(filename); @@ -88,24 +88,26 @@ function test(useNewTransformation: boolean) { }); it('finds references for $store', async () => { - const { provider, document } = setup('find-references-$store.svelte'); + const { provider, document, openDoc } = setup('find-references-$store.svelte'); + //Make known all the associated files + openDoc('find-references-$store-other.svelte'); - const results = await provider.findReferences(document, Position.create(2, 10), { + const results = await provider.findReferences(document, Position.create(5, 10), { includeDeclaration: true }); assert.deepStrictEqual(results, [ { range: { end: { - character: 16, + character: 19, line: 1 }, start: { - character: 10, + character: 13, line: 1 } }, - uri: getUri('find-references-$store.svelte') + uri: getUri('find-references-$store-other.svelte') }, { range: { @@ -118,7 +120,7 @@ function test(useNewTransformation: boolean) { line: 2 } }, - uri: getUri('find-references-$store.svelte') + uri: getUri('find-references-$store-other.svelte') }, { range: { @@ -131,7 +133,7 @@ function test(useNewTransformation: boolean) { line: 3 } }, - uri: getUri('find-references-$store.svelte') + uri: getUri('find-references-$store-other.svelte') }, { range: { @@ -144,6 +146,58 @@ function test(useNewTransformation: boolean) { line: 7 } }, + uri: getUri('find-references-$store-other.svelte') + }, + { + range: { + end: { + character: 23, + line: 1 + }, + start: { + character: 17, + line: 1 + } + }, + uri: getUri('find-references-$store.svelte') + }, + { + range: { + end: { + character: 15, + line: 5 + }, + start: { + character: 8, + line: 5 + } + }, + uri: getUri('find-references-$store.svelte') + }, + { + range: { + end: { + character: 15, + line: 6 + }, + start: { + character: 8, + line: 6 + } + }, + uri: getUri('find-references-$store.svelte') + }, + { + range: { + end: { + character: 8, + line: 10 + }, + start: { + character: 1, + line: 10 + } + }, uri: getUri('find-references-$store.svelte') } ]); diff --git a/packages/language-server/test/plugins/typescript/testfiles/find-references-$store-other.svelte b/packages/language-server/test/plugins/typescript/testfiles/find-references-$store-other.svelte new file mode 100644 index 000000000..22bb45f8e --- /dev/null +++ b/packages/language-server/test/plugins/typescript/testfiles/find-references-$store-other.svelte @@ -0,0 +1,8 @@ + + +{$findMe} diff --git a/packages/language-server/test/plugins/typescript/testfiles/find-references-$store.svelte b/packages/language-server/test/plugins/typescript/testfiles/find-references-$store.svelte index 5a6f9090e..16ff09b12 100644 --- a/packages/language-server/test/plugins/typescript/testfiles/find-references-$store.svelte +++ b/packages/language-server/test/plugins/typescript/testfiles/find-references-$store.svelte @@ -1,5 +1,8 @@ + + + +{$data}