diff --git a/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts b/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts index ab0fcbcdf..efc5132c7 100644 --- a/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts +++ b/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts @@ -68,7 +68,11 @@ 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 { + is$storeVariableIn$storeDeclaration, + isTextSpanInGeneratedCode, + SnapshotMap +} from './features/utils'; import { LSAndTSDocResolver } from './LSAndTSDocResolver'; import { ignoredBuildDirectories } from './SnapshotManager'; import { isAttributeName, isAttributeShorthand, isEventHandler } from './svelte-ast-utils'; @@ -344,19 +348,36 @@ export class TypeScriptPlugin const result = await Promise.all( defs.definitions.map(async (def) => { - const snapshot = await snapshots.retrieve(def.fileName); + if (def.fileName.endsWith('svelte-shims.d.ts')) { + return; + } - if ( - !def.fileName.endsWith('svelte-shims.d.ts') && - isNoTextSpanInGeneratedCode(snapshot.getFullText(), def.textSpan) - ) { - return LocationLink.create( - pathToUrl(def.fileName), - convertToLocationRange(snapshot, def.textSpan), - convertToLocationRange(snapshot, def.textSpan), - convertToLocationRange(tsDoc, defs.textSpan) - ); + let snapshot = await snapshots.retrieve(def.fileName); + + // Go from generated $store to store if user wants to find definition for $store + if (isTextSpanInGeneratedCode(snapshot.getFullText(), def.textSpan)) { + if ( + !is$storeVariableIn$storeDeclaration( + snapshot.getFullText(), + 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]; + snapshot = await snapshots.retrieve(def.fileName); } + + return LocationLink.create( + pathToUrl(def.fileName), + convertToLocationRange(snapshot, def.textSpan), + convertToLocationRange(snapshot, def.textSpan), + convertToLocationRange(tsDoc, defs.textSpan) + ); }) ); return result.filter(isNotNullOrUndefined); diff --git a/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts b/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts index 78104ae9f..92ac00e0b 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 @@ -298,7 +298,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 b9e493b83..6f3021631 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, + isStoreVariableIn$storeDeclaration, + get$storeOffsetOf$storeDeclaration } from './utils'; import { not, flatten, passMap, regexIndexOf, swapRangeStartEndIfNecessary } from '../../../utils'; import { LSConfigManager } from '../../../ls-config'; @@ -37,7 +39,8 @@ enum DiagnosticCode { MULTIPLE_PROPS_SAME_NAME = 1117, // "An object literal cannot have multiple properties with the same name in strict mode." TYPE_X_NOT_ASSIGNABLE_TO_TYPE_Y = 2345, // "Argument of type '..' is not assignable to parameter of type '..'." MISSING_PROPS = 2739, // "Type '...' is missing the following properties from type '..': ..." - MISSING_PROP = 2741 // "Property '..' is missing in type '..' but required in type '..'." + MISSING_PROP = 2741, // "Property '..' is missing in type '..' but required in type '..'." + NO_OVERLOAD_MATCHES_CALL = 2769 // "No overload matches this call" } export class DiagnosticsProviderImpl implements DiagnosticsProvider { @@ -80,9 +83,40 @@ 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 ( + (diagnostic.code === DiagnosticCode.NO_OVERLOAD_MATCHES_CALL || + diagnostic.code === DiagnosticCode.TYPE_X_NOT_ASSIGNABLE_TO_TYPE_Y) && + !notGenerated(diagnostic) + ) { + 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$storeOffsetOf$storeDeclaration(tsDoc.getFullText(), diagnostic.start!) + )![0].references; + for (const storeUsage of storeUsages) { + additionalStoreDiagnostics.push({ + ...diagnostic, + 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' + )}`, + start: storeUsage.textSpan.start, + length: storeUsage.textSpan.length + }); + } + } + } + } + diagnostics.push(...additionalStoreDiagnostics); + + diagnostics = diagnostics.filter(notGenerated).filter(not(isUnusedReactiveStatementLabel)); diagnostics = resolveNoopsInReactiveStatements(lang, diagnostics); return diagnostics 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 b2b18318b..8bff80892 100644 --- a/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/FindReferencesProvider.ts @@ -1,10 +1,19 @@ +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 { isNoTextSpanInGeneratedCode, SnapshotMap } from './utils'; +import { + get$storeOffsetOf$storeDeclaration, + getStoreOffsetOf$storeDeclaration, + is$storeVariableIn$storeDeclaration, + isStoreVariableIn$storeDeclaration, + isTextSpanInGeneratedCode, + SnapshotMap +} from './utils'; export class FindReferencesProviderImpl implements FindReferencesProvider { constructor(private readonly lsAndTsDocResolver: LSAndTSDocResolver) {} @@ -16,48 +25,129 @@ export class FindReferencesProviderImpl implements FindReferencesProvider { ): Promise { const { lang, tsDoc } = await this.getLSAndTSDoc(document); - const references = lang.findReferences( + const rawReferences = lang.findReferences( tsDoc.filePath, tsDoc.offsetAt(tsDoc.getGeneratedPosition(position)) ); - if (!references) { + if (!rawReferences) { return null; } 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( - flatten(references.map((ref) => ref.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(sortLocationByFileAndRange) + ); + } + + /** + * If references of a $store are searched, also find references for the corresponding store + * and vice versa. + */ + private async getStoreReferences( + references: ts.ReferencedSymbolEntry[], + tsDoc: SvelteDocumentSnapshot, + snapshots: SnapshotMap, + lang: ts.LanguageService + ): 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) && + is$storeVariableIn$storeDeclaration(tsDoc.getFullText(), ref.textSpan.start) + ); + if (storeReference) { + const additionalReferences = + lang.findReferences( + tsDoc.filePath, + getStoreOffsetOf$storeDeclaration( + tsDoc.getFullText(), + storeReference.textSpan.start + ) + ) || []; + storeReferences = flatten(additionalReferences.map((ref) => ref.references)); + } + + // 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) + ) + ) { + 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( + 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) ); - return locations.filter(isNotNullOrUndefined); + // 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 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 869f71380..feebf5717 100644 --- a/packages/language-server/src/plugins/typescript/features/HoverProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/HoverProvider.ts @@ -20,28 +20,11 @@ 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; } - 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/src/plugins/typescript/features/ImplementationProvider.ts b/packages/language-server/src/plugins/typescript/features/ImplementationProvider.ts index 29d1a9a85..e67f4507e 100644 --- a/packages/language-server/src/plugins/typescript/features/ImplementationProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/ImplementationProvider.ts @@ -4,7 +4,11 @@ import { pathToUrl, isNotNullOrUndefined } from '../../../utils'; import { ImplementationProvider } from '../../interfaces'; import { LSAndTSDocResolver } from '../LSAndTSDocResolver'; import { convertRange } from '../utils'; -import { isNoTextSpanInGeneratedCode, SnapshotMap } from './utils'; +import { + is$storeVariableIn$storeDeclaration, + isTextSpanInGeneratedCode, + SnapshotMap +} from './utils'; export class ImplementationProviderImpl implements ImplementationProvider { constructor(private readonly lsAndTsDocResolver: LSAndTSDocResolver) {} @@ -23,10 +27,24 @@ export class ImplementationProviderImpl implements ImplementationProvider { const result = await Promise.all( implementations.map(async (implementation) => { - const snapshot = await snapshots.retrieve(implementation.fileName); - - if (!isNoTextSpanInGeneratedCode(snapshot.getFullText(), implementation.textSpan)) { - return; + let snapshot = await snapshots.retrieve(implementation.fileName); + + // Go from generated $store to store if user wants to find implementation for $store + if (isTextSpanInGeneratedCode(snapshot.getFullText(), implementation.textSpan)) { + if ( + !is$storeVariableIn$storeDeclaration( + snapshot.getFullText(), + implementation.textSpan.start + ) + ) { + return; + } + // there will be exactly one definition, the store + implementation = lang.getImplementationAtPosition( + tsDoc.filePath, + tsDoc.getFullText().indexOf(');', implementation.textSpan.start) - 1 + )![0]; + snapshot = await snapshots.retrieve(implementation.fileName); } const range = mapRangeToOriginal( diff --git a/packages/language-server/src/plugins/typescript/features/RenameProvider.ts b/packages/language-server/src/plugins/typescript/features/RenameProvider.ts index dad01fb46..66eb53b6c 100644 --- a/packages/language-server/src/plugins/typescript/features/RenameProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/RenameProvider.ts @@ -6,23 +6,31 @@ 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 + findContainingNode, + isStoreVariableIn$storeDeclaration, + get$storeOffsetOf$storeDeclaration, + getStoreOffsetOf$storeDeclaration, + is$storeVariableIn$storeDeclaration } from './utils'; 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, @@ -52,7 +60,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; } @@ -69,11 +78,16 @@ export class RenameProviderImpl implements RenameProvider { const docs = new SnapshotMap(this.lsAndTsDocResolver); docs.set(tsDoc.filePath, tsDoc); - let convertedRenameLocations: Array< - ts.RenameLocation & { - range: Range; - } - > = await this.mapAndFilterRenameLocations(renameLocations, docs); + + let convertedRenameLocations: TsRenameLocation[] = await this.mapAndFilterRenameLocations( + renameLocations, + docs, + renameInfo.isStore ? `$${newName}` : undefined + ); + + convertedRenameLocations.push( + ...(await this.enhanceRenamesInCaseOf$Store(renameLocations, newName, docs, lang)) + ); convertedRenameLocations = this.checkShortHandBindingOrSlotLetLocation( lang, @@ -116,7 +130,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; @@ -131,13 +146,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) { @@ -167,9 +180,75 @@ 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 && isTextSpanInGeneratedCode(tsDoc.getFullText(), definition.textSpan)) { + renameInfo.triggerSpan.start++; + renameInfo.triggerSpan.length--; + (renameInfo as any).isStore = true; + } + } + 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$storeVariableIn$storeDeclaration(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. @@ -181,8 +260,8 @@ export class RenameProviderImpl implements RenameProvider { document: Document, tsDoc: SvelteDocumentSnapshot, position: Position, - convertedRenameLocations: Array, - fragments: SnapshotMap, + convertedRenameLocations: TsRenameLocation[], + snapshots: SnapshotMap, lang: ts.LanguageService ) { // First find out if it's really the "rename prop inside component with that prop" case @@ -200,7 +279,7 @@ export class RenameProviderImpl implements RenameProvider { // prop rename further below in the document. const updatePropLocation = this.findLocationWhichWantsToUpdatePropName( convertedRenameLocations, - fragments + snapshots ); if (!updatePropLocation) { return []; @@ -222,7 +301,7 @@ export class RenameProviderImpl implements RenameProvider { rename.fileName !== updatePropLocation.fileName || this.isInSvelte2TsxPropLine(tsDoc, rename) ); - return await this.mapAndFilterRenameLocations(replacementsForProp, fragments); + return await this.mapAndFilterRenameLocations(replacementsForProp, snapshots); } /** @@ -234,20 +313,20 @@ export class RenameProviderImpl implements RenameProvider { * This additional logic/propagation is done in this method. */ private async getAdditionalLocationsForRenameOfPropInsideOtherComponent( - convertedRenameLocations: Array, - fragments: SnapshotMap, + convertedRenameLocations: TsRenameLocation[], + snapshots: SnapshotMap, lang: ts.LanguageService ) { // Check if it's a prop rename const updatePropLocation = this.findLocationWhichWantsToUpdatePropName( convertedRenameLocations, - fragments + snapshots ); if (!updatePropLocation) { return []; } // Find generated `export let` - const doc = fragments.get(updatePropLocation.fileName); + const doc = snapshots.get(updatePropLocation.fileName); const match = this.matchGeneratedExportLet(doc, updatePropLocation); if (!match) { return []; @@ -259,8 +338,8 @@ export class RenameProviderImpl implements RenameProvider { return this.checkShortHandBindingOrSlotLetLocation( lang, - await this.mapAndFilterRenameLocations(replacementsForProp, fragments), - fragments + await this.mapAndFilterRenameLocations(replacementsForProp, snapshots), + snapshots ); } @@ -283,8 +362,8 @@ export class RenameProviderImpl implements RenameProvider { } private findLocationWhichWantsToUpdatePropName( - convertedRenameLocations: Array, - fragments: SnapshotMap + convertedRenameLocations: TsRenameLocation[], + snapshots: SnapshotMap ) { return convertedRenameLocations.find((loc) => { // Props are not in mapped range @@ -292,7 +371,7 @@ export class RenameProviderImpl implements RenameProvider { return; } - const snapshot = fragments.get(loc.fileName); + const snapshot = snapshots.get(loc.fileName); // Props are in svelte snapshots only if (!(snapshot instanceof SvelteDocumentSnapshot)) { return false; @@ -315,16 +394,18 @@ export class RenameProviderImpl implements RenameProvider { */ private async mapAndFilterRenameLocations( renameLocations: readonly ts.RenameLocation[], - fragments: SnapshotMap - ): Promise> { + snapshots: SnapshotMap, + newName?: string + ): Promise { const mappedLocations = await Promise.all( renameLocations.map(async (loc) => { - const snapshot = await fragments.retrieve(loc.fileName); + const snapshot = await snapshots.retrieve(loc.fileName); - if (isNoTextSpanInGeneratedCode(snapshot.getFullText(), loc.textSpan)) { + if (!isTextSpanInGeneratedCode(snapshot.getFullText(), loc.textSpan)) { return { ...loc, - range: this.mapRangeToOriginal(snapshot, loc.textSpan) + range: this.mapRangeToOriginal(snapshot, loc.textSpan), + newName }; } }) @@ -333,8 +414,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)) { @@ -397,9 +478,9 @@ export class RenameProviderImpl implements RenameProvider { private checkShortHandBindingOrSlotLetLocation( lang: ts.LanguageService, - renameLocations: Array, + renameLocations: TsRenameLocation[], snapshots: SnapshotMap - ): Array { + ): TsRenameLocation[] { const bind = 'bind:'; return renameLocations.map((location) => { @@ -566,7 +647,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 2111c2697..cc0de7a72 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,6 +100,25 @@ export function isPartOfImportStatement(text: string, position: Position): boole return /\s*from\s+["'][^"']*/.test(line.slice(0, position.character)); } +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$storeOffsetOf$storeDeclaration(text: string, storePosition: number) { + return text.lastIndexOf(' =', storePosition) - 1; +} + +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) { + return text.indexOf(');', $storeVarStart) - 1; +} + export class SnapshotMap { private map = new Map(); constructor(private resolver: LSAndTSDocResolver) {} 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)); } 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)) ); }); }); 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..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: { @@ -114,11 +116,11 @@ function test(useNewTransformation: boolean) { line: 2 }, start: { - character: 9, + character: 8, line: 2 } }, - uri: getUri('find-references-$store.svelte') + uri: getUri('find-references-$store-other.svelte') }, { range: { @@ -127,11 +129,11 @@ function test(useNewTransformation: boolean) { line: 3 }, start: { - character: 9, + character: 8, line: 3 } }, - uri: getUri('find-references-$store.svelte') + uri: getUri('find-references-$store-other.svelte') }, { range: { @@ -140,10 +142,62 @@ function test(useNewTransformation: boolean) { line: 7 }, start: { - character: 2, + character: 1, 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/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/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/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-uninitialized/expected.json b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-uninitialized/expected.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-uninitialized/expected.json @@ -0,0 +1 @@ +[] diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-uninitialized/expectedv2.json b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-uninitialized/expectedv2.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-uninitialized/expectedv2.json @@ -0,0 +1 @@ +[] diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-uninitialized/input.svelte b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-uninitialized/input.svelte new file mode 100644 index 000000000..17430a9ff --- /dev/null +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$store-uninitialized/input.svelte @@ -0,0 +1,8 @@ + + +{$data} 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": [] } 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 @@ + + {$store} diff --git a/packages/svelte2tsx/src/svelte2tsx/index.ts b/packages/svelte2tsx/src/svelte2tsx/index.ts index 6d347a246..6d947b2bf 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 7847d168f..e5861fdaa 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'; @@ -73,116 +69,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)) { @@ -191,8 +79,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()))) { diff --git a/packages/typescript-plugin/src/language-service/find-references.ts b/packages/typescript-plugin/src/language-service/find-references.ts index 7d1c4ecf0..53406d157 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$storeOffsetOf$storeDeclaration, + isStoreVariableIn$storeDeclaration, + isNotNullOrUndefined, + isSvelteFilePath +} from '../utils'; export function decorateFindReferences( ls: ts.LanguageService, @@ -18,6 +23,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 +38,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 +51,6 @@ function _decorateFindReferences( if (!textSpan) { return null; } - return { definition: { ...reference.definition, @@ -42,7 +58,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,42 +78,71 @@ 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 - .map((reference) => { - const snapshot = snapshotManager.get(reference.fileName); - if (!isSvelteFilePath(reference.fileName) || !snapshot) { - return reference; - } + const additionalStoreReferences: ts.ReferenceEntry[] = []; + const mappedReferences: ts.ReferenceEntry[] = []; - const textSpan = snapshot.getOriginalTextSpan(reference.textSpan); - if (!textSpan) { - 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) { + mappedReferences.push(mapReference(reference, textSpan)); + } else { + if (isStoreVariableIn$storeDeclaration(snapshot.getText(), reference.textSpan.start)) { + additionalStoreReferences.push( + ...(getReferences( + reference.fileName, + get$storeOffsetOf$storeDeclaration( + snapshot.getText(), + reference.textSpan.start + ) + ) || []) + ); } + } + } + + 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; - logger.debug( - 'Find references; map textSpan: changed', - reference.textSpan, - 'to', - textSpan - ); + function mapReference(reference: ts.ReferenceEntry, textSpan: ts.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 { + ...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 4d920b61c..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 { isNotNullOrUndefined, isSvelteFilePath } from '../utils'; +import { + get$storeOffsetOf$storeDeclaration, + isStoreVariableIn$storeDeclaration, + isSvelteFilePath +} from '../utils'; export function decorateRename( ls: ts.LanguageService, @@ -23,30 +27,75 @@ 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 ( + isStoreVariableIn$storeDeclaration( + snapshot.getText(), + renameLocation.textSpan.start + ) + ) { + additionalStoreRenameLocations.push( + ...findRenameLocations( + renameLocation.fileName, + get$storeOffsetOf$storeDeclaration( + snapshot.getText(), + renameLocation.textSpan.start + ), + 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; + } } 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 ''; diff --git a/packages/typescript-plugin/src/utils.ts b/packages/typescript-plugin/src/utils.ts index 3bd98b8e8..f35bac4fa 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 isStoreVariableIn$storeDeclaration(text: string, varStart: number) { + return ( + text.lastIndexOf('__sveltets_1_store_get(', varStart) === + varStart - '__sveltets_1_store_get('.length + ); +} + +export function get$storeOffsetOf$storeDeclaration(text: string, storePosition: number) { + return text.lastIndexOf(' =', storePosition) - 1; +}