Как реализовать QuickFix через языковой сервер
Я реализовал языковой сервер, который обеспечивает некоторую задержку. Линтер проверяет наличие необходимых свойств и выдает ошибки "отсутствует свойство". Я хотел бы иметь соответствующие быстрые исправления "вставить отсутствующее свойство" для этих ошибок.
Я думаю, что общая область протокола LSP, предназначенная для этого:
ТекстовыйДокумент / codeAction
При этом сервер может вернуть команду "вставить отсутствующее свойство" для диагностического маркера "отсутствующее свойство".
Но как сервер сам реализует команду "вставить отсутствующее свойство"?
Просматривая спецификацию lsp, я не могу найти ничего, что позволяет серверу регистрировать команды.
Я нашел некоторую информацию о vscode apis для регистрации команд на стороне клиента здесь: https://code.visualstudio.com/docs/extensionAPI/vscode-api
Поэтому я полагаю, что мог бы зарегистрировать и реализовать "вставку отсутствующих свойств" на стороне клиента, но...
Клиентская сторона - это всего лишь "тупая" оболочка, передающая большую часть работы серверу. Как таковой, он не совсем понимает структуру документа и не очень подходит для реализации преобразований документа, которые требуют понимания этой структуры.
Похоже, мой лучший вариант - добавить некоторый "настраиваемый" протокол на мой языковой сервер, чтобы я мог реализовать команду "вставить отсутствующие свойства" на стороне клиента, но делегировать сложную часть вычисления правок для быстрого исправления обратно на сервер.,
Или... есть ли лучший способ?
1 ответ
Да, есть лучший способ, который не требует каких-либо пользовательских расширений протокола. Это примерно шаги:
Сначала убедитесь, что ваше расширение vscode package.json
имеет современный языковой сервер-клиент. Моя версия использует 3.2.x
, Мне также нужно было обновить версию движка vscode до 1.6.x
, Вот пример package.json
Теперь мы можем использовать версию 3 (только черновик на момент написания, но уже пригодный для использования) протокола языкового сервера. Вот интересные штуки:
textDocument/codeAction
: реализовать это на стороне сервера, чтобы вычислить список команд, которые представляют собой быстрые исправления.workspace/executeCommand
: реализовать это на стороне сервера для выполнения команд. Это может использоватьworkspace/applyEdit
отправить клиенту запрос на внесение изменений в документы в рабочей области.client/registerCapability
: Сервер может вызвать это сExecuteCommandRegistrationOptions
объект. Это регистрирует ваши команды на стороне сервера с клиентом, так что он знает, как выполнить их черезworkspace/executeCommand
Обработчик реализован на предыдущем шаге.initialize
: В качестве альтернативы использованиюclient/registerCapability
Вы также можете зарегистрировать команды на стороне сервера, возвращаяWorkspaceCapabilities
объект с соответствующей настройкой для егоexecuteCommandProvider
приписывать. Этот метод немного менее сложен (но может использоваться, только если вам не требуется динамически регистрировать / отменять регистрацию команд).
См. Также этот билет vscode, посвященный внедрению быстрых исправлений.
Важное примечание: в версии 3.2.0 реализации клиента языкового сервера есть ошибка, она использует неправильное имя client/registerFeature
вместо client/registerCapability
так что вам, возможно, придется обойти это, пока эта ошибка не будет исправлена. Если вы используете initialize
метод, то вы не затронуты этой ошибкой.