Skip to content

Release 1.23.1

Choose a tag to compare

@reid-spencer reid-spencer released this 19 May 19:19
· 2 commits to main since this release

What's New

Improvements

  • Path-identifier usages now count as references. Records and types that previously triggered spurious is unused warnings when their only references were as anchors or intermediates in path identifiers (e.g., set field R.f to "1", or tell event full.OtherEntity.Event to ...) are now correctly recognized as used. ResolutionPass records every name in a path — anchor plus any non-terminal components — as a usage of the enclosing definition. Self-qualification through an ancestor name (e.g., state AState of fooBar.fields inside entity fooBar) is still treated as internal and does not count as external usage. Verified against the reactive-bbq model: the previously-flagged ReservationBoardEntry, SalesReportRecord, LaborReportRecord, and InventoryReportRecord no longer surface as is unused.

Features

  • New CompletenessWarning: "only referenced in path identifiers". When a Type is referenced exclusively through path identifiers and is never declared as the type of a field or state, validation now emits a CompletenessWarning guiding the author to either declare the type somewhere as data-carrying (field foo: T, state S of T) or remove the type entirely. Scoped to Types only — entities, functions, and repositories are not subject to this check. Honors the existing showCompletenessWarnings option.

Bug Fixes

  • riddlc from <conf> <command> no longer prints every message twice. Commands.runFromConfig was logging the result internally and also returning it to the outer driver, which then logged it again. The internal log call was removed; the outer driver remains the single source of output. Also affects repeat, which routes through the same helper. Verified on reactive-bbq: completeness-warning count halved from 48 → 24 with no semantic change.

Internal

  • New parallel usesInPath / usedInPathBy maps on Usages with public accessors isUsedInPath(d) and getPathUsers(d); existing uses / usedBy / getUsers(d) / isUsed(d) semantics are unchanged so downstream consumers of AnalysisResult.getUsers and similar are unaffected.
  • UsageResolution.checkUnused skips is unused when either direct or path usage exists.
  • Five new test cases in UsageTest covering the new behavior (path-only-used record, direct-field-type usage, mixed usage, Type-scope check, and the truly-orphan regression case).
  • everything.check corpus updated: the previously-asserted Entity 'SomeOtherThing' is unused removed since the entity is genuinely path-referenced from another entity's handler.

Documentation

  • CLAUDE.md and NOTEBOOK.md refreshed to reflect current state through 1.23.0 (Scala 3.8.3, sbt-ossuminc 1.4.0, shipped AIHelperPass, GBNF grammar pipeline). NOTEBOOK.md dropped its release-by-release travelogue in favor of a focused design-nuances section.