protected registerLanguageProvider()

in client/src/common/client.ts [2233:2293]


	protected registerLanguageProvider(options: CodeActionRegistrationOptions): [Disposable, CodeActionProvider] {
		const selector = options.documentSelector!;
		const provider: CodeActionProvider = {
			provideCodeActions: (document, range, context, token) => {
				if ($DocumentSelector.skipCellTextDocument(selector, document)) {
					return undefined;
				}
				const client = this._client;
				const _provideCodeActions: ProvideCodeActionsSignature = (document, range, context, token) => {
					const params: CodeActionParams = {
						textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document),
						range: client.code2ProtocolConverter.asRange(range),
						context: client.code2ProtocolConverter.asCodeActionContext(context)
					};
					return client.sendRequest(CodeActionRequest.type, params, token).then((values) => {
						if (values === null) {
							return undefined;
						}
						const result: (VCommand | VCodeAction)[] = [];
						for (let item of values) {
							if (Command.is(item)) {
								result.push(client.protocol2CodeConverter.asCommand(item));
							} else {
								result.push(client.protocol2CodeConverter.asCodeAction(item));
							}
						}
						return result;
					},
					(error) => {
						return client.handleFailedRequest(CodeActionRequest.type, token, error, null);
					}
					);
				};
				const middleware = client.clientOptions.middleware!;
				return middleware.provideCodeActions
					? middleware.provideCodeActions(document, range, context, token, _provideCodeActions)
					: _provideCodeActions(document, range, context, token);
			},
			resolveCodeAction: options.resolveProvider
				? (item: VCodeAction, token: CancellationToken) => {
					const client = this._client;
					const middleware = this._client.clientOptions.middleware!;
					const resolveCodeAction: ResolveCodeActionSignature = (item, token) => {
						return client.sendRequest(CodeActionResolveRequest.type, client.code2ProtocolConverter.asCodeAction(item), token).then(
							client.protocol2CodeConverter.asCodeAction,
							(error) => {
								return client.handleFailedRequest(CodeActionResolveRequest.type, token, error, item);
							}
						);
					};
					return middleware.resolveCodeAction
						? middleware.resolveCodeAction(item, token, resolveCodeAction)
						: resolveCodeAction(item, token);
				}
				: undefined
		};
		return [Languages.registerCodeActionsProvider($DocumentSelector.asTextDocumentFilters(selector), provider,
			(options.codeActionKinds
				? { providedCodeActionKinds: this._client.protocol2CodeConverter.asCodeActionKinds(options.codeActionKinds) }
				: undefined)), provider];
	}