Руководство по написанию LSP-клиента

#language-server-protocol

#язык-сервер-протокол

Вопрос:

У меня есть персональный редактор, который реализует свой собственный «протокол» для завершения кода, и я хотел бы переключиться на протокол Language server, чтобы облегчить себе некоторое бремя разработки. Однако я не смог полностью понять документацию LSP, касающуюся реализации клиента. Это перепутано с серверной реализацией и не может найти четкой разницы между ними.

Большая часть онлайн-документации (включая вопросы по SO) вращалась вокруг расширений VSCode, о которых я ничего не знаю и которые бесполезны.

Я был бы признателен за любую помощь, чтобы начать писать простой клиент, который просто запрашивает автозаполнение. Я пишу свой редактор на C и был бы признателен за любое руководство, объясняющее, как создать client. Я понимаю Python, C, C #, чистый JavaScript, C , PHP и подобные языки, поэтому я могу легко следовать любому руководству на этих языках.

Если что-то непонятно, дайте мне знать, чтобы я мог объяснить (это мой первый пост в LSP :))

Ответ №1:

Мэтти, конечно, ведет меня в правильном направлении. Самым сложным для меня было понять запрос / ответ. В LSP есть очень полезная страница с неудачным названием (ИМХО), которое ввело меня в заблуждение, «инспекция». Оказывается, это хороший пример для запроса / ответа.

Ответ №2:

Я успешно написал клиент, который получает результаты завершения с сервера. Вот (приблизительно) что он делает:

  • отправьте initialize
  • отправить initialized уведомление
  • отправьте textDocument/didOpen

На этом этапе ваш сервер должен быть готов ответить на textDocument/completion запрос. В зависимости от ответа вам также может потребоваться использовать completionItem/resolve . Однако на сегодняшний день мне это никогда не требовалось для серверов, которые я использовал.

Удачи!

Комментарии:

1. Спасибо за ответ. Какие интерфейсы вы использовали в клиенте?

2. Я не уверен на 100%, что понимаю вопрос. Какие интерфейсы вы имеете в виду? Вы имеете в виду возможность регистрации / отмены регистрации? Они необязательны и используются для динамической настройки вашей поддержки функций. Я ими вообще не пользовался.

3. Я понял. Спасибо

4. можете ли вы обновить содержимое вашего jsonrpc, поскольку мой здесь не работает. Вот что я отправляю в initialize: {"jsonrpc": "2.0", "method": "initialize", "params":{ "rootPath": "/Users/userpc/Desktop/folder", "rootUri": "file:////Users/userpc/Desktop/folder", "initializationOptions": {}, "trace": "verbose", } }

5. Спасибо. LSP — это хорошая вещь. Однако одна ошибка заключается в том, что они думают, что все разбираются в VSCode / Typescript. и документации очень не хватает для кого-то за пределами этого сообщества (где существует множество инструментов для LSP)