# Language parity: Modula-2, Pascal, Oberon (v0.46.0) All three languages ship the same IDE feature set: language server, compiler integration, GDB debugging, workbench polish, and project wizard. Modula-2 is the reference implementation; Pascal and Oberon were brought to parity in v0.46.0. ## Modula-2 (reference) - **Language** (`modula2-language`): Coco/R-validated LSP — completion (`.`-triggered, module exports, record fields, WITH fields), hover, go-to-definition (incl. `.def` cross-file), references, rename, full + range formatting, semantic tokens; client-side header/`END`-name diagnostics, uppercase-while-typing, snippets, `modula2.json` schema, 2 TextMate grammars. - **Compiler** (`modula2-compiler`): GNU `gm2` backend, 6 commands (detect/build/buildFile/clean/rebuild/run), tasks, Problems markers, output channel, build report, editor toolbar, `modula2.dialect`. - **Debug** (`modula2-debug`): GDB/MI adapter, type `modula2`. - **Workbench** (`modula2-workbench`): about/theme commands, menubar menu, semantic colors, UI font preference. - **Project** (`modula2-project`): console/empty/library templates, `modula2.json` validation, Sources/Definitions/Project explorer. ## Pascal - **Language** (`pascal-language`): 8 Coco/R dialect validators (P2, P4, P6, standard, Turbo 3, Free Pascal, Blaise, Pascal-S); same LSP set as Modula-2, with `Unit.Name` cross-unit resolution through `USES` (same-directory `.pas`/`.pp`/`.p`), record fields (named, `Unit.Type`-qualified, inline), enum literals, and case-insensitive matching. Own `format.*`/`uppercaseKeywords` settings, snippets, `pascal.json` schema, TextMate grammar. - **Compiler** (`pascal-compiler`): `fpc` + Blaise backends, `-M` flag, same 6 commands/tasks/markers/dialogs. - **Debug** (`pascal-debug`): GDB/MI adapter, type `pascal`. - **Workbench** (`pascal-workbench`): same commands/menus/theming. - **Project** (`pascal-project`): console/empty/library templates (`PROGRAM`/`UNIT` skeletons, fpc `pascal.json`), validation, Sources/Project explorer, `pascal.newUnit` commands. - Verified: 14 resolver checks, formatter idempotence + token preservation (incl. a Blaise corpus file), no-hang parse sweep over 862 Blaise sources. ## Oberon - **Language** (`oberon-language`): 3 Coco/R dialect validators (Oberon-07, Oberon-2, Ulm); same LSP set, with `M.Name` resolution through alias-aware `IMPORT` (`.Mod`/`.mod`/`.def`/ `.om`/`.od`), record fields, type-bound receiver parameters, `*`/`-` export marks (parsed, resolved, and kept attached by the formatter), and case-sensitive matching. Own settings, snippets, `oberon.json` schema, TextMate grammar. - **Compiler** (`oberon-compiler`): `voc` + `ulmo` backends (frontend diagnostics decide success — ulmo's backend asserts here), same 6 commands/tasks/markers/dialogs. - **Debug** (`oberon-debug`): GDB/MI adapter, type `oberon`. - **Workbench** (`oberon-workbench`): same commands/menus/theming. - **Project** (`oberon-project`): console/empty/library templates (`MODULE` skeletons, voc `oberon.json`), validation, Sources/Definitions/Project explorer, `oberon.newModule` commands. - Verified: 15 resolver checks (incl. aliases, receivers, case-sensitivity negatives), formatter idempotence + preservation (incl. a voc-era source), no-hang sweeps over Oberon-07/2, Ulm, and Coco/R sources. ## Bugs fixed while porting (all three languages benefit) - Parser body-skipper infinite loop on forward-declared routines. - Symbol lexer O(n²) stall on ~800KB sources (now ~25 ms). - Dotted type names (`F.File`) kept intact in hover/completion.