Langages
Tout ce que l'IDE sait d'un langage est déclaré au même endroit, dans src/languages/ : un module par langage, réunis dans le registre LANGUAGES. Le reste du code interroge ce registre (languageForFile, runnableLanguageForFile, runnableLanguages) au lieu de tester des extensions de fichiers.
Ce qu'un langage déclare
| Champ | Rôle | Python | SQL | OCaml |
|---|---|---|---|---|
extensions | fichiers du langage | py, pyw | sql | ml, mli |
syntax() | coloration CodeMirror | @codemirror/lang-python | lang-sql (SQLite) | mode hérité mllike |
runtime | exécution par un noyau Basthon | ✓ | ✓ | ✓ (ml seulement) |
lint | analyse à la frappe | Ruff | — | — |
format | formatage du document | Ruff | — | — |
outline | plan (classes, fonctions) | arbre Lezer | — | — |
Chaque fonctionnalité facultative s'active seule quand le langage la fournit : bouton Exécuter et Ctrl+Entrée (runtime), marqueurs et compteur de problèmes (lint), bouton et raccourci de formatage (format), volet Structure (outline).
De plus, ces fonctionnalités sont modulables via le système d'extensions intégrées (src/services/extensions/, src/stores/extensions.ts) :
- L'exécution de SQL et d'OCaml n'est disponible que si l'extension correspondante est activée (ce qui évite de précharger inutilement leurs gros noyaux WASM) ;
- Le linter (Ruff), le formateur de code et le plan (Structure) sont également débrayables via leurs extensions.
runtime décrit ce que le noyau attend :
kernel: le noyau Basthon (python3,sql,ocaml), qui sert aussi d'identifiant au langage ;workspaceFiles: copier les fichiers du workspace dans le noyau (imports locaux, lecture de fichiers) ;scriptPrelude: code évalué avant un script (Python : répertoire,sys.argv,sys.path,__file__) ;showScriptResult,formatResult: afficher la valeur de la dernière instruction d'un script, et sa mise en forme (table SQL) ;extensions: les fichiers exécutables, s'ils ne sont pas tous ceux du langage (une interface OCaml se colore mais ne s'exécute pas).
Ajouter un langage
- Créer
src/languages/<langage>.tsqui exporte unLanguageSupport. - L'ajouter à
LANGUAGES(src/languages/index.ts). - S'il s'exécute, ajouter son noyau à
KERNEL_CLASSES(src/services/kernels.ts) et au plugin Vite (vite-plugin-basthon.ts).
Les icônes de fichiers restent dans src/utils/fileIcons.ts, qui couvre aussi les fichiers qui ne sont d'aucun langage (images, JSON, Markdown…).
Place dans les couches
languages est au-dessus des services (il assemble Ruff, le linter, le plan, les noyaux) et en dessous des stores : un langage ne connaît ni l'état de l'interface ni Vue. Le linter, par exemple, renvoie ses problèmes ; c'est l'éditeur qui les transmet au store diagnostics.