Как реализовать 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 метод, то вы не затронуты этой ошибкой.

Другие вопросы по тегам