Skip to content

Commit 4411fce

Browse files
authored
(fix) ignore generated $store declaration (#871)
in findReferences/getDefinition/diagnostics Use new ignore-comment-functionality for that
1 parent 7c11aa9 commit 4411fce

File tree

15 files changed

+62
-82
lines changed

15 files changed

+62
-82
lines changed

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

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export class DiagnosticsProviderImpl implements DiagnosticsProvider {
5252
}))
5353
.map((diagnostic) => mapObjWithRangeToOriginal(fragment, diagnostic))
5454
.filter(hasNoNegativeLines)
55-
.filter(isNoFalsePositive(document.getText(), tsDoc, diagnostics))
55+
.filter(isNoFalsePositive(document.getText(), tsDoc))
5656
.map(enhanceIfNecessary)
5757
.map(swapRangeStartEndIfNecessary);
5858
}
@@ -82,40 +82,16 @@ function hasNoNegativeLines(diagnostic: Diagnostic): boolean {
8282
return diagnostic.range.start.line >= 0 && diagnostic.range.end.line >= 0;
8383
}
8484

85-
function isNoFalsePositive(
86-
text: string,
87-
tsDoc: SvelteDocumentSnapshot,
88-
rawTsDiagnostics: ts.Diagnostic[]
89-
) {
85+
function isNoFalsePositive(text: string, tsDoc: SvelteDocumentSnapshot) {
9086
return (diagnostic: Diagnostic, idx: number) => {
9187
return (
9288
isNoJsxCannotHaveMultipleAttrsError(diagnostic) &&
9389
isNoUnusedLabelWarningForReactiveStatement(diagnostic) &&
94-
isNoUsedBeforeAssigned(diagnostic, text, tsDoc) &&
95-
isNotHiddenStoreValueDeclaration(diagnostic, tsDoc, rawTsDiagnostics[idx])
90+
isNoUsedBeforeAssigned(diagnostic, text, tsDoc)
9691
);
9792
};
9893
}
9994

100-
/**
101-
* During compilation to tsx, for each store we create an additional variable
102-
* called `$<store-name>` which contains the store value.
103-
* This variable declaration does not show up in the sourcemaps.
104-
* We have to ignore the error if the variable prefixed by `$` was not a store.
105-
*/
106-
function isNotHiddenStoreValueDeclaration(
107-
diagnostic: Diagnostic,
108-
tsDoc: SvelteDocumentSnapshot,
109-
rawTsDiagnostic: ts.Diagnostic
110-
): boolean {
111-
if (diagnostic.code !== 2345 || !rawTsDiagnostic.start) return true;
112-
113-
const affectedLine = tsDoc.getLineContainingOffset(rawTsDiagnostic.start);
114-
const hasStoreValueDefinition = /let \$[\w$]+ = __sveltets_store_get\(/.test(affectedLine);
115-
116-
return !hasStoreValueDefinition;
117-
}
118-
11995
/**
12096
* Variable used before being assigned, can happen when you do `export let x`
12197
* without assigning a value in strict mode. Should not throw an error here

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

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -101,20 +101,6 @@ describe('FindReferencesProvider', () => {
101101
},
102102
uri: getUri('find-references-$store.svelte')
103103
},
104-
// TODO this one should be filtered out
105-
{
106-
range: {
107-
end: {
108-
character: 30,
109-
line: 1
110-
},
111-
start: {
112-
character: 30,
113-
line: 1
114-
}
115-
},
116-
uri: getUri('find-references-$store.svelte')
117-
},
118104
{
119105
range: {
120106
end: {

packages/svelte2tsx/src/svelte2tsx/nodes/ImplicitStoreValues.ts

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import MagicString from 'magic-string';
22
import ts from 'typescript';
3+
import { surroundWithIgnoreComments } from '../../utils/ignore';
34
import { extractIdentifiers, getNamesFromLabeledStatement } from '../utils/tsAst';
45

56
/**
@@ -53,17 +54,19 @@ export class ImplicitStoreValues {
5354
const storeNames = extractIdentifiers(node.name)
5455
.map((id) => id.text)
5556
.filter((name) => this.accessedStores.has(name));
56-
57-
let toAppend = '';
58-
for (let i = 0; i < storeNames.length; i++) {
59-
toAppend += `;let $${storeNames[i]} = __sveltets_store_get(${storeNames[i]});`;
57+
if (!storeNames.length) {
58+
return;
6059
}
6160

61+
const storeDeclarations = surroundWithIgnoreComments(
62+
this.createStoreDeclarations(storeNames)
63+
);
6264
const nodeEnd =
6365
ts.isVariableDeclarationList(node.parent) && node.parent.declarations.length > 1
6466
? node.parent.declarations[node.parent.declarations.length - 1].getEnd()
6567
: node.getEnd();
66-
str.appendRight(nodeEnd + astOffset, toAppend);
68+
69+
str.appendRight(nodeEnd + astOffset, storeDeclarations);
6770
}
6871

6972
private attachStoreValueDeclarationToReactiveAssignment(
@@ -74,14 +77,16 @@ export class ImplicitStoreValues {
7477
const storeNames = getNamesFromLabeledStatement(node).filter((name) =>
7578
this.accessedStores.has(name)
7679
);
77-
78-
let toAppend = '';
79-
for (let i = 0; i < storeNames.length; i++) {
80-
toAppend += `;let $${storeNames[i]} = __sveltets_store_get(${storeNames[i]});`;
80+
if (!storeNames.length) {
81+
return;
8182
}
8283

84+
const storeDeclarations = surroundWithIgnoreComments(
85+
this.createStoreDeclarations(storeNames)
86+
);
8387
const endPos = node.getEnd() + astOffset;
84-
str.appendRight(endPos, toAppend);
88+
89+
str.appendRight(endPos, storeDeclarations);
8590
}
8691

8792
private attachStoreValueDeclarationToImport(
@@ -90,9 +95,22 @@ export class ImplicitStoreValues {
9095
str: MagicString
9196
) {
9297
const storeName = node.name.getText();
98+
const storeDeclaration = surroundWithIgnoreComments(this.createStoreDeclaration(storeName));
9399
const importStatement = ts.isImportClause(node) ? node.parent : node.parent.parent.parent;
94-
95100
const endPos = importStatement.getEnd() + astOffset;
96-
str.appendRight(endPos, `;let $${storeName} = __sveltets_store_get(${storeName});`);
101+
102+
str.appendRight(endPos, storeDeclaration);
103+
}
104+
105+
private createStoreDeclarations(storeNames: string[]): string {
106+
let declarations = '';
107+
for (let i = 0; i < storeNames.length; i++) {
108+
declarations += this.createStoreDeclaration(storeNames[i]);
109+
}
110+
return declarations;
111+
}
112+
113+
private createStoreDeclaration(storeName: string): string {
114+
return `;let $${storeName} = __sveltets_store_get(${storeName});`;
97115
}
98116
}

packages/svelte2tsx/test/svelte2tsx/samples/$store-assign/expected.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
///<reference types="svelte" />
22
<></>;function render() {
33

4-
const store = writable([]);let $store = __sveltets_store_get(store);;
4+
const store = writable([])/*Ωignore_startΩ*/;let $store = __sveltets_store_get(store);/*Ωignore_endΩ*/;
55

66
;(__sveltets_store_get(store), $store)[1] = true;
77
;(__sveltets_store_get(store), $store).foo = true;

packages/svelte2tsx/test/svelte2tsx/samples/await-with-$store/expected.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { readable } from 'svelte/store';
44
function render() {
55

66

7-
const store = readable(Promise.resolve('test'), () => {});let $store = __sveltets_store_get(store);;
7+
const store = readable(Promise.resolve('test'), () => {})/*Ωignore_startΩ*/;let $store = __sveltets_store_get(store);/*Ωignore_endΩ*/;
88
;
99
() => (<>
1010

@@ -16,4 +16,4 @@ function render() {
1616
return { props: {}, slots: {}, getters: {}, events: {} }}
1717

1818
export default class Input__SvelteComponent_ extends createSvelte2TsxComponent(__sveltets_partial(__sveltets_with_any_event(render))) {
19-
}
19+
}

packages/svelte2tsx/test/svelte2tsx/samples/nested-$-variables-script/expected.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
///<reference types="svelte" />
22
<></>;function render() {
33

4-
let top1 = someStore();let $top1 = __sveltets_store_get(top1);
5-
let top2 = someStore();let $top2 = __sveltets_store_get(top2);
4+
let top1 = someStore()/*Ωignore_startΩ*/;let $top1 = __sveltets_store_get(top1);/*Ωignore_endΩ*/
5+
let top2 = someStore()/*Ωignore_startΩ*/;let $top2 = __sveltets_store_get(top2);/*Ωignore_endΩ*/
66
let topLevelGet = (__sveltets_store_get(top1), $top1)
77
topLevelGet = (__sveltets_store_get(top2), $top2)
88

@@ -26,4 +26,4 @@ const test4 = ({a, b: { $top1: $top2 }}) => $top2 && (__sveltets_store_get(top1
2626
return { props: {}, slots: {}, getters: {}, events: {} }}
2727

2828
export default class Input__SvelteComponent_ extends createSvelte2TsxComponent(__sveltets_partial(__sveltets_with_any_event(render))) {
29-
}
29+
}

packages/svelte2tsx/test/svelte2tsx/samples/store-destructuring/expected.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
///<reference types="svelte" />
22
<></>;function render() {
33

4-
const store = fromSomewhere();let $store = __sveltets_store_get(store);;
5-
const { store1, store2, noStore } = fromSomewhere();let $store1 = __sveltets_store_get(store1);;let $store2 = __sveltets_store_get(store2);;
6-
const [ store3, store4, noStore ] = fromSomewhere();let $store3 = __sveltets_store_get(store3);;let $store4 = __sveltets_store_get(store4);;
4+
const store = fromSomewhere()/*Ωignore_startΩ*/;let $store = __sveltets_store_get(store);/*Ωignore_endΩ*/;
5+
const { store1, store2, noStore } = fromSomewhere()/*Ωignore_startΩ*/;let $store1 = __sveltets_store_get(store1);;let $store2 = __sveltets_store_get(store2);/*Ωignore_endΩ*/;
6+
const [ store3, store4, noStore ] = fromSomewhere()/*Ωignore_startΩ*/;let $store3 = __sveltets_store_get(store3);;let $store4 = __sveltets_store_get(store4);/*Ωignore_endΩ*/;
77
;
88
() => (<>
99
<p>{(__sveltets_store_get(store), $store)}</p>

packages/svelte2tsx/test/svelte2tsx/samples/store-from-module/expected.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
///<reference types="svelte" />
22
<></>;
3-
import {store1, store2} from './store';;let $store1 = __sveltets_store_get(store1);;let $store2 = __sveltets_store_get(store2);
4-
const store3 = writable('');let $store3 = __sveltets_store_get(store3);;
5-
const store4 = writable('');let $store4 = __sveltets_store_get(store4);;
3+
import {store1, store2} from './store';/*Ωignore_startΩ*/;let $store1 = __sveltets_store_get(store1);/*Ωignore_endΩ*//*Ωignore_startΩ*/;let $store2 = __sveltets_store_get(store2);/*Ωignore_endΩ*/
4+
const store3 = writable('')/*Ωignore_startΩ*/;let $store3 = __sveltets_store_get(store3);/*Ωignore_endΩ*/;
5+
const store4 = writable('')/*Ωignore_startΩ*/;let $store4 = __sveltets_store_get(store4);/*Ωignore_endΩ*/;
66
;<></>;function render() {
77

88
;(__sveltets_store_get(store1), $store1);

packages/svelte2tsx/test/svelte2tsx/samples/store-from-reactive-assignment/expected.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
///<reference types="svelte" />
22
<></>;function render() {
33

4-
let store = __sveltets_invalidate(() => fromSomewhere());;let $store = __sveltets_store_get(store);
5-
let { store1, noStore } = __sveltets_invalidate(() => fromSomewhere());;let $store1 = __sveltets_store_get(store1);
6-
let [ store2, noStore ] = __sveltets_invalidate(() => fromSomewhere());;let $store2 = __sveltets_store_get(store2);
4+
let store = __sveltets_invalidate(() => fromSomewhere());/*Ωignore_startΩ*/;let $store = __sveltets_store_get(store);/*Ωignore_endΩ*/
5+
let { store1, noStore } = __sveltets_invalidate(() => fromSomewhere());/*Ωignore_startΩ*/;let $store1 = __sveltets_store_get(store1);/*Ωignore_endΩ*/
6+
let [ store2, noStore ] = __sveltets_invalidate(() => fromSomewhere());/*Ωignore_startΩ*/;let $store2 = __sveltets_store_get(store2);/*Ωignore_endΩ*/
77
;
88
() => (<>
99
<p>{(__sveltets_store_get(store), $store)}</p>

packages/svelte2tsx/test/svelte2tsx/samples/store-import/expected.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import { storeB } from './store';
55
import { storeB as storeC } from './store';
66
function render() {
77

8-
;let $storeA = __sveltets_store_get(storeA);
9-
;let $storeB = __sveltets_store_get(storeB);
10-
;let $storeC = __sveltets_store_get(storeC);
8+
/*Ωignore_startΩ*/;let $storeA = __sveltets_store_get(storeA);/*Ωignore_endΩ*/
9+
/*Ωignore_startΩ*/;let $storeB = __sveltets_store_get(storeB);/*Ωignore_endΩ*/
10+
/*Ωignore_startΩ*/;let $storeC = __sveltets_store_get(storeC);/*Ωignore_endΩ*/
1111
;
1212
() => (<>
1313

0 commit comments

Comments
 (0)