Protocolo de Servidor de Linguagem (LSP)
Pontos principais
- O LSP é um padrão aberto baseado em JSON-RPC que separa a lógica de inteligência de linguagem do editor de código.
- Foi desenvolvido inicialmente pela Microsoft e padronizado em colaboração com a Red Hat e a Codenvy.
- Permite que um único servidor de linguagem funcione em múltiplos editores e IDEs compatíveis.
- Suporta funcionalidades como autocompletar, refatoração e detecção de erros em tempo real.
O Protocolo de Servidor de Linguagem (do inglês Language Server Protocol, LSP) é um padrão aberto baseado em JSON-RPC utilizado para a comunicação entre editores de código-fonte ou Ambientes de Desenvolvimento Integrado (IDEs) e servidores que fornecem ferramentas de "inteligência de linguagem".
Essas ferramentas abrangem funcionalidades específicas de linguagens de programação, como a conclusão automática de código (code completion), realce de sintaxe, marcação de avisos e erros, além de rotinas de refatoração. O objetivo fundamental do LSP é permitir que o suporte a linguagens de programação seja implementado e distribuído de forma independente de qualquer editor ou IDE específico.
Histórico e Desenvolvimento
O LSP foi originalmente desenvolvido para o Microsoft Visual Studio Code, mas evoluiu para se tornar um padrão aberto. Em 27 de junho de 2016, a Microsoft anunciou uma colaboração com a Red Hat e a Codenvy para padronizar a especificação do protocolo. Atualmente, a especificação é hospedada e desenvolvida de forma colaborativa no GitHub, tornando-se uma norma para provedores de ferramentas de inteligência de linguagem no início da década de 2020.
Contexto e Necessidade Técnica
IDEs modernas oferecem recursos sofisticados que exigem uma compreensão profunda da semântica da linguagem de programação. Por exemplo, ao renomear um método, uma ferramenta simples de "localizar e substituir" poderia introduzir erros ao alterar variáveis com nomes semelhantes em escopos diferentes ou modificar textos dentro de comentários. Para evitar isso, a IDE precisa de uma análise sintática e semântica precisa.
Compiladores e interpretadores convencionais geralmente não são adequados para fornecer esses serviços, pois são projetados para transformar código-fonte em código de objeto ou executá-lo imediatamente. Além disso, os serviços de linguagem devem lidar com código malformado (comum enquanto o programador ainda está digitando) e fornecer feedback instantâneo sobre pequenas alterações semânticas, algo que foge ao propósito original de compiladores tradicionais.
O Problema do Acoplamento
Antes do LSP, a maioria dos serviços de linguagem estava vinculada a uma IDE específica. Para levar o mesmo suporte de linguagem a outro editor, era necessário adaptar o código para a API de extensão daquela ferramenta específica. Isso criava um esforço redundante para desenvolvedores de linguagens e editores.
A Solução do LSP
O LSP desacopla os serviços de linguagem do editor, movendo-os para um servidor de propósito geral. Com isso:
- Editores podem herdar suporte a diversas linguagens apenas implementando o cliente LSP, sem precisar desenvolver a lógica de análise para cada linguagem.
- Desenvolvedores de linguagens podem criar um único servidor que torna a linguagem disponível em qualquer editor compatível com o protocolo.
- Terceiros podem contribuir com servidores de linguagem sem a necessidade de envolvimento direto dos fornecedores do compilador ou do editor.
Embora focado em linguagens de programação, o LSP também pode ser aplicado a qualquer linguagem baseada em texto, como especificações técnicas ou linguagens de domínio específico (DSL).
Funcionamento Técnico
No ecossistema LSP, a ferramenta de edição atua como o cliente e o serviço de inteligência atua como o servidor.
Fluxo de Comunicação
O cliente informa ao servidor as ações do usuário, como a abertura de um arquivo ou a inserção de um caractere em uma posição específica. O cliente também pode solicitar serviços, como a formatação de um intervalo de texto. O servidor, por sua vez, responde com a informação solicitada ou com uma mensagem de erro detalhada.
Especificação de Mensagens
As mensagens trocadas entre cliente e servidor são formatadas em JSON-RPC, precedidas por cabeçalhos semelhantes aos do protocolo HTTP. As mensagens podem ser originadas tanto pelo servidor quanto pelo cliente, garantindo uma comunicação bidirecional.
Perguntas frequentes
O que é o Language Server Protocol (LSP)?
É um protocolo de comunicação que permite que editores de texto e IDEs acessem funcionalidades de inteligência de linguagem (como autocompletar e refatoração) de forma independente da ferramenta de edição utilizada.
Qual a principal vantagem do LSP para os desenvolvedores de IDEs?
Os desenvolvedores de IDEs não precisam criar suporte para cada linguagem de programação individualmente; eles precisam apenas implementar o cliente LSP para ter acesso a todos os servidores de linguagem existentes.
O LSP funciona apenas para linguagens de programação?
Não, o LSP pode ser utilizado para qualquer linguagem baseada em texto, incluindo linguagens de domínio específico (DSL) e arquivos de especificação.
Como o LSP se comunica tecnicamente?
O protocolo utiliza mensagens JSON-RPC com cabeçalhos similares ao HTTP para trocar informações entre o cliente (editor) e o servidor de linguagem.