diff --git a/src/yamlServerInit.ts b/src/yamlServerInit.ts index d1b8776e..9c5a4fdb 100644 --- a/src/yamlServerInit.ts +++ b/src/yamlServerInit.ts @@ -13,24 +13,18 @@ import { NotificationHandlers } from './languageserver/handlers/notificationHand import { RequestHandlers } from './languageserver/handlers/requestHandlers'; import { ValidationHandler } from './languageserver/handlers/validationHandlers'; import { SettingsHandler } from './languageserver/handlers/settingsHandlers'; -import { ClientCapabilities } from 'vscode-json-languageservice'; export class YAMLServerInit { - private yamlSettings: SettingsState; languageService: LanguageService; languageHandler: LanguageHandlers; validationHandler: ValidationHandler; constructor( private readonly connection: IConnection, - yamlSettings: SettingsState, - workspaceContext: WorkspaceContextService, - schemaRequestService: SchemaRequestService + private yamlSettings: SettingsState, + private workspaceContext: WorkspaceContextService, + private schemaRequestService: SchemaRequestService ) { - this.yamlSettings = yamlSettings; - - this.languageService = getCustomLanguageService(schemaRequestService, workspaceContext, ClientCapabilities.LATEST); - this.yamlSettings.documents.listen(this.connection); /** @@ -39,48 +33,7 @@ export class YAMLServerInit { */ this.connection.onInitialize( (params: InitializeParams): InitializeResult => { - this.yamlSettings.capabilities = params.capabilities; - this.languageService = getCustomLanguageService(schemaRequestService, workspaceContext, params.capabilities); - - // Only try to parse the workspace root if its not null. Otherwise initialize will fail - if (params.rootUri) { - this.yamlSettings.workspaceRoot = URI.parse(params.rootUri); - } - this.yamlSettings.workspaceFolders = params.workspaceFolders || []; - - this.yamlSettings.hierarchicalDocumentSymbolSupport = !!( - this.yamlSettings.capabilities.textDocument && - this.yamlSettings.capabilities.textDocument.documentSymbol && - this.yamlSettings.capabilities.textDocument.documentSymbol.hierarchicalDocumentSymbolSupport - ); - this.yamlSettings.clientDynamicRegisterSupport = !!( - this.yamlSettings.capabilities.textDocument && - this.yamlSettings.capabilities.textDocument.rangeFormatting && - this.yamlSettings.capabilities.textDocument.rangeFormatting.dynamicRegistration - ); - this.yamlSettings.hasWorkspaceFolderCapability = - this.yamlSettings.capabilities.workspace && !!this.yamlSettings.capabilities.workspace.workspaceFolders; - return { - capabilities: { - textDocumentSync: this.yamlSettings.documents.syncKind, - completionProvider: { resolveProvider: false }, - hoverProvider: true, - documentSymbolProvider: true, - documentFormattingProvider: false, - documentOnTypeFormattingProvider: { - firstTriggerCharacter: '\n', - }, - documentRangeFormattingProvider: false, - documentLinkProvider: {}, - foldingRangeProvider: true, - workspace: { - workspaceFolders: { - changeNotifications: true, - supported: true, - }, - }, - }, - }; + return this.connectionInitialized(params); } ); this.connection.onInitialized(() => { @@ -90,7 +43,58 @@ export class YAMLServerInit { }); } }); + } + + // public for test setup + connectionInitialized(params: InitializeParams): InitializeResult { + this.yamlSettings.capabilities = params.capabilities; + this.languageService = getCustomLanguageService(this.schemaRequestService, this.workspaceContext, params.capabilities); + + // Only try to parse the workspace root if its not null. Otherwise initialize will fail + if (params.rootUri) { + this.yamlSettings.workspaceRoot = URI.parse(params.rootUri); + } + this.yamlSettings.workspaceFolders = params.workspaceFolders || []; + + this.yamlSettings.hierarchicalDocumentSymbolSupport = !!( + this.yamlSettings.capabilities.textDocument && + this.yamlSettings.capabilities.textDocument.documentSymbol && + this.yamlSettings.capabilities.textDocument.documentSymbol.hierarchicalDocumentSymbolSupport + ); + this.yamlSettings.clientDynamicRegisterSupport = !!( + this.yamlSettings.capabilities.textDocument && + this.yamlSettings.capabilities.textDocument.rangeFormatting && + this.yamlSettings.capabilities.textDocument.rangeFormatting.dynamicRegistration + ); + this.yamlSettings.hasWorkspaceFolderCapability = + this.yamlSettings.capabilities.workspace && !!this.yamlSettings.capabilities.workspace.workspaceFolders; + + this.registerHandlers(); + + return { + capabilities: { + textDocumentSync: this.yamlSettings.documents.syncKind, + completionProvider: { resolveProvider: false }, + hoverProvider: true, + documentSymbolProvider: true, + documentFormattingProvider: false, + documentOnTypeFormattingProvider: { + firstTriggerCharacter: '\n', + }, + documentRangeFormattingProvider: false, + documentLinkProvider: {}, + foldingRangeProvider: true, + workspace: { + workspaceFolders: { + changeNotifications: true, + supported: true, + }, + }, + }, + }; + } + private registerHandlers(): void { // Register all features that the language server has this.validationHandler = new ValidationHandler(this.connection, this.languageService, this.yamlSettings); const settingsHandler = new SettingsHandler(this.connection, this.languageService, this.yamlSettings, this.validationHandler); diff --git a/test/utils/testHelper.ts b/test/utils/testHelper.ts index b730908b..f6668a88 100644 --- a/test/utils/testHelper.ts +++ b/test/utils/testHelper.ts @@ -10,6 +10,7 @@ import { YAMLServerInit } from '../../src/yamlServerInit'; import { LanguageService, LanguageSettings } from '../../src'; import { ValidationHandler } from '../../src/languageserver/handlers/validationHandlers'; import { LanguageHandlers } from '../../src/languageserver/handlers/languageHandlers'; +import { ClientCapabilities } from 'vscode-json-languageservice'; export function toFsPath(str: unknown): string { if (typeof str !== 'string') { @@ -63,6 +64,12 @@ export function setupLanguageService(languageSettings: LanguageSettings): TestLa }; const schemaRequestService = schemaRequestHandlerWrapper.bind(this, connection); const serverInit = new YAMLServerInit(connection, yamlSettings, workspaceContext, schemaRequestService); + serverInit.connectionInitialized({ + processId: null, + capabilities: ClientCapabilities.LATEST, + rootUri: null, + workspaceFolders: null, + }); const languageService = serverInit.languageService; const validationHandler = serverInit.validationHandler; const languageHandler = serverInit.languageHandler;