Le serveur de langage Ruby LSP, développé par Shopify, offre des fonctionnalités avancées d’édition de code grâce à l’analyse syntaxique via Prism, Rubydex et RBS. Son architecture d’add-ons permet d’étendre ses capacités, notamment pour les projets Rails. Dans un billet technique publié le 26 mai 2026, le développeur Janko Marohnić explique comment il a ajouté une fonctionnalité de navigation vers les fichiers partiels lors des appels render dans les templates de vues.
Mécanismes du LSP Le protocole de langage (LSP) repose sur des messages JSON-RPC entre l’éditeur et le serveur. Lorsqu’un développeur survole un appel render et active « aller à la définition », l’éditeur envoie une requête textDocument/definition. Le serveur répond avec la localisation du fichier cible. Ruby LSP indexe les déclarations de constantes, mais pour les appels render, une extension personnalisée est nécessaire.
Création d’un add-on personnalisé Pour créer un add-on, il suffit de placer un fichier addon.rb dans le dossier ruby_lsp de l’application. Ruby LSP le détecte automatiquement au redémarrage. Marohnić a implémenté une classe Addon qui hérite de RubyLsp::Addon, avec une méthode create_definition_listener renvoyant un objet de définition personnalisé. Celui-ci s’abonne au dispatcher d’AST pour écouter l’entrée dans les nœuds de type chaîne de caractères.
Exploitation de l’AST avec Prism La logique consiste à vérifier que le fichier source est un template HTML+ERB (détecté par l’extension .html.erb ou .html+.erb). Ensuite, le code examine le nœud d’appel parent : il doit s’agir d’un message render sans récepteur explicite (ou self). L’add-on récupère les arguments de l’appel et vérifie si la chaîne survolée correspond au premier argument positionnel (render "partial") ou à l’argument mot-clé partial (render partial: "partial"). Si c’est le cas, l’argument est considéré comme un nom de partiel et l’add-on tente de résoudre le fichier correspondant dans le répertoire des vues.
Limites et perspectives Marohnić note que cette approche fonctionne uniquement avec les templates ERB, car Ruby LSP extrait le code Ruby de ces fichiers. Les moteurs de template comme Slim ou Haml, dont la grammaire est plus complexe, ne sont pas supportés à ce stade. L’extension se concentre sur les appels render dans les vues ; les helpers échappent à la détection faute de contexte.
Conclusion Cette extension démontre la flexibilité de Ruby LSP et de Prism pour personnaliser l’expérience d’édition dans les projets Ruby on Rails. En exploitant l’AST, il devient possible d’offrir des fonctionnalités de navigation précises, jusque-là réservées à des outils comme rails.vim.