Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/inlay-hints-script-order.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'svelte-language-server': patch
---

Show inlay hints inside a `<script>` tag that comes after other content in the file.
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export class InlayHintProviderImpl implements InlayHintProvider {

const inlayHints = lang.provideInlayHints(
tsDoc.filePath,
this.convertToTargetTextSpan(range, tsDoc),
this.convertToTargetTextSpan(range, document, tsDoc),
userPreferences
);

Expand Down Expand Up @@ -101,16 +101,42 @@ export class InlayHintProviderImpl implements InlayHintProvider {
);
}

private convertToTargetTextSpan(range: Range, snapshot: DocumentSnapshot) {
private convertToTargetTextSpan(range: Range, document: Document, snapshot: DocumentSnapshot) {
const generatedStartOffset = snapshot.getGeneratedPosition(range.start);
const generatedEndOffset = snapshot.getGeneratedPosition(range.end);

const start = generatedStartOffset.line < 0 ? 0 : snapshot.offsetAt(generatedStartOffset);
const end =
let start = generatedStartOffset.line < 0 ? 0 : snapshot.offsetAt(generatedStartOffset);
let end =
generatedEndOffset.line < 0
? snapshot.getLength()
: snapshot.offsetAt(generatedEndOffset);

// svelte2tsx moves the scripts before the template, so the part of a script
// inside the range can be outside of the span between the mapped start and end
const rangeStart = document.offsetAt(range.start);
const rangeEnd = document.offsetAt(range.end);
for (const script of [document.scriptInfo, document.moduleScriptInfo]) {
if (!script || script.end < rangeStart || script.start > rangeEnd) {
continue;
}

for (const offset of [
Math.max(script.start, rangeStart),
Math.min(script.end, rangeEnd)
]) {
const generatedPosition = snapshot.getGeneratedPosition(
document.positionAt(offset)
);
if (generatedPosition.line < 0) {
continue;
}

const generatedOffset = snapshot.offsetAt(generatedPosition);
start = Math.min(start, generatedOffset);
end = Math.max(end, generatedOffset);
}
}

return {
start,
length: end - start
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[
{
"label": [{ "value": ": " }, { "value": "number" }],
"position": { "line": 3, "character": 7 },
"kind": 1,
"paddingLeft": true
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<svelte:options runes />

<script lang="ts">
let a = 1;
</script>

{a}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[
{
"label": [{ "value": ": " }, { "value": "number" }],
"position": { "line": 5, "character": 7 },
"kind": 1,
"paddingLeft": true
},
{
"label": [{ "value": ": " }, { "value": "number" }],
"position": { "line": 1, "character": 7 },
"kind": 1,
"paddingLeft": true
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<script lang="ts">
let a = 1;
</script>

<script lang="ts" context="module">
let b = 1;
</script>

{a}{b}