Desafíos arquitectónicos al desarrollar un LSP para Rust

Fuentes: Architectural challenges in building a Rust LSP

Desarrollar un servidor de lenguaje para Rust (LSP) presenta desafíos arquitectónicos complejos que van más allá de la implementación básica del protocolo. El artículo técnico detalla la experiencia de construcción de Rust Glancer, un proyecto experimental, y contrasta su enfoque con el de rust-analyzer. El núcleo del problema radica en la gestión del estado inicial: el servidor debe responder a la solicitud de inicialización del cliente antes de tener acceso a la base de código completa, lo que obliga a realizar un mínimo de trabajo útil para evitar tiempos de espera excesivos. A diferencia de los compiladores, que requieren un estado binario de 'compilado' o 'no compilado', los LSP deben proporcionar resultados parciales y útiles de inmediato.

La complejidad aumenta al manejar la sincronización entre el sistema de archivos y las notificaciones del cliente. Dado que el protocolo LSP no accede directamente al sistema de archivos, el servidor debe mantener un sistema de archivos virtual (VFS) y gestionar estados de fuente (source generations) para evitar condiciones de carrera. Además, la ejecución de consultas debe ser paralela, ya que tareas como la búsqueda de referencias son costosas, mientras que otras como las pistas de hover son ligeras. El sistema debe cancelar automáticamente las consultas en curso cuando el estado del proyecto cambia para evitar respuestas basadas en datos obsoletos. Finalmente, el artículo destaca la necesidad de manejar la asincronía y la serialización de mensajes para evitar errores de orden en la ejecución de eventos como didOpen y didChange, asegurando la coherencia del estado interno.