Skip to content

Commit b8a87fe

Browse files
committed
LS in Worker & Cancellation
1 parent e8eeed8 commit b8a87fe

File tree

13 files changed

+427
-219
lines changed

13 files changed

+427
-219
lines changed

spx-gui/src/components/editor/code-editor/code-editor.ts

Lines changed: 50 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -277,14 +277,14 @@ class APIReferenceProvider implements IAPIReferenceProvider {
277277
class ResourceReferencesProvider implements IResourceReferencesProvider {
278278
constructor(private lspClient: SpxLSPClient) {}
279279
async provideResourceReferences(ctx: ResourceReferencesContext): Promise<ResourceReference[]> {
280-
return this.lspClient.getResourceReferences(ctx.textDocument.id)
280+
return this.lspClient.getResourceReferences({ signal: ctx.signal }, ctx.textDocument.id)
281281
}
282282
}
283283

284284
class InputHelperProvider implements IInputHelperProvider {
285285
constructor(private lspClient: SpxLSPClient) {}
286286
async provideInputSlots(ctx: InputHelperContext): Promise<InputSlot[]> {
287-
const slots = await this.lspClient.getInputSlots(ctx.textDocument.id)
287+
const slots = await this.lspClient.getInputSlots({ signal: ctx.signal }, ctx.textDocument.id)
288288
return slots.filter((slot) => {
289289
if (slots.some((s) => s !== slot && rangeContains(s.range, slot.range))) return false
290290
return true
@@ -295,10 +295,13 @@ class InputHelperProvider implements IInputHelperProvider {
295295
class InlayHintProvider implements IInlayHintProvider {
296296
constructor(private lspClient: SpxLSPClient) {}
297297
async provideInlayHints(ctx: InlayHintContext): Promise<InlayHintItem[]> {
298-
const lspInlayHints = await this.lspClient.textDocumentInlayHint({
299-
textDocument: ctx.textDocument.id,
300-
range: toLSPRange(ctx.textDocument.getFullRange())
301-
})
298+
const lspInlayHints = await this.lspClient.textDocumentInlayHint(
299+
{ signal: ctx.signal },
300+
{
301+
textDocument: ctx.textDocument.id,
302+
range: toLSPRange(ctx.textDocument.getFullRange())
303+
}
304+
)
302305
const result: InlayHintItem[] = []
303306
if (lspInlayHints == null) return result
304307
for (const ih of lspInlayHints) {
@@ -393,9 +396,12 @@ class DiagnosticsProvider
393396

394397
private async getLSDiagnostics(ctx: DiagnosticsContext) {
395398
const diagnostics: Diagnostic[] = []
396-
const report = await this.lspClient.textDocumentDiagnostic({
397-
textDocument: ctx.textDocument.id
398-
})
399+
const report = await this.lspClient.textDocumentDiagnostic(
400+
{ signal: ctx.signal },
401+
{
402+
textDocument: ctx.textDocument.id
403+
}
404+
)
399405
if (report.kind !== lsp.DocumentDiagnosticReportKind.Full)
400406
throw new Error(`Report kind ${report.kind} not supported`)
401407
for (const item of report.items) {
@@ -419,7 +425,7 @@ class HoverProvider implements IHoverProvider {
419425

420426
private async getExplainAction(textDocument: TextDocumentIdentifier, position: Position) {
421427
let definition: DefinitionDocumentationItem | null = null
422-
const defId = await this.lspClient.getDefinition(textDocument, position)
428+
const defId = await this.lspClient.getDefinition({}, textDocument, position)
423429
if (defId == null) return null
424430
definition = await this.documentBase.getDocumentation(defId)
425431
if (definition == null) return null
@@ -438,7 +444,10 @@ class HoverProvider implements IHoverProvider {
438444
private async getGoToDefinitionAction(position: Position, lspParams: lsp.TextDocumentPositionParams) {
439445
const lspClient = this.lspClient
440446
const [definition, typeDefinition] = (
441-
await Promise.all([lspClient.textDocumentDefinition(lspParams), lspClient.textDocumentTypeDefinition(lspParams)])
447+
await Promise.all([
448+
lspClient.textDocumentDefinition({}, lspParams),
449+
lspClient.textDocumentTypeDefinition({}, lspParams)
450+
])
442451
).map((def) => {
443452
if (def == null) return null
444453
if (Array.isArray(def)) return def[0]
@@ -461,7 +470,7 @@ class HoverProvider implements IHoverProvider {
461470

462471
private async getRenameAction(ctx: HoverContext, position: Position, lspParams: lsp.TextDocumentPositionParams) {
463472
const lspClient = this.lspClient
464-
const result = await lspClient.textDocumentPrepareRename(lspParams)
473+
const result = await lspClient.textDocumentPrepareRename({ signal: ctx.signal }, lspParams)
465474
if (result == null || !lsp.Range.is(result)) return null // For now, we support Range only
466475
return {
467476
command: builtInCommandRename,
@@ -480,7 +489,7 @@ class HoverProvider implements IHoverProvider {
480489
textDocument: ctx.textDocument.id,
481490
position: toLSPPosition(position)
482491
}
483-
const lspHover = await this.lspClient.textDocumentHover(lspParams)
492+
const lspHover = await this.lspClient.textDocumentHover({ signal: ctx.signal }, lspParams)
484493
if (lspHover == null) return null
485494
const contents: DefinitionDocumentationString[] = []
486495
if (lsp.MarkupContent.is(lspHover.contents)) {
@@ -544,10 +553,13 @@ class CompletionProvider implements ICompletionProvider {
544553
}
545554

546555
async provideCompletion(ctx: CompletionContext, position: Position): Promise<CompletionItem[]> {
547-
const items = await this.lspClient.getCompletionItems({
548-
textDocument: ctx.textDocument.id,
549-
position: toLSPPosition(position)
550-
})
556+
const items = await this.lspClient.getCompletionItems(
557+
{ signal: ctx.signal },
558+
{
559+
textDocument: ctx.textDocument.id,
560+
position: toLSPPosition(position)
561+
}
562+
)
551563
const lineContent = ctx.textDocument.getLineContent(position.line)
552564
const isLineEnd = lineContent.length === position.column - 1
553565
const maybeItems = await Promise.all(
@@ -603,8 +615,8 @@ class ContextMenuProvider implements IContextMenuProvider {
603615
private documentBase: DocumentBase
604616
) {}
605617

606-
private async getExplainMenuItemForPosition({ textDocument }: ContextMenuContext, position: Position) {
607-
const defId = await this.lspClient.getDefinition(textDocument.id, position)
618+
private async getExplainMenuItemForPosition({ signal, textDocument }: ContextMenuContext, position: Position) {
619+
const defId = await this.lspClient.getDefinition({ signal }, textDocument.id, position)
608620
if (defId == null) return null
609621
const definition = await this.documentBase.getDocumentation(defId)
610622
if (definition == null) return null
@@ -620,12 +632,12 @@ class ContextMenuProvider implements IContextMenuProvider {
620632
}
621633
}
622634

623-
private async getRenameMenuItemForPosition({ textDocument }: ContextMenuContext, position: Position) {
635+
private async getRenameMenuItemForPosition({ textDocument, signal }: ContextMenuContext, position: Position) {
624636
const lspParams = {
625637
textDocument: textDocument.id,
626638
position: toLSPPosition(position)
627639
}
628-
const result = await this.lspClient.textDocumentPrepareRename(lspParams)
640+
const result = await this.lspClient.textDocumentPrepareRename({ signal }, lspParams)
629641
if (result == null || !lsp.Range.is(result)) return null // For now, we support Range only
630642
return {
631643
command: builtInCommandRename,
@@ -959,10 +971,13 @@ export class CodeEditor extends Disposable {
959971
async formatTextDocument(id: TextDocumentIdentifier) {
960972
const textDocument = this.getTextDocument(id)
961973
if (textDocument == null) return
962-
const edits = await this.lspClient.textDocumentFormatting({
963-
textDocument: id,
964-
options: lsp.FormattingOptions.create(tabSize, insertSpaces)
965-
})
974+
const edits = await this.lspClient.textDocumentFormatting(
975+
{},
976+
{
977+
textDocument: id,
978+
options: lsp.FormattingOptions.create(tabSize, insertSpaces)
979+
}
980+
)
966981
if (edits == null) return
967982
textDocument.pushEdits(edits.map(fromLSPTextEdit))
968983
}
@@ -988,7 +1003,7 @@ export class CodeEditor extends Disposable {
9881003
}
9891004

9901005
async diagnosticWorkspace(): Promise<WorkspaceDiagnostics> {
991-
const diagnosticReport = await this.lspClient.workspaceDiagnostic({ previousResultIds: [] })
1006+
const diagnosticReport = await this.lspClient.workspaceDiagnostic({}, { previousResultIds: [] })
9921007
const items: TextDocumentDiagnostics[] = []
9931008
for (const report of diagnosticReport.items) {
9941009
if (report.kind === 'unchanged') continue // For now, we support 'full' reports only
@@ -1002,18 +1017,21 @@ export class CodeEditor extends Disposable {
10021017

10031018
/** Update code for renaming */
10041019
async rename(id: TextDocumentIdentifier, position: Position, newName: string) {
1005-
const edit = await this.lspClient.textDocumentRename({
1006-
textDocument: id,
1007-
position: toLSPPosition(position),
1008-
newName
1009-
})
1020+
const edit = await this.lspClient.textDocumentRename(
1021+
{},
1022+
{
1023+
textDocument: id,
1024+
position: toLSPPosition(position),
1025+
newName
1026+
}
1027+
)
10101028
if (edit == null) return
10111029
this.applyWorkspaceEdit(edit)
10121030
}
10131031

10141032
/** Update code for resource renaming, should be called before model name update */
10151033
async renameResource(resource: ResourceIdentifier, newName: string) {
1016-
const edit = await this.lspClient.workspaceExecuteCommandSpxRenameResources({ resource, newName })
1034+
const edit = await this.lspClient.workspaceExecuteCommandSpxRenameResources({}, { resource, newName })
10171035
if (edit == null) return
10181036
this.applyWorkspaceEdit(edit)
10191037
}

spx-gui/src/components/editor/code-editor/context.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { watchEffect, type InjectionKey, inject, provide } from 'vue'
1+
import { type InjectionKey, inject, provide, watch } from 'vue'
22
import { shikiToMonaco } from '@shikijs/monaco'
33
import { useI18n } from '@/utils/i18n'
44
import { ProgressCollector } from '@/utils/progress'
@@ -179,12 +179,15 @@ export function useProvideCodeEditorCtx(
179179
const editorRef = editorQueryRet.data
180180
const monacoRef = monacoQueryRet.data
181181

182-
watchEffect((onCleanUp) => {
183-
const editor = editorRef.value
184-
if (editor == null) return
185-
editor.init()
186-
onCleanUp(() => editor.dispose())
187-
})
182+
watch(
183+
editorRef,
184+
(editor, _, onCleanUp) => {
185+
if (editor == null) return
186+
editor.init()
187+
onCleanUp(() => editor.dispose())
188+
},
189+
{ immediate: true }
190+
)
188191

189192
provide(codeEditorCtxInjectionKey, {
190193
attachUI(ui: ICodeEditorUI) {

0 commit comments

Comments
 (0)