Skip to content

Commit 562ccd1

Browse files
authored
(fix) hover info for $store access (#909)
#901
1 parent 0a96b72 commit 562ccd1

File tree

3 files changed

+120
-5
lines changed

3 files changed

+120
-5
lines changed

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

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,28 @@ export class HoverProviderImpl implements HoverProvider {
2020
return eventHoverInfo;
2121
}
2222

23-
const info = lang.getQuickInfoAtPosition(
24-
tsDoc.filePath,
25-
fragment.offsetAt(fragment.getGeneratedPosition(position))
26-
);
23+
const offset = fragment.offsetAt(fragment.getGeneratedPosition(position));
24+
let info = lang.getQuickInfoAtPosition(tsDoc.filePath, offset);
2725
if (!info) {
2826
return null;
2927
}
3028

29+
const textSpan = info.textSpan;
30+
31+
// show docs of $store instead of store if necessary
32+
const is$store = fragment.text
33+
.substring(0, info.textSpan.start)
34+
.endsWith('(__sveltets_store_get(');
35+
if (is$store) {
36+
const infoFor$store = lang.getQuickInfoAtPosition(
37+
tsDoc.filePath,
38+
textSpan.start + textSpan.length + 3
39+
);
40+
if (infoFor$store) {
41+
info = infoFor$store;
42+
}
43+
}
44+
3145
const declaration = ts.displayPartsToString(info.displayParts);
3246
const documentation = getMarkdownDocumentation(info.documentation, info.tags);
3347

@@ -37,7 +51,7 @@ export class HoverProviderImpl implements HoverProvider {
3751
.join('\n');
3852

3953
return mapObjWithRangeToOriginal(fragment, {
40-
range: convertRange(fragment, info.textSpan),
54+
range: convertRange(fragment, textSpan),
4155
contents
4256
});
4357
}

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

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,90 @@ describe('HoverProvider', () => {
100100
}
101101
});
102102
});
103+
104+
it('provides hover info for $store access', async () => {
105+
const { provider, document } = setup('hover-$store.svelte');
106+
107+
assert.deepStrictEqual(await provider.doHover(document, Position.create(3, 5)), <Hover>{
108+
contents: '```typescript\nlet $b: string | {\n a: boolean | string;\n}\n```',
109+
range: {
110+
end: {
111+
character: 6,
112+
line: 3
113+
},
114+
start: {
115+
character: 5,
116+
line: 3
117+
}
118+
}
119+
});
120+
assert.deepStrictEqual(await provider.doHover(document, Position.create(5, 9)), <Hover>{
121+
contents: '```typescript\nlet $b: string\n```',
122+
range: {
123+
end: {
124+
character: 10,
125+
line: 5
126+
},
127+
start: {
128+
character: 9,
129+
line: 5
130+
}
131+
}
132+
});
133+
assert.deepStrictEqual(await provider.doHover(document, Position.create(7, 4)), <Hover>{
134+
contents:
135+
'```typescript\nconst b: Writable<string | {\n a: boolean | string;\n}>\n```',
136+
range: {
137+
end: {
138+
character: 5,
139+
line: 7
140+
},
141+
start: {
142+
character: 4,
143+
line: 7
144+
}
145+
}
146+
});
147+
148+
assert.deepStrictEqual(await provider.doHover(document, Position.create(10, 2)), <Hover>{
149+
contents: '```typescript\nlet $b: string | {\n a: boolean | string;\n}\n```',
150+
range: {
151+
end: {
152+
character: 3,
153+
line: 10
154+
},
155+
start: {
156+
character: 2,
157+
line: 10
158+
}
159+
}
160+
});
161+
assert.deepStrictEqual(await provider.doHover(document, Position.create(12, 6)), <Hover>{
162+
contents: '```typescript\nlet $b: string\n```',
163+
range: {
164+
end: {
165+
character: 7,
166+
line: 12
167+
},
168+
start: {
169+
character: 6,
170+
line: 12
171+
}
172+
}
173+
});
174+
assert.deepStrictEqual(await provider.doHover(document, Position.create(14, 1)), <Hover>{
175+
contents:
176+
'```typescript\nconst b: Writable<string | {\n a: boolean | string;\n}>\n```',
177+
range: {
178+
end: {
179+
character: 2,
180+
line: 14
181+
},
182+
start: {
183+
character: 1,
184+
line: 14
185+
}
186+
}
187+
});
188+
});
103189
});
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<script lang="ts">
2+
import { writable } from 'svelte/store';
3+
const b = writable<{a: boolean | string} | string>('')
4+
$b
5+
if (typeof $b === 'string') {
6+
$b;
7+
}
8+
b;
9+
</script>
10+
11+
{$b}
12+
{#if typeof $b === 'string'}
13+
{$b}
14+
{/if}
15+
{b}

0 commit comments

Comments
 (0)