116 lines
6.3 KiB
JavaScript
116 lines
6.3 KiB
JavaScript
import { TextDocumentSyncKind } from 'vscode-languageserver';
|
|
import { getLanguageService as getCustomLanguageService, } from './languageservice/yamlLanguageService';
|
|
import { workspaceFoldersChanged } from './languageservice/utils/paths';
|
|
import { URI } from 'vscode-uri';
|
|
import { LanguageHandlers } from './languageserver/handlers/languageHandlers';
|
|
import { NotificationHandlers } from './languageserver/handlers/notificationHandlers';
|
|
import { RequestHandlers } from './languageserver/handlers/requestHandlers';
|
|
import { ValidationHandler } from './languageserver/handlers/validationHandlers';
|
|
import { SettingsHandler } from './languageserver/handlers/settingsHandlers';
|
|
import { YamlCommands } from './commands';
|
|
import { WorkspaceHandlers } from './languageserver/handlers/workspaceHandlers';
|
|
import { commandExecutor } from './languageserver/commandExecutor';
|
|
import { registerCommands } from './languageservice/services/yamlCommands';
|
|
export class YAMLServerInit {
|
|
constructor(connection, yamlSettings, workspaceContext, schemaRequestService, telemetry) {
|
|
this.connection = connection;
|
|
this.yamlSettings = yamlSettings;
|
|
this.workspaceContext = workspaceContext;
|
|
this.schemaRequestService = schemaRequestService;
|
|
this.telemetry = telemetry;
|
|
this.yamlSettings.documents.listen(this.connection);
|
|
/**
|
|
* Run when the client connects to the server after it is activated.
|
|
* The server receives the root path(s) of the workspace and the client capabilities.
|
|
*/
|
|
this.connection.onInitialize((params) => {
|
|
return this.connectionInitialized(params);
|
|
});
|
|
this.connection.onInitialized(() => {
|
|
if (this.yamlSettings.hasWsChangeWatchedFileDynamicRegistration) {
|
|
this.connection.workspace.onDidChangeWorkspaceFolders((changedFolders) => {
|
|
this.yamlSettings.workspaceFolders = workspaceFoldersChanged(this.yamlSettings.workspaceFolders, changedFolders);
|
|
});
|
|
}
|
|
// need to call this after connection initialized
|
|
this.settingsHandler.registerHandlers();
|
|
this.settingsHandler.pullConfiguration();
|
|
});
|
|
}
|
|
// public for test setup
|
|
connectionInitialized(params) {
|
|
this.yamlSettings.capabilities = params.capabilities;
|
|
this.languageService = getCustomLanguageService({
|
|
schemaRequestService: this.schemaRequestService,
|
|
workspaceContext: this.workspaceContext,
|
|
connection: this.connection,
|
|
yamlSettings: this.yamlSettings,
|
|
telemetry: this.telemetry,
|
|
clientCapabilities: 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.yamlSettings.hasConfigurationCapability = !!(this.yamlSettings.capabilities.workspace && !!this.yamlSettings.capabilities.workspace.configuration);
|
|
this.yamlSettings.hasWsChangeWatchedFileDynamicRegistration = !!(this.yamlSettings.capabilities.workspace &&
|
|
this.yamlSettings.capabilities.workspace.didChangeWatchedFiles &&
|
|
this.yamlSettings.capabilities.workspace.didChangeWatchedFiles.dynamicRegistration);
|
|
this.registerHandlers();
|
|
registerCommands(commandExecutor, this.connection);
|
|
return {
|
|
capabilities: {
|
|
textDocumentSync: TextDocumentSyncKind.Incremental,
|
|
completionProvider: { resolveProvider: false },
|
|
hoverProvider: true,
|
|
documentSymbolProvider: true,
|
|
documentFormattingProvider: false,
|
|
documentOnTypeFormattingProvider: {
|
|
firstTriggerCharacter: '\n',
|
|
},
|
|
documentRangeFormattingProvider: false,
|
|
definitionProvider: true,
|
|
documentLinkProvider: {},
|
|
foldingRangeProvider: true,
|
|
selectionRangeProvider: true,
|
|
codeActionProvider: true,
|
|
codeLensProvider: {
|
|
resolveProvider: false,
|
|
},
|
|
executeCommandProvider: {
|
|
commands: Object.keys(YamlCommands).map((k) => YamlCommands[k]),
|
|
},
|
|
workspace: {
|
|
workspaceFolders: {
|
|
changeNotifications: true,
|
|
supported: true,
|
|
},
|
|
},
|
|
},
|
|
};
|
|
}
|
|
registerHandlers() {
|
|
// Register all features that the language server has
|
|
this.validationHandler = new ValidationHandler(this.connection, this.languageService, this.yamlSettings);
|
|
this.settingsHandler = new SettingsHandler(this.connection, this.languageService, this.yamlSettings, this.validationHandler, this.telemetry);
|
|
// this.settingsHandler.registerHandlers();
|
|
this.languageHandler = new LanguageHandlers(this.connection, this.languageService, this.yamlSettings, this.validationHandler);
|
|
this.languageHandler.registerHandlers();
|
|
new NotificationHandlers(this.connection, this.languageService, this.yamlSettings, this.settingsHandler).registerHandlers();
|
|
new RequestHandlers(this.connection, this.languageService).registerHandlers();
|
|
new WorkspaceHandlers(this.connection, commandExecutor).registerHandlers();
|
|
}
|
|
start() {
|
|
this.connection.listen();
|
|
}
|
|
}
|
|
//# sourceMappingURL=yamlServerInit.js.map
|