Prettier Plugin per ObjectScript
Code formatter opinionated per InterSystems ObjectScript come plugin Prettier 3, basato su parsing AST con Tree-sitter. Progetto open source personale per portare il tooling moderno a un linguaggio di nicchia.
Contesto
ObjectScript è un linguaggio proprietario di InterSystems, usatissimo in ambito sanitario ma quasi senza tooling moderno: niente formatter automatico decente, niente standardizzazione. In Healthy Reply il codice ObjectScript è ovunque, e la qualità e la leggibilità del codice sono un tema quotidiano.
Ho quindi progettato e implementato un code formatter opinionated come plugin per Prettier 3 — il formatter di fatto standard dell’ecosistema JavaScript — estendendolo a un linguaggio completamente diverso.
Cosa fa
- Casing canonico dei comandi e opzionale espansione delle abbreviazioni (
s→Set). - Indentazione intelligente per classi, metodi, blocchi, comandi e letterali JSON.
- Formattazione di espressioni, argomenti, tipi e riferimenti a oggetti ObjectScript.
- Parsing strict opzionale: solleva errori quando Tree-sitter riporta
ERRORo nodi mancanti (ottimo in CI). - Debug selettivo dell’AST su stderr, con filtri per tipi di nodo e range di sorgente — non contamina mai l’output formattato.
- Integrazione VS Code: funziona con l’estensione ufficiale Prettier + l’estensione ObjectScript di InterSystems, con format-on-save.
Architettura
flowchart LR S["Codice sorgente<br/>MyClass.cls"] --> TS["tree-sitter-objectscript<br/>(parsing AST)"] TS --> P["Plugin Prettier<br/>(print AST)"] P --> O["Output formattato"] O --> T1["Test: output atteso"] O --> T2["Test: idempotenza"] O --> T3["Test: nessuna diagnosi<br/>di parsing"]
Dal codice ObjectScript al codice formattato
Il parsing è demandato alla grammatica tree-sitter-objectscript (mantenuta da InterSystems), pinnata a un commit specifico: locale e CI usano lo stesso parser. Il plugin è un normale plugin Prettier 3: opzioni custom (objectScriptCommandCase, objectScriptExpandCommands, objectScriptStrictParsing, …), stampa dell’AST secondo le regole Prettier.
Scelte progettuali
- Pinnare la grammatica:
package-lock.jsonversionato e grammatica pinnata = risultati riproducibili tra locale e CI. Niente sorprese da update upstream. - Strict parsing opt-in: la grammatica upstream può ancora segnalare errori su costrutti legacy validi; per non rompere chi lavora su codice vecchio, lo strict è un flag.
- Debug su stderr con filtri: durante lo sviluppo del formatter serve vedere l’AST; invece di sporcare l’output, tutto va su stderr con opzioni di filtro (
--object-script-debug-nodes, range, max). - Test a quattro livelli per ogni fixture: output atteso rivisto, idempotenza (formattare due volte = nessun cambiamento), validità sintattica dell’output generato, comportamento delle opzioni. Lo script di update rifiuta di scrivere expected file se l’output non è idempotente o introduce diagnosi di parsing.
Risultati
- Plugin pubblicabile su npm (installabile oggi via GitHub:
npm install prettier git+https://github.com/FilippoGalli001/prettier-plugin-objectscript.git). - Integrazione VS Code documentata passo-passo, da usare anche in altri workspace ObjectScript.
- Un tool che a lavoro migliora la vita di chiunque tocchi codice ObjectScript — standardizzazione automatica della sintassi.
Note
Linguaggio di implementazione: JavaScript/TypeScript, Node 18.14+. Progetto MIT, repo pubblico: FilippoGalli001/prettier-plugin-objectscript.