Miranda Language Server Protocol para VS CodeQué es MirandaMiranda es un lenguaje de programación funcional desarrollado por David Turner en los años 80. Fue uno de los primeros lenguajes funcionales con evaluación lazy e influyó directamente en el diseño de Haskell. Los archivos Miranda usan la extensión Visual Studio Code es un editor de código que, por defecto, no entiende qué es Miranda. No sabe colorear el código, detectar errores ni ofrecer herramientas de navegación. Esta extensión soluciona eso implementando un servidor LSP (Language Server Protocol). El LSP es un protocolo estándar que define cómo se comunican un editor y un servidor que entiende un lenguaje de programación. Gracias a eso, el servidor puede funcionar no solo en VS Code, sino también en cualquier otro editor compatible con LSP. Antes de existir LSP, si querías soporte para un lenguaje en distintos editores, había que implementar toda la lógica por separado para cada uno. Con LSP, el editor y el servidor hablan un "idioma común". El editor se encarga de la interfaz y el servidor se encarga de analizar el código. Cuando se abre un archivo Caso de uso principalEl actor principal es el programador que escribe código Miranda en VS Code. El caso de uso central es que pueda abrir un archivo Antes de esta extensión, VS Code trataba los archivos Miranda como texto plano sin ningún tipo de asistencia. El programador tenía que recordar la sintaxis y los tipos de memoria, navegar el código manualmente y detectar errores solo al correr el intérprete. Esta extensión elimina esa fricción, permitiendo trabajar con Miranda con las mismas herramientas que se tienen para cualquier lenguaje moderno. ArquitecturaLa arquitectura está dividida en dos partes:
Cuando el servidor inicia, declara sus capacidades mediante una función llamada Las librerías utilizadas son Decisiones técnicasPara mantener sincronizado el contenido entre el editor y el servidor, LSP ofrece dos estrategias: Para analizar el código Miranda, el servidor utiliza expresiones regulares en lugar de un parser formal. La solución tradicional sería construir un AST (Abstract Syntax Tree), una representación estructurada del programa en forma de árbol donde cada nodo representa elementos sintácticos del lenguaje, como funciones, expresiones o tipos. A partir de ese árbol, el servidor podría responder preguntas como "¿dónde está definida esta función?".
El problema es que no existe un parser de Miranda para Node.js y desarrollar uno desde cero hubiera implicado un proyecto mucho más grande que el propio servidor LSP. Como alternativa, decidí por trabajar directamente sobre el texto mediante expresiones regulares. Por ejemplo, para detectar definiciones de funciones se busca que la línea comience en la columna 0, empiece con una letra minúscula y contenga un Features implementadas1. Syntax HighlightingVS Code no conoce Miranda, así que el código aparecía todo del mismo color. Se definió una gramática ( 2. HoverCuando se pasa el mouse sobre cualquier keyword o función del prelude, aparece un tooltip con su descripción y type signature. 3. AutocompletadoAl escribir las primeras letras de una función o keyword, aparecen sugerencias. El autocompletado incluye:
4. Signature HelpAl escribir el 5. Detección de erroresEl servidor analiza el código en tiempo real y subraya los errores: 6. Go to DefinitionPosicionando el cursor sobre el nombre de una función el editor salta directo a donde está definida. Funciona tanto para funciones del mismo archivo como para funciones definidas en otros archivos. https://github.com/user-attachments/assets/16a0a92d-0038-4220-84b8-e063b0964913 7. Find All ReferencesHaciendo clic derecho en Find All References sobre cualquier función, se abre un panel con todas las líneas del archivo donde aparece ese nombre. 8. Rename SymbolHaciendo clic derecho en Rename Symbol sobre el nombre de una función, se escribe el nombre nuevo y Enter. El servidor actualiza todas las apariciones a la vez, la definición, la type signature y cada lugar donde se llama. https://github.com/user-attachments/assets/6f4bf590-dd2a-4dd7-9bfb-cc3cc46560a7 9. Code LensEncima de cada función aparece una línea gris con cuántas veces se llama en el archivo. 10. Document SymbolsEl panel Outline del sidebar de VS Code lista todas las funciones definidas en el archivo. Haciendo clic en cualquiera se salta a esa línea. 11. Format DocumentHaciendo clic derecho en Format Document. El servidor limpia el archivo, elimina espacios al final de cada línea y normaliza las líneas en blanco de más. 12. Code ActionsCuando hay un error o warning subrayado, aparece una 💡 al costado. Al hacer clic se despliega un menú con una acción para corregirlo automáticamente. 13. Workspace SymbolsPresionando Cmd+T se abre un buscador de símbolos en todos los archivos del proyecto. Cómo correrlo
Para compilar en modo watch (recompila automáticamente al guardar):
Una vez compilado, hay que abrir el panel Run and Debug y seleccionar Run Miranda Extension y hacer clic en el botón verde de play. Esto abre una nueva ventana de VS Code donde la extensión ya está activa. Hay que abrir cualquier archivo Publicación en el MarketplaceLa extensión está publicada en el Visual Studio Code Marketplace y se puede instalar directamente desde VS Code buscando Miranda LSP. Uso de herramientas de IADurante el desarrollo de este trabajo utilicé Claude Code (claude-sonnet-4-5) como herramienta de apoyo, principalmente para implementar la lógica del servidor LSP. El código generado fue revisado, ajustado y extendido por mí para adaptarlo a las necesidades específicas del lenguaje Miranda. En todos los casos las decisiones, el diseño de la extensión y el contenido final fueron responsabilidad mía. |