|
|
@@ -0,0 +1,71 @@
|
|
|
+# 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.
|