PARITY.md 3.6 KB

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<dialect> 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.