## Changelog ### Unreleased - Language: Named arguments and named splats - New call-site syntax for named arguments using colon: `name: value`. - Positional arguments must come before named; positionals after a named argument inside parentheses are rejected. - Trailing-lambda interaction: if the last parameter is already assigned by name (or via a named splat), a trailing `{ ... }` block is illegal. - Named splats: `...` can now expand a Map into named arguments. - Only string keys are allowed; non-string keys raise a clear error. - Duplicate assignment across named args and named splats is an error. - Ellipsis (variadic) parameters remain positional-only and cannot be named. - Rationale: `=` is assignment and an expression in Lyng; `:` at call sites avoids ambiguity. Declarations keep `name: Type`; call-site casts continue to use `as` / `as?`. - Documentation updated: proposals and declaring-arguments sections now cover named args/splats and error cases. - Tests added covering success cases and errors for named args/splats and trailing-lambda interactions. - Tooling: Highlighters and TextMate bundle updated for named args - Website/editor highlighter (lyngweb + site) works with `name: value` and `...Map("k" => v)`; added JS tests covering punctuation/operator spans for `:` and `...`. - TextMate grammar updated to recognize named call arguments: `name: value` after `(` or `,` with `name` highlighted as `variable.parameter.named.lyng` and `:` as punctuation; excludes `::`. - TextMate bundle version bumped to 0.0.3; README updated with details and guidance. - Multiple Inheritance (MI) completed and enabled by default: - Active C3 Method Resolution Order (MRO) for deterministic, monotonic lookup across complex hierarchies and diamonds. - Qualified dispatch: - `this@Type.member(...)` inside class bodies starts lookup at the specified ancestor. - Cast-based disambiguation: `(expr as Type).member(...)`, `(expr as? Type)?.member(...)` (works with existing safe-call `?.`). - Field inheritance (`val`/`var`) under MI: - Instance storage is disambiguated per declaring class; unqualified read/write resolves to the first match in MRO. - Qualified read/write targets the chosen ancestor’s storage. - Constructors and initialization: - Direct bases are initialized left-to-right; each ancestor is initialized at most once (diamond-safe de-duplication). - Header-specified constructor arguments are passed to direct bases. - Visibility enforcement under MI: - `private` visible only inside the declaring class body. - `protected` visible inside the declaring class and any of its transitive subclasses; unrelated contexts cannot access it (qualification/casts do not bypass). - Diagnostics improvements: - Missing member/field messages include receiver class and linearization order; hints for `this@Type` or casts when helpful. - Invalid `this@Type` reports that the qualifier is not an ancestor and shows the receiver lineage. - `as`/`as?` cast errors include actual and target type names. - Documentation updated (docs/OOP.md and tutorial quick-start) to reflect MI with active C3 MRO. Notes: - Existing single-inheritance code continues to work; resolution reduces to the single base. - If code previously relied on non-deterministic parent set iteration, C3 MRO provides a predictable order; disambiguate explicitly if needed using `this@Type`/casts.