Skip to content

Commit 75aa73e

Browse files
authored
Support all text document operations (#1474)
1 parent a00974d commit 75aa73e

File tree

2 files changed

+44
-6
lines changed

2 files changed

+44
-6
lines changed

packages/langium/src/lsp/document-update-handler.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
* terms of the MIT License, which is available in the project root.
55
******************************************************************************/
66

7-
import { DidChangeWatchedFilesNotification, FileChangeType, type DidChangeWatchedFilesParams, type DidChangeWatchedFilesRegistrationOptions, type TextDocumentChangeEvent } from 'vscode-languageserver';
7+
import type { TextDocumentWillSaveEvent, DidChangeWatchedFilesParams, DidChangeWatchedFilesRegistrationOptions, TextDocumentChangeEvent, TextEdit } from 'vscode-languageserver';
8+
import { DidChangeWatchedFilesNotification, FileChangeType } from 'vscode-languageserver';
89
import { stream } from '../utils/stream.js';
910
import { URI } from '../utils/uri-utils.js';
1011
import type { DocumentBuilder } from '../workspace/document-builder.js';
@@ -13,21 +14,32 @@ import type { WorkspaceLock } from '../workspace/workspace-lock.js';
1314
import type { LangiumSharedServices } from './lsp-services.js';
1415
import type { WorkspaceManager } from '../workspace/workspace-manager.js';
1516
import type { ServiceRegistry } from '../service-registry.js';
17+
import type { MaybePromise } from '../utils/promise-utils.js';
1618

1719
/**
1820
* Shared service for handling text document changes and watching relevant files.
1921
*/
2022
export interface DocumentUpdateHandler {
2123

24+
didOpenDocument?(event: TextDocumentChangeEvent<TextDocument>): void;
25+
2226
/**
2327
* A content change event was triggered by the `TextDocuments` service.
2428
*/
25-
didChangeContent(change: TextDocumentChangeEvent<TextDocument>): void;
29+
didChangeContent?(event: TextDocumentChangeEvent<TextDocument>): void;
30+
31+
willSaveDocument?(event: TextDocumentWillSaveEvent<TextDocument>): void;
32+
33+
willSaveDocumentWaitUntil?(event: TextDocumentWillSaveEvent<TextDocument>): MaybePromise<TextEdit[]>;
34+
35+
didSaveDocument?(event: TextDocumentChangeEvent<TextDocument>): void;
36+
37+
didCloseDocument?(event: TextDocumentChangeEvent<TextDocument>): void;
2638

2739
/**
2840
* The client detected changes to files and folders watched by the language client.
2941
*/
30-
didChangeWatchedFiles(params: DidChangeWatchedFilesParams): void;
42+
didChangeWatchedFiles?(params: DidChangeWatchedFilesParams): void;
3143

3244
}
3345

packages/langium/src/lsp/language-server.ts

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ export class DefaultLanguageServer implements LanguageServer {
9898
}
9999

100100
protected buildInitializeResult(_params: InitializeParams): InitializeResult {
101+
const documentUpdateHandler = this.services.lsp.DocumentUpdateHandler;
101102
const fileOperationOptions = this.services.lsp.FileOperationHandler?.fileOperationOptions;
102103
const allServices: readonly LangiumCoreAndPartialLSPServices[] = this.services.ServiceRegistry.all;
103104
const hasFormattingService = this.hasService(e => e.lsp?.Formatter);
@@ -136,7 +137,13 @@ export class DefaultLanguageServer implements LanguageServer {
136137
executeCommandProvider: commandNames && {
137138
commands: commandNames
138139
},
139-
textDocumentSync: TextDocumentSyncKind.Incremental,
140+
textDocumentSync: {
141+
change: TextDocumentSyncKind.Incremental,
142+
openClose: true,
143+
save: Boolean(documentUpdateHandler.didSaveDocument),
144+
willSave: Boolean(documentUpdateHandler.willSaveDocument),
145+
willSaveWaitUntil: Boolean(documentUpdateHandler.willSaveDocumentWaitUntil)
146+
},
140147
completionProvider: hasCompletionProvider ? completionOptions : undefined,
141148
referencesProvider: hasReferencesProvider,
142149
documentSymbolProvider: hasDocumentSymbolProvider,
@@ -267,8 +274,27 @@ export function startLanguageServer(services: LangiumSharedServices): void {
267274
export function addDocumentUpdateHandler(connection: Connection, services: LangiumSharedServices): void {
268275
const handler = services.lsp.DocumentUpdateHandler;
269276
const documents = services.workspace.TextDocuments;
270-
documents.onDidChangeContent(change => handler.didChangeContent(change));
271-
connection.onDidChangeWatchedFiles(params => handler.didChangeWatchedFiles(params));
277+
if (handler.didOpenDocument) {
278+
documents.onDidOpen(change => handler.didOpenDocument!(change));
279+
}
280+
if (handler.didChangeContent) {
281+
documents.onDidChangeContent(change => handler.didChangeContent!(change));
282+
}
283+
if (handler.didCloseDocument) {
284+
documents.onDidClose(change => handler.didCloseDocument!(change));
285+
}
286+
if (handler.didSaveDocument) {
287+
documents.onDidSave(change => handler.didSaveDocument!(change));
288+
}
289+
if (handler.willSaveDocument) {
290+
documents.onWillSave(event => handler.willSaveDocument!(event));
291+
}
292+
if (handler.willSaveDocumentWaitUntil) {
293+
documents.onWillSaveWaitUntil(event => handler.willSaveDocumentWaitUntil!(event));
294+
}
295+
if (handler.didChangeWatchedFiles) {
296+
connection.onDidChangeWatchedFiles(params => handler.didChangeWatchedFiles!(params));
297+
}
272298
}
273299

274300
export function addFileOperationHandler(connection: Connection, services: LangiumSharedServices): void {

0 commit comments

Comments
 (0)