Servidor de linguagem VSCode - Nó
Este repositório contém o código para os seguintes módulos npm:
- vscode-languageclient : módulo npm para se comunicar com um servidor de linguagem VSCode a partir de uma extensão VSCode:
- vscode-languageserver : módulo npm para implementar um servidor de linguagem VSCode usando Node.js como tempo de execução:
- vscode-languageserver-textdocument : módulo npm para implementar documentos de texto utilizáveis em um servidor LSP usando Node.js como tempo de execução:
- vscode-languageserver-protocol : a definição real do protocolo do servidor de linguagem no TypeScript:
- vscode-languageserver-types : tipos de dados usados pelo cliente e servidor do servidor de linguagem:
- vscode-jsonrpc : o protocolo de mensagem subjacente para comunicação entre um cliente e um servidor:
Todos os módulos npm são criados usando um Azure Pipeline. Seu status é:
Clique aqui para obter um documento detalhado sobre como usar esses módulos npm para implementar servidores de linguagem para VSCode.
Contribuindo
Após clonar o repositório, execute npm install
para instalar dependências e npm run symlink
para apontar os pacotes deste repositório entre si.
História
Próximo (10.0.0-next.* Cliente e 10.0.0-next.* Servidor)
- Atualizado para bibliotecas, compiladores e regras de exportação package.json mais recentes:
- Compilador atualizado para
5.5.x
. - As bibliotecas agora dependem do NodeJS
20.9.0
e es2022
. Consulte também o mapeamento de destino do nó do TypeScript. -
vscode-jsonrpc
, vscode-languageserver-protocol
, vscode-languageclient
e vscode-languageserver
agora usam a propriedade exports
em vez de ter uma propriedade main
e typings
. Isso pode precisar de adoção nos arquivos tsconfig.json em torno do module
e moduleResolution
. As bibliotecas LSP atualmente usam node16
para ambos os valores.
- adicionado CodeActionKind.RefactorMove proposto
- suporte a snippets nas edições do Workspace
- suporte para controle do paralelismo das solicitações de despacho e notificação. Esta é uma mudança significativa, pois permite que os manipuladores de notificação retornem uma promessa para controlar isso.
- tornar a implementação do navegador cliente consistente com a implementação do nó em termos de argumentos. Esta é uma mudança significativa, pois reordenou as declarações de parâmetros.
- Adicionado um
CancellationToken
ao middleware show document para torná-lo consistente com o outro middleware. Esta é uma alteração significativa, pois adicionou um parâmetro obrigatório.
3.17.5 Protocolo, 9.0.1 Cliente e 9.0.1 Servidor
- corrigir o empacotamento do ESM
3.17.4 Protocolo, 8.2.0 JSON-RPC 9.0.0 Cliente e 9.0.0 Servidor
- adicionada proposta de solicitação de conclusão em linha.
- adicionada solicitação de intervalos de formatação propostos.
- adicionada solicitação de atualização proposta para intervalos dobráveis. Isso mudou o formato do recurso de intervalo dobrável, pois precisamos expor o emissor do evento. A mudança está quebrando. Para chegar ao provedor agora você precisa fazer
client . getFeature ( lsclient . FoldingRangeRequest . method ) . getProvider ( document ) ?. provider ;
- várias correções de bugs
Protocolo 3.17.4-next.0, 8.2.0-next.0 JSON-RPC, Cliente 8.2.0-next.0 e Servidor 8.2.0-next.0.
- suporte de middleware para notificações e solicitações gerais, bem como para recursos de registro e cancelamento de registro.
- várias correções de bugs.
3.17.3 Protocolo, 8.1.0 JSON-RPC, 8.1.0 Cliente e 8.1.0 Servidor.
- suporte para manipuladores de mensagens personalizados
- várias correções de bugs. Dignos de nota são as correções para problemas de pedido de solicitação com sincronização completa de documentos.
3.17.2 Protocolo, 8.0.2 JSON-RPC, 8.0.2 Cliente e 8.0.2 Servidor.
- tornar o cliente mais robusto contra reinicializações indesejadas
- adicionou um método LanguageClient#dispose para descartar totalmente um cliente
- várias correções de bugs.
Protocolo 3.17.0, 8.0.0 JSON-RPC, Cliente 8.0.0 e Servidor 8.0.0.
As alterações específicas da biblioteca são:
- limpeza dos métodos
start
e stop
do cliente. Ambos os métodos agora retornam uma promessa, pois são assíncronos. Esta é uma mudança significativa, já que o início retornou um descartável antes. As extensões agora devem implementar uma função deactivate em seu arquivo principal de extensão e retornar corretamente a promessa stop
da chamada deactivate. Como consequência, onReady()
foi removido, pois as extensões podem aguardar a chamada start()
agora. Código antigo como este
const client : LanguageClient = ... ;
client . start ( ) ;
await client . onReady ( ) ;
deveria se tornar:
const client : LanguageClient = ... ;
await client . start ( ) ;
- a notificação e o registro do manipulador de solicitação agora podem acontecer antes do cliente ser iniciado. Isso garante que nenhuma mensagem do servidor seja perdida.
- se uma extensão enviar uma notificação ou solicitação antes do cliente ser iniciado, o cliente será iniciado automaticamente.
- todos os métodos
sendNotification
agora retornam uma promessa. O retorno de uma promessa era necessário, pois a gravação real da mensagem no transporte subjacente é assíncrona e um cliente, por exemplo, não conseguia determinar se uma notificação foi entregue ao transporte. Esta é uma mudança significativa no sentido de que pode resultar em uma promessa flutuante e pode ser sinalizada por um linter. - todos os registros de manipuladores agora retornam um Descartável para permitir o cancelamento do registro do manipulador.
- o comportamento de
handleFailedRequest
mudou. Em vez de retornar um valor padrão quando uma exceção é recebida do servidor, o método agora lança novamente o erro. Isso garante que o comportamento padrão do VS Code em caso de erros seja usado. O método também trata RequestCancelled
e ServerCancelled
da seguinte maneira:- se receber
ServerCancelled
e o cliente não cancelar a solicitação, lance também CancellationError para solicitar ao cliente que execute novamente a solicitação. - se receber
RequestCancelled
então normalmente o cliente deverá ter cancelado a solicitação e o código retornará o valor padrão (de acordo com a melhor interpretação da especificação 3.16). Se o cliente não cancelou, interprete RequestCancelled
como ServerCancelled
.
- o próximo manipulador de um middleware de cliente agora descarta os resultados do servidor se a solicitação já tiver sido cancelada no lado do cliente, retornando o valor padrão do VS Code para o provedor correspondente (principalmente
null
). Esta é uma mudança significativa, pois nas versões anteriores da biblioteca o middleware veria o resultado também não usado pelo VS Code. A alteração foi feita para economizar CPU e memória, não convertendo resultados de respostas não utilizados. - todas as funções do conversor que utilizam um array agora são assíncronas, rendem e recebem um token de cancelamento. Esta é uma alteração significativa e foi introduzida para evitar monopolizar o host de extensão durante as conversões de tipo.
- o tipo de retorno de ErrorHandler#error e ErrorHandler#closed mudou de maneira significativa. Agora suporta retornar uma mensagem opcional que será exibida ao usuário.
- Adicionado suporte para valores embutidos.
- Adicionado suporte para dicas embutidas.
- Adicionado suporte para hierarquias de tipo.
- Adicionado suporte para documentos de notebook.
Protocolo 3.16.0, 6.0.0 JSON-RPC, 7.0.0 Cliente e 7.0.0 Servidor.
Para obter uma lista detalhada das alterações feitas na versão 3.16.0 do protocolo, consulte o log de alterações da especificação 3.16.
As alterações específicas da biblioteca são:
- limpeza dos tipos de solicitação e notificação. Removido o parâmetro genérico desnecessário RO. Esta é uma mudança radical. Para adaptar basta remover o argumento de tipo.
- adicionou o novo conceito de RegistrationType que dissocia o método de registro da solicitação real ou método de notificação. Esta é uma mudança significativa para implementadores de recursos personalizados. Para adaptar, renomeie a propriedade
messages
para registrationType
e retorne um RegistrationType
correspondente. Adicional, remova o primeiro parâmetro do método register
. - limpeza de
ErrorCodes
. Os códigos de erro específicos do LSP foram movidos para um novo namespace LSPErrorCodes
. O namespace ErrorCodes
em jsonrpc
não está reservado corretamente para códigos de erro específicos do JSON RPC. Esta é uma mudança radical. Para resolver isso, use LSPErrorCodes
. - divida o código em comum, nó e navegador para permitir o uso dos módulos NPM do cliente e servidor LSP em um navegador da Web via webpack. Esta é uma alteração significativa e pode levar a erros de compilação/tempo de execução se não for adotada. Cada módulo tem agora três exportações diferentes que representam a divisão em comum, nó e navegador. Vejamos um exemplo de
vscode-jsonrpc
: (a) o import vscode-jsonrpc
importará apenas o código comum, (b) o import vscode-jsonrpcnode
importará o código comum e do nó e (c) o import vscode-jsonrpcbrowser
importará o código comum e do navegador. - adicionado suporte para controlar a estrutura de parâmetros ao enviar solicitações e notificações em
vscode-jsonrpc
. A estrutura de parâmetros pode ser controlada usando o argumento parameterStructures
adicional ao criar uma solicitação ou tipo de notificação ou ao enviar uma solicitação ou notificação não digitada usando a função sendRequest
ou sendNotification
. O padrão é ParameterStructures.auto
que faz o seguinte:- use
byPosition
para mensagens com zero ou maior que um parâmetro - para um parâmetro, foi usado
byName
para parâmetros que são literais de objeto. Usa byPosition
para todos os outros parâmetros.
3.15.3 Protocolo, cliente 6.1.x e servidor 6.1.x
- Pequenas alterações no suporte proposto para tokens semânticos.
3.15.2 Protocolo, cliente 6.1.x e servidor 6.1.x
- Suporte proposto para tokens semânticos.
Protocolo 3.15.0, Cliente 6.0.0 e Servidor 6.0.0
- Apoio ao progresso do trabalho realizado e progresso parcial dos resultados.
- Implementação proposta para hierarquias de chamadas.
- Protocolo
SelectionRangeRequest
adicionado:- Novas APIs em tipos:
SelectionRange
- Novas APIs no protocolo:
SelectionRangeRequest
, SelectionRangeParams
, SelectionRangeClientCapabilities
, SelectionRangeServerCapabilities
, SelectionRangeProviderOptions
,
- Suporte para implementações de documentos de texto personalizados:
- novo pacote npm
vscode-languageserver-textdocument
que fornece uma implementação de documento de texto padrão com atualização incremental básica. O servidor agora precisa pré-requisito deste pacote npm. - implementação obsoleta de documentos de texto em tipos.
- isso resultou em uma pequena falha no lado do servidor. Em vez de criar
new TextDocuments
, agora você precisa passar uma configuração de documento de texto para fornecer retornos de chamada para criar e atualizar um documento de texto. Aqui estão exemplos em TypeScript e 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 Cliente
- Corrige que o cliente [textDocument/rename] não obedece
RenameOptions
ao registrar o provedor
5.1.0 Cliente e 5.1.0 Servidor
- Adote o protocolo versão 3.13.0
3.13.0 Protocolo
-
FoldingRangeRequestParam
renomeado para 'FoldingRangeParams' ( FoldingRangeRequestParam
ainda fornecido para compatibilidade com versões anteriores) - Adicionado suporte para operações de criação, renomeação e exclusão de arquivos em edições de espaço de trabalho.
Cliente 5.0.0 e Servidor 5.0.0
- Faça o cliente funcionar com Electron 2.x. que é usado desde o VS Code 1.26.x
- Verifique se a versão esperada do cliente especificada em
engines.vscode
no arquivo package.json
corresponde à versão do VS Code em que o cliente está sendo executado.
4.4.0 Cliente e 4.4.0 Servidor e Protocolo 3.10.0
- Implementar esboço hierárquico de documentos
-
Color
, ColorInformation
, ColorPresentation
movidos para Types - Protocolo
FoldingRangeRequest
adicionado:- Novas APIs em tipos:
FoldingRange
, FoldingRangeKind
- Novas APIs no protocolo:
FoldingRangeRequest
, FoldingRangeRequestParam
, FoldingRangeClientCapabilities
, FoldingRangeServerCapabilities
, FoldingRangeProviderOptions
,
4.3.0 Cliente e 4.3.0 Servidor e 3.9.0 Protocolo
- Adicionar suporte para propriedade
preselect
em CompletionItem
4.2.0 Cliente e 4.2.0 Servidor e 3.8.0 Protocolo
- Adicionar classe CodeAction
- Adicionar suporte para literal de ação de código como um valor de retorno da solicitação textDocument/codeAction
4.1.4 Cliente e 4.1.3 Servidor
- Cliente: mensagens duplicadas enviadas após reinicialização do servidor
4.1.1 Cliente
- Informações sobre falha do servidor perdidas quando o canal de saída é fechado
4.1.0 Cliente e Servidor
Adicione suporte para informações relacionadas em diagnósticos.
Exceções de inicialização engolidas
Erros de renomeação ainda não mostrados no VSCode
terminaProcess.sh não é enviado no pacote dist
Adicionar middleware para interceptar textDocument/publishDiagnostics
4.0.1 Cliente
- removeu instrução de log do console desnecessária.
4.0.0 Servidor e Cliente
- implementou as últimas adições de protocolo. Dignos de nota são o contexto de conclusão, item de conclusão extensível e tipo de símbolo, bem como suporte de remarcação para item de conclusão e ajuda de assinatura. Mudou para a versão 4.0.0 porque a introdução do contexto de conclusão exigiu uma alteração significativa no middleware do cliente. A antiga assinatura:
provideCompletionItem?: ( this : void , document : TextDocument , position : VPosition , token : CancellationToken , next : ProvideCompletionItemsSignature ) => ProviderResult < VCompletionItem [ ] | VCompletionList > ;
contém agora um context
de argumento adicional:
provideCompletionItem?: ( this : void , document : TextDocument , position : VPosition , context : VCompletionContext , token : CancellationToken , next : ProvideCompletionItemsSignature ) => ProviderResult < VCompletionItem [ ] | VCompletionList > ;
- Correções dignas de nota:
- Obtendo valor após executar o comando programaticamente
- Experimentando recursão infinita neste código no VSCode 1.18.1
- LanguageClient#handleConnectionClosed falha ao reiniciar se this._resolvedConnection.dispose() for lançado
6.0.0 Servidor e Cliente
- Mover para o Protocolo 3.15.0
- mover o alvo JS para ES2017
3.15.0 Tipos e Protocolo
3.6.1 Tipos
- ESM adicionado como formato de saída (para Webpack e outros consumidores ESM)
3.5.0 Servidor e Cliente
- permitir que o cliente inicie o servidor no modo desanexado. Se o servidor estiver sendo executado de forma desconectada, o cliente não monitorará o processo do servidor e o encerrará no desligamento.
- correção de bugs.
3.4.0 Servidor e Cliente
- foi adicionado um novo módulo npm
vscode-languageserver-protocol
que contém as definições de protocolo em TypeScript. Este módulo agora é compartilhado entre o cliente e o servidor. - o suporte para o protocolo proposto foi adicionado aos módulos
protocol
, client
e server
npm. O protocolo proposto está sujeito a alterações, mesmo que seja fornecido em uma versão estável dos módulos npm. - protocolo proposto foi adicionado para os seguintes recursos:
- configuração : suporte para buscar definições de configuração enviando uma solicitação do servidor para o cliente
- workspaceFolders : suporte para lidar com mais de uma pasta raiz por espaço de trabalho
- colorProvider : suporte para calcular intervalos de cores para um documento
3.3.0 Servidor e Cliente
- dividiu o cliente em um cliente base e um cliente principal para suportar a reutilização da implementação do cliente em outros ambientes.
- tornou o processamento da solicitação mais assíncrono. Portanto, em vez de processar uma solicitação imediatamente quando o código é notificado por um retorno de chamada do Node.js, a solicitação agora é colocada em uma fila e processada a partir da fila. Isso permite descartar ou dobrar melhor os eventos, se necessário.
- correções de bugs veja abril e maio
3.2.1 Servidor e Cliente
- Corrigido o uso de nome errado para o método
client/registerFeature
: deveria ser client/registerCapability
3.2.0 Servidor e Cliente
- tornou
WorkspaceEdit
em conformidade com a versão 3.x da especificação e compatível com versões anteriores da versão 2.x da biblioteca. - adicionado código de erro
RequestCancelled
. - Corrigido nodePath que não funcionava (vscode-tslint)
- Atualização corrigida de 3.0.4/3.0.5 para 3.1.0 quebra minha extensão
3.1.0 Servidor e Cliente
- adicionar suporte para pipes nomeados e transporte de arquivos de soquete
- problema de dead lock corrigido com node-ipc.
3.0.5 Servidor e 3.0.4 Cliente
-
Files.uriToFilePath
obsoleto em favor do módulo vscode-uri npm que fornece uma implementação mais completa de URI para VS Code. - tornou
rootPath
opcional, pois está obsoleto em 3.x.
3.0.3: Cliente, Servidor e JSON-RPC
Novos recursos
- Todas as bibliotecas foram movidas para TypeScript 2.xx
- Cliente e Servidor são compilados para ES6. JSON-RPC ainda é compilado para ES5.
- JSON-RPC suporta solicitação de n parâmetros e invocação de notificação.
- Suporte para a versão 3.0 do protocolo Language Server. Alguns destaques são:
- Suporte para sinalizadores de recursos.
- Suporte para registro dinâmico. Na versão 2.x da biblioteca, um servidor anunciou suas capacidades estaticamente. Na versão 3.x, o servidor agora pode registrar e cancelar o registro dinamicamente de manipuladores de recursos usando as novas solicitações
client/registerCapability
e client/unregisterCapability
. - Suporte para delegar a execução de comandos por meio de uma nova solicitação
workspace/executeCommand
ao servidor.
- Suporte para snippets em itens de conclusão:
- Novo tipo
InsertTextFormat
- CompletionItem.insertTextFormat controla se o teste inserido é interpretado como um texto simples ou um snippet.
Mudanças significativas:
- para garantir a entrega ordenada de notificações e solicitações, o cliente de idioma agora lança se sendRequest, onRequest, sendNotification ou onNotification for chamado antes que o cliente esteja pronto. Use a promessa onReady() de esperar até que o cliente esteja pronto.
let client = new LanguageClient ( ... ) ;
client . onReady ( ) . then ( ( ) => {
client . onNotification ( ... ) ;
client . sendRequest ( ... ) ;
) ;
- removeu as funções do módulo obsoleto nos conversores code2Protocol e protocol2Code. Use as propriedades correspondentes na instância LanguageClient para obter acesso aos mesmos conversores usados pelo LanguageClient.
// Old
import { Protocol2Code , ... } from 'vscode-languageclient' ;
Protocol2Code . asTextEdits ( edits ) ;
// New
let client = new LanguageClient ( ... ) ;
client . protocol2CodeConverter . asTextEdits ( edits ) ;
- devido ao uso do TypeScript 2.xx e diferenças na geração d.ts, os usuários da nova versão também precisam migrar para o TypeScript 2.xx. Normalmente, o
LanguageClient
é usado em uma extensão do VS Code. Você pode encontrar etapas detalhadas sobre como atualizar uma extensão do VS Code para TypeScript 2.xx aqui. -
activeSignature
e activeParameter
foram declarados incorretamente como opcionais em SignatureHelp
. Eles agora são obrigatórios. - o arquivo
protocol.ts
usou tipos enum em 2.x. No entanto, o protocolo em si é baseado em números, uma vez que nenhuma suposição pode ser feita sobre a presença de um tipo enum na linguagem de implementação. Para deixar isso mais claro, o enum foi substituído por tipos numéricos com uma definição de tipo ou literal. Isto pode resultar em erros de compilação se um número for atribuído diretamente a um tipo de enum anterior sem uma verificação de intervalo adequada. - Os tipos de solicitação e notificação agora são classes em vez de interfaces. Além disso, agora eles usam um argumento de tipo adicional para digitar as opções de registro para registro dinâmico. Adotar essa mudança é bastante fácil. Basta alterar
RequestType
ou NotificationType
e adicionar void como tipo de opção de registro. Lembre-se de atualizar isso tanto no lado do cliente quanto no lado do servidor:
// 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: Cliente e servidor
- Suporte para provedores de links de documentos
- Suporte para edições de texto e comandos adicionais em itens de conclusão.
2.5.0: Cliente e Servidor
- Melhor tratamento de erros no lado do cliente.
- Eventos para iniciar e parar o servidor.
- As opções de inicialização podem ser fornecidas como uma função.
- Suporte para codificação stdio/stderr.
- Suporte para conversão de URIs entre o cliente e o servidor.
- O log do server connection.console agora aparece no canal de saída correspondente em vez de no console do desenvolvedor.
- Se um canal de comunicação não stdio for usado entre o cliente e o servidor, o stdio do servidor será redirecionado para o canal de saída.
- Um cliente agora pode ter um ID e um nome.
2.4.0 Cliente e Servidor
- Tipos de dados como Range, Position, TextDocument, Hover, CompletionItem... extraídos para o novo módulo de nó vscode-languageserver-types . O novo módulo do nó é compartilhado entre o servidor e o cliente e também pode ser usado por bibliotecas de serviços de linguagem que desejam usar os mesmos tipos de dados.
2.3.0: Somente cliente
- o cliente agora reinicia o servidor se o servidor travar sem uma notificação de saída prévia enviada. A estratégia usada para reiniciar o servidor é conectável (consulte
LanguageClientOptions.errorHandler
). A estratégia padrão é reiniciar o servidor, a menos que ele trave 5 vezes ou mais nos últimos 3 minutos.
2.0: Uma descrição detalhada da versão 2.0 pode ser encontrada aqui. Um resumo das mudanças:
- suporte para cancelamento de solicitação. O cancelamento é automaticamente vinculado aos tokens de cancelamento do VSCode
- notificação de salvamento de documento.
- Documentos de texto sincronizados carregam o número da versão do documento de texto do VSCode
1.1.x: Fornece todos os recursos de serviço de idioma disponíveis no host de extensão por meio do protocolo cliente/servidor de idioma. Recursos adicionados:
- Ações de código: fornecem ações para corrigir problemas de diagnóstico.
- Code Lens: fornece comandos que são mostrados junto com o texto fonte.
- Formatação: documento inteiro, intervalos de documentos e formatação por tipo.
- Refatoração de renomeação: fornece renomeação de símbolos.
1.0.x: Versão que oferece suporte para os seguintes recursos:
- Transportes: stdio e node IPC podem ser usados como transporte.
- Sincronização de documentos: sincronização incremental e de documentos de texto completo.
- Sincronização de configuração: sincronização das definições de configuração com o servidor.
- Eventos de arquivo: sincronização de eventos de arquivo com o servidor.
- Código completo: fornece listas completas de código.
- Destaques do documento: destaca todos os símbolos 'iguais' em um documento de texto.
- Hover: fornece informações de foco para um símbolo selecionado em um documento de texto.
- Ajuda de assinatura: fornece ajuda de assinatura para um símbolo selecionado em um documento de texto.
- Definição Goto: fornece suporte à definição goto para um símbolo selecionado em um documento de texto.
- Encontrar referências: encontra todas as referências de todo o projeto para um símbolo selecionado em um documento de texto.
- Listar símbolos do documento: lista todos os símbolos definidos em um documento de texto.
- Listar símbolos da área de trabalho: lista todos os símbolos de todo o projeto.
0.10.x: Versões iniciais para construir uma boa API para o lado cliente e servidor
Licença
MIT