Языковой сервер VSCode — узел
Этот репозиторий содержит код для следующих модулей npm:
- vscode-languageclient : модуль npm для связи с языковым сервером VSCode из расширения VSCode:
- vscode-languageserver : модуль npm для реализации языкового сервера VSCode с использованием Node.js в качестве среды выполнения:
- vscode-languageserver-textdocument : модуль npm для реализации текстовых документов, которые можно использовать на сервере LSP, используя Node.js в качестве среды выполнения:
- vscode-languageserver-protocol : фактическое определение протокола языкового сервера в TypeScript:
- vscode-languageserver-types : типы данных, используемые клиентом и сервером языкового сервера:
- vscode-jsonrpc : базовый протокол сообщений для связи между клиентом и сервером:
Все модули npm создаются с использованием одного конвейера Azure. Его статус:
Нажмите здесь, чтобы получить подробный документ о том, как использовать эти модули npm для реализации языковых серверов для VSCode.
Содействие
После клонирования репозитория запустите npm install
, чтобы установить зависимости, и npm run symlink
, чтобы связать пакеты в этом репозитории друг с другом.
История
Далее (Клиент 10.0.0-next.* и Сервер 10.0.0-next.*)
- Обновлены до более новых библиотек, компиляторов и правил экспорта package.json:
- Компилятор обновлен до
5.5.x
- Libs теперь зависят от NodeJS
20.9.0
и es2022
. См. также отображение целевых узлов узла TypeScript. -
vscode-jsonrpc
, vscode-languageserver-protocol
, vscode-languageclient
и vscode-languageserver
теперь используют свойство exports
вместо свойств main
и typings
. Это может потребовать принятия в файлах tsconfig.json вокруг module
и moduleResolution
. Библиотеки LSP в настоящее время используют node16
для обоих значений.
- добавлен предложенный CodeActionKind.RefactorMove
- поддержка фрагментов в редактировании рабочей области
- поддержка контроля параллелизма отправки запросов и уведомлений. Это критическое изменение, поскольку оно позволяет обработчикам уведомлений возвращать обещание контролировать это.
- сделать реализацию браузера клиента согласованной с реализацией узла с точки зрения аргументов. Это критическое изменение, поскольку оно изменило порядок объявлений параметров.
- В промежуточное программное обеспечение show document добавлен
CancellationToken
, чтобы обеспечить его согласованность с другим промежуточным программным обеспечением. Это критическое изменение, поскольку оно добавило обязательный параметр.
3.17.5 Протокол, Клиент 9.0.1 и Сервер 9.0.1
- исправить комплектацию ESM
3.17.4 Протокол, 8.2.0 JSON-RPC 9.0.0 Клиент и 9.0.0 Сервер
- добавлен предлагаемый встроенный запрос на завершение.
- добавлен запрос предлагаемых диапазонов форматирования.
- добавлен предлагаемый запрос на обновление диапазонов складывания. Это изменило форму функции диапазона свертывания, поскольку нам нужно открыть источник событий. Изменение ломается. Чтобы попасть к провайдеру вам теперь нужно сделать
client . getFeature ( lsclient . FoldingRangeRequest . method ) . getProvider ( document ) ?. provider ;
- различные исправления ошибок
Протокол 3.17.4-next.0, 8.2.0-next.0 JSON-RPC, клиент 8.2.0-next.0 и сервер 8.2.0-next.0.
- поддержка промежуточного программного обеспечения для общих уведомлений и запросов, а также возможностей регистрации и отмены регистрации.
- различные исправления ошибок.
3.17.3 Протокол, 8.1.0 JSON-RPC, 8.1.0 Клиент и 8.1.0 Сервер.
- поддержка пользовательских обработчиков сообщений
- различные исправления ошибок. Следует отметить исправления проблем с упорядочиванием запросов при полной синхронизации документов.
3.17.2 Протокол, 8.0.2 JSON-RPC, 8.0.2 Клиент и 8.0.2 Сервер.
- сделать клиент более устойчивым к нежелательным перезапускам
- добавлен метод LanguageClient#dispose для полной утилизации клиента
- различные исправления ошибок.
Протокол 3.17.0, JSON-RPC 8.0.0, Клиент 8.0.0 и Сервер 8.0.0.
Конкретные изменения в библиотеке:
- очистка методов
start
и stop
клиента. Оба метода теперь возвращают обещание, поскольку эти методы являются асинхронными. Это критическое изменение, поскольку ранее start возвращал одноразовый вариант. Расширения теперь должны реализовать функцию деактивации в своем основном файле расширения и правильно возвращать обещание stop
из вызова деактивации. Как следствие, onReady()
был удален, поскольку теперь расширения могут ожидать вызова start()
. Старый код, такой
const client : LanguageClient = ... ;
client . start ( ) ;
await client . onReady ( ) ;
должно стать:
const client : LanguageClient = ... ;
await client . start ( ) ;
- регистрация уведомлений и обработчиков запросов теперь может происходить до запуска клиента. Это гарантирует, что ни одно сообщение с сервера не будет пропущено.
- если расширение отправляет уведомление или запрос до запуска клиента, клиент запустится автоматически.
- все методы
sendNotification
теперь возвращают обещание. Возврат обещания был необходим, поскольку фактическая запись сообщения в базовый транспорт является асинхронной, и клиент, например, не мог определить, было ли уведомление передано транспорту. Это критическое изменение в том смысле, что оно может привести к плавающему обещанию и может быть помечено линтером. - все регистрации обработчиков теперь возвращают Disposable, чтобы разрешить отмену регистрации обработчика.
- поведение
handleFailedRequest
изменилось. Вместо возврата значения по умолчанию при получении исключения от сервера метод теперь повторно выдает ошибку. Это гарантирует, что используется поведение VS Code по умолчанию при ошибках. Этот метод также обрабатывает RequestCancelled
и ServerCancelled
следующим образом:- если он получает
ServerCancelled
и клиент не отменил запрос, также выдайте CancellationError, чтобы попросить клиента повторно выполнить запрос. - если он получает
RequestCancelled
, то обычно клиент должен отменить запрос, и код вернет значение по умолчанию (согласно лучшей интерпретации спецификации 3.16). Если клиент не отменил операцию, интерпретируйте RequestCancelled
как ServerCancelled
.
- следующий обработчик клиентского промежуточного программного обеспечения теперь удаляет результаты сервера, если запрос уже был отменен на стороне клиента, возвращая значение по умолчанию VS Code для соответствующего поставщика (в основном
null
). Это критическое изменение, поскольку в предыдущих выпусках библиотеки промежуточное программное обеспечение также видело результат, который не использовался VS Code. Это изменение было сделано для экономии ресурсов ЦП и памяти за счет отказа от преобразования неиспользуемых результатов ответа. - все функции преобразователя, которые принимают массив, теперь являются асинхронными, выдают результат и принимают токен отмены. Это критическое изменение, введенное для того, чтобы избежать монополизации хоста расширения во время преобразования типов.
- тип возвращаемого значения ErrorHandler#error и ErrorHandler#closed изменился критическим образом. Теперь он поддерживает возврат дополнительного сообщения, которое будет отображаться пользователю.
- Добавлена поддержка встроенных значений.
- Добавлена поддержка инкрустации-подсказок.
- Добавлена поддержка иерархий типов.
- Добавлена поддержка документов блокнота.
Протокол 3.16.0, JSON-RPC 6.0.0, Клиент 7.0.0 и Сервер 7.0.0.
Подробный список изменений, внесенных в версию протокола 3.16.0, см. в журнале изменений спецификации 3.16.
Конкретные изменения в библиотеке:
- очистка типов запросов и уведомлений. Удален ненужный общий параметр RO. Это кардинальное изменение. Чтобы адаптироваться, просто удалите аргумент типа.
- добавлена новая концепция RegistrationType, которая отделяет метод регистрации от фактического метода запроса или уведомления. Это кардинальное изменение для разработчиков пользовательских функций. Чтобы адаптироваться, переименуйте свойство
messages
в registrationType
и верните соответствующий RegistrationType
. Дополнительно удалите первый параметр из метода register
. - очистка
ErrorCodes
. Коды ошибок, специфичные для LSP, были перенесены в новое пространство имен LSPErrorCodes
. Пространство имен ErrorCodes
в jsonrpc
неправильно зарезервировано для конкретных кодов ошибок JSON RPC. Это кардинальное изменение. Чтобы решить эту проблему, используйте вместо этого LSPErrorCodes
. - разделить код на общий, узел и браузер, чтобы разрешить использование клиентских и серверных модулей LSP npm в веб-браузере через веб-пакет. Это критическое изменение , и если его не принять, оно может привести к ошибкам компиляции/выполнения. Каждый модуль теперь имеет три разных экспорта, которые представляют собой разделение на общий, узел и браузер. Давайте рассмотрим пример
vscode-jsonrpc
: (а) импорт vscode-jsonrpc
будет импортировать только общий код, (б) импорт vscode-jsonrpcnode
будет импортировать общий код и код узла и (в) импорт vscode-jsonrpcbrowser
импортирует общий код и код браузера. - добавлена поддержка управления структурой параметров при отправке запросов и уведомлений в
vscode-jsonrpc
. Структурой параметра можно управлять с помощью дополнительного parameterStructures
при создании типа запроса или уведомления или при отправке нетипизированного запроса или уведомления с помощью функции sendRequest
или sendNotification
. По умолчанию используется ParameterStructures.auto
, который выполняет следующие действия:- используйте
byPosition
для сообщений с нулем или более чем одним параметром - для одного параметра он использовал
byName
для параметров, которые являются литералами объекта. Для всех остальных параметров используется byPosition
.
3.15.3 Протокол, клиент 6.1.x и сервер 6.1.x
- Небольшие изменения в предлагаемой поддержке семантических токенов.
3.15.2 Протокол, клиент 6.1.x и сервер 6.1.x
- Предлагаемая поддержка семантических токенов.
Протокол 3.15.0, клиент 6.0.0 и сервер 6.0.0
- Поддержка прогресса проделанной работы и прогресса частичного результата.
- Предлагаемая реализация иерархий вызовов.
- Добавлен протокол
SelectionRangeRequest
:- Новые API в типах:
SelectionRange
- Новые API в протоколе:
SelectionRangeRequest
, SelectionRangeParams
, SelectionRangeClientCapabilities
, SelectionRangeServerCapabilities
, SelectionRangeProviderOptions
,
- Поддержка пользовательских реализаций текстовых документов:
- новый пакет npm
vscode-languageserver-textdocument
, который предоставляет стандартную реализацию текстового документа с базовым инкрементальным обновлением. Теперь серверу необходимо предварительно установить этот пакет npm. - устаревшая реализация текстового документа в типах.
- это привело к небольшой поломке на стороне сервера. Вместо создания
new TextDocuments
теперь вам нужно передать конфигурацию текстового документа, чтобы обеспечить обратные вызовы для создания и обновления текстового документа. Вот примеры на TypeScript и JavaScript.
import { TextDocuments } from 'vscode-languageserver' ;
import { TextDocument } from 'vscode-languageserver-textdocument' ;
const documents = new TextDocuments ( TextDocument ) ;
const server = require ( "vscode-languageserver" ) ;
const textDocument = require ( "vscode-languageserver-textdocument" ) ;
const documents = new server . TextDocuments ( textDocument . TextDocument ) ;
5.1.1 Клиент
- Исправляет клиент [textDocument/rename], который не подчиняется
RenameOptions
при регистрации провайдера.
Клиент 5.1.0 и сервер 5.1.0
- Принять версию протокола 3.13.0
3.13.0 Протокол
-
FoldingRangeRequestParam
переименован в «FoldingRangeParams» ( FoldingRangeRequestParam
по-прежнему предоставляется для обратной совместимости). - Добавлена поддержка операций создания, переименования и удаления файлов при редактировании рабочей области.
Клиент 5.0.0 и сервер 5.0.0
- Заставьте клиента работать с Electron 2.x. который используется начиная с VS Code 1.26.x
- Убедитесь, что ожидаемая версия клиента, указанная в
engines.vscode
в файле package.json
, соответствует версии VS Code, на которой работает клиент.
Клиент 4.4.0, Сервер 4.4.0 и Протокол 3.10.0
- Внедрить иерархическую структуру документа
-
Color
, ColorInformation
, ColorPresentation
перемещены в Типы. - Добавлен протокол
FoldingRangeRequest
:- Новые API в типах:
FoldingRange
, FoldingRangeKind
- Новые API в протоколе:
FoldingRangeRequest
, FoldingRangeRequestParam
, FoldingRangeClientCapabilities
, FoldingRangeServerCapabilities
, FoldingRangeProviderOptions
,
Клиент 4.3.0, Сервер 4.3.0 и Протокол 3.9.0
- Добавлена поддержка свойства
preselect
в CompletionItem
Клиент 4.2.0, Сервер 4.2.0 и Протокол 3.8.0
- Добавить класс CodeAction
- Добавить поддержку литерала действия кода в качестве возвращаемого значения запроса textDocument/codeAction.
4.1.4 Клиент и 4.1.3 Сервер
- Клиент: дублирующиеся сообщения, отправленные после перезапуска сервера.
4.1.1 Клиент
- Информация о сбое сервера потеряна, поскольку выходной канал закрыт.
4.1.0 Клиент и сервер
Добавьте поддержку сопутствующей информации в диагностике.
Исключения инициализации проглочены
Ошибки переименования по-прежнему не отображаются в VSCode
termerProcess.sh не поставляется в дистрибутивном пакете
Добавьте промежуточное программное обеспечение для перехвата textDocument/publishDiagnostics.
4.0.1 Клиент
- удален ненужный оператор журнала консоли.
4.0.0 Сервер и клиент
- реализованы последние дополнения протокола. Следует отметить контекст завершения, расширяемый элемент завершения и тип символа, а также поддержку уценки для элемента завершения и справку по подписи. Перешел на версию 4.0.0, поскольку введение контекста завершения потребовало кардинального изменения в промежуточном программном обеспечении клиента. Старая подпись:
provideCompletionItem?: ( this : void , document : TextDocument , position : VPosition , token : CancellationToken , next : ProvideCompletionItemsSignature ) => ProviderResult < VCompletionItem [ ] | VCompletionList > ;
теперь содержит дополнительный context
аргумента:
provideCompletionItem?: ( this : void , document : TextDocument , position : VPosition , context : VCompletionContext , token : CancellationToken , next : ProvideCompletionItemsSignature ) => ProviderResult < VCompletionItem [ ] | VCompletionList > ;
- Примечательные исправления:
- Получение значения после программного выполнения команды
- Бесконечная рекурсия в этом коде в VSCode 1.18.1
- LanguageClient#handleConnectionClosed не перезапускается, если this._resolvedConnection.dispose() выдает
6.0.0 Сервер и клиент
- Перейти к протоколу 3.15.0
- перенести цель JS на ES2017
3.15.0 Типы и протокол
3.6.1 Типы
- ESM добавлен в качестве выходного формата (для Webpack и других потребителей ESM).
3.5.0 Сервер и клиент
- разрешить клиенту запускать сервер в отключенном режиме. Если сервер работает отдельно, клиент не будет отслеживать серверный процесс и убивать его при завершении работы.
- исправление ошибок.
3.4.0 Сервер и клиент
- Был добавлен новый модуль npm
vscode-languageserver-protocol
, который содержит определения протоколов в TypeScript. Этот модуль теперь используется клиентом и сервером совместно. - поддержка предлагаемого протокола добавлена в модули
protocol
, client
и server
npm. Предлагаемый протокол может быть изменен, даже если он поставляется в стабильной версии модулей npm. - предлагаемый протокол был добавлен для следующих функций:
- конфигурация : поддержка получения настроек конфигурации путем отправки запроса с сервера клиенту.
- workspaceFolders : поддержка обработки более одной корневой папки в каждой рабочей области.
- colorProvider : поддержка вычисления цветовых диапазонов для документа.
3.3.0 Сервер и клиент
- клиент разделен на базовый клиент и основной клиент для поддержки повторного использования реализации клиента в других средах.
- сделал обработку запросов более асинхронной. Таким образом, вместо немедленной обработки запроса, когда код получает уведомление от обратного вызова Node.js, запрос теперь помещается в очередь и обрабатывается из очереди. Это позволяет при необходимости лучше удалять или сворачивать события.
- исправления ошибок см. апрель и май
3.2.1 Сервер и клиент
- Исправлено использование неправильного имени для метода
client/registerFeature
: должно быть client/registerCapability
3.2.0 Сервер и клиент
-
WorkspaceEdit
теперь соответствует версии спецификации 3.x и обратно совместим с версией библиотеки 2.x. - добавлен код ошибки
RequestCancelled
. - Исправлен nodePath, который не работал (vscode-tslint)
- Исправлено обновление с 3.0.4/3.0.5 до 3.1.0, ломающее мое расширение.
3.1.0 Сервер и клиент
- добавить поддержку именованных каналов и транспорта файлов сокетов
- исправлена проблема мертвой блокировки с node-ipc.
Сервер 3.0.5 и клиент 3.0.4
-
Files.uriToFilePath
устарел в пользу модуля npm vscode-uri, который обеспечивает более полную реализацию URI для VS Code. -
rootPath
стал необязательным, поскольку в версии 3.x он устарел.
3.0.3: Клиент, Сервер и JSON-RPC
Новые возможности
- Все библиотеки перенесены на TypeScript 2.xx.
- Клиент и сервер скомпилированы в ES6. JSON-RPC по-прежнему компилируется в ES5.
- JSON-RPC поддерживает запрос параметров n и вызов уведомлений.
- Поддержка версии 3.0 протокола языкового сервера. Некоторые основные моменты:
- Поддержка флагов функций.
- Поддержка динамической регистрации. В версии библиотеки 2.x сервер объявлял свои возможности статически. В версии 3.x сервер теперь может динамически регистрировать и отменять регистрацию обработчиков возможностей, используя новые запросы
client/registerCapability
и client/unregisterCapability
. - Поддержка делегирования выполнения команд через новую
workspace/executeCommand
на сервер.
- Поддержка фрагментов в элементах завершения:
- Новый тип
InsertTextFormat
- CompletionItem.insertTextFormat определяет, интерпретируется ли вставленный тест как обычный текст или как фрагмент.
Критические изменения:
- чтобы обеспечить упорядоченную доставку уведомлений и запросов, языковой клиент теперь выдает, если sendRequest, onRequest, sendNotification или onNotification вызывается до того, как клиент будет готов. Используйте обещание onReady(), чтобы дождаться готовности клиента.
let client = new LanguageClient ( ... ) ;
client . onReady ( ) . then ( ( ) => {
client . onNotification ( ... ) ;
client . sendRequest ( ... ) ;
) ;
- удалены устаревшие функции модуля в преобразователях code2Protocol и Protocol2Code. Вместо этого используйте соответствующие свойства экземпляра LanguageClient, чтобы получить доступ к тем же преобразователям, которые используются LanguageClient.
// Old
import { Protocol2Code , ... } from 'vscode-languageclient' ;
Protocol2Code . asTextEdits ( edits ) ;
// New
let client = new LanguageClient ( ... ) ;
client . protocol2CodeConverter . asTextEdits ( edits ) ;
- из-за использования TypeScript 2.xx и различий в генерации d.ts пользователям новой версии также необходимо перейти на TypeScript 2.xx. Обычно
LanguageClient
используется в расширении VS Code. Подробные инструкции по обновлению расширения VS Code до TypeScript 2.xx можно найти здесь. -
activeSignature
и activeParameter
неправильно объявлены как необязательные в SignatureHelp
. Теперь они являются обязательными. - файл
protocol.ts
использовал типы перечислений в версии 2.x. Однако сам протокол основан на числах, поскольку нельзя сделать никаких предположений о наличии типа перечисления в языке реализации. Чтобы сделать это более понятным, перечисление было заменено числовыми типами с определением буквального типа. Это может привести к ошибкам компиляции, если число было напрямую присвоено предыдущему типу перечисления без надлежащей проверки диапазона. - Типы запросов и уведомлений теперь являются классами, а не интерфейсами. Кроме того, теперь они принимают дополнительный аргумент типа для ввода параметров динамической регистрации. Принять это изменение довольно легко. Просто создайте новый
RequestType
или NotificationType
и добавьте void в качестве типа параметра регистрации. Не забудьте обновить это как на стороне клиента, так и на стороне сервера:
// Old
export namespace MyRequest {
export const type : RequestType < MyParams , MyResult , void > = { get method ( ) { return 'myRequest' ; } } ;
}
export namespace MyNotification {
export const type : NotificationType < MyParams > = { get method ( ) { return 'myNotification' ; } } ;
}
// New
export namespace MyRequest {
export const type = new RequestType < MyParams , MyResult , void , void > ( 'myRequest' ) ;
}
export namespace MyNotification {
export const type = new NotificationType < MyParams , void > ( 'myNotification' ) ;
}
2.6.0: Клиент и сервер
- Поддержка поставщиков ссылок на документы
- Поддержка дополнительных текстовых правок и команд в элементах завершения.
2.5.0: Клиент и сервер
- Улучшена обработка ошибок на стороне клиента.
- События для запуска и остановки сервера.
- Параметры инициализации могут быть предоставлены как функция.
- Поддержка кодировки stdio/stderr.
- Поддержка преобразования URI между клиентом и сервером.
- Журнал подключения к серверу. Консоль теперь отображается в соответствующем выходном канале, а не в консоли разработчика.
- Если между клиентом и сервером используется канал связи, отличный от stdio, stdio сервера перенаправляется на выходной канал.
- Теперь клиент может иметь идентификатор и имя.
2.4.0 Клиент и сервер
- Типы данных, такие как Range, Position, TextDocument, Hover, CompletionItem..., извлеченные в новый модуль узла vscode-languageserver-types . Новый модуль узла используется совместно сервером и клиентом, а также может использоваться библиотеками языковых служб, которые хотят использовать одни и те же типы данных.
2.3.0: Только клиент
- клиент теперь перезапускает сервер, если сервер выходит из строя без предварительного уведомления о выходе. Стратегия, используемая для перезапуска сервера, является подключаемой (см.
LanguageClientOptions.errorHandler
). Стратегия по умолчанию перезапускает сервер, если за последние 3 минуты он не вышел из строя 5 или более раз.
2.0: Подробное описание версии 2.0 можно найти здесь. Краткое изложение изменений:
- поддержка отмены запроса. Отмена автоматически привязывается к токенам отмены VSCode.
- уведомление о сохранении документа.
- Синхронизированные текстовые документы содержат номер версии текстового документа VSCode.
1.1.x: Предоставляет все функции языковых служб, доступные на узле расширения, через протокол языкового клиента/сервера. Добавлены функции:
- Действия кода: укажите действия для устранения диагностических проблем.
- Code Lens: предоставляет команды, которые отображаются вместе с исходным текстом.
- Форматирование: весь документ, диапазоны документов и форматирование по типу.
- Рефакторинг переименования: обеспечивает переименование символов.
1.0.x: Версия, обеспечивающая поддержку следующих функций:
- Транспорты: в качестве транспорта можно использовать stdio и node IPC.
- Синхронизация документов: инкрементальная и полнотекстовая синхронизация документов.
- Синхронизация конфигурации: синхронизация настроек конфигурации с сервером.
- События файла: синхронизация событий файла с сервером.
- Код завершен: предоставляет списки завершенного кода.
- Выделение документа: выделяет все «равные» символы в текстовом документе.
- При наведении: предоставляет информацию при наведении на символ, выбранный в текстовом документе.
- Справка по подписи: предоставляет справку по подписи для символа, выбранного в текстовом документе.
- Определение перехода: обеспечивает поддержку определения перехода для символа, выбранного в текстовом документе.
- Найти ссылки: находит все ссылки по всему проекту для символа, выбранного в текстовом документе.
- Список символов документа: список всех символов, определенных в текстовом документе.
- Список символов рабочей области: список всех символов всего проекта.
0.10.x: начальные версии для создания хорошего API для клиентской и серверной стороны.
Лицензия
Массачусетский технологический институт