RIDDL 1.23.1 Released
RIDDL 1.23.1 is now available.
release riddl compiler
RIDDL 1.23.1 is now available. This release of the RIDDL compiler and language tooling includes the following changes:
What’s New
What’s New
Improvements
- Path-identifier usages now count as references. Records and types that previously triggered spurious
is unusedwarnings when their only references were as anchors or intermediates in path identifiers (e.g.,set field R.f to "1", ortell event full.OtherEntity.Event to ...) are now correctly recognized as used.ResolutionPassrecords 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.fieldsinsideentity fooBar) is still treated as internal and does not count as external usage. Verified against thereactive-bbqmodel: the previously-flaggedReservationBoardEntry,SalesReportRecord,LaborReportRecord, andInventoryReportRecordno longer surface asis unused.
Features
- New CompletenessWarning: “only referenced in path identifiers”. When a
Typeis 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 existingshowCompletenessWarningsoption.
Bug Fixes
riddlc from <conf> <command>no longer prints every message twice.Commands.runFromConfigwas 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 affectsrepeat, which routes through the same helper. Verified onreactive-bbq: completeness-warning count halved from 48 → 24 with no semantic change.
Internal
- New parallel
usesInPath/usedInPathBymaps onUsageswith public accessorsisUsedInPath(d)andgetPathUsers(d); existinguses/usedBy/getUsers(d)/isUsed(d)semantics are unchanged so downstream consumers ofAnalysisResult.getUsersand similar are unaffected. UsageResolution.checkUnusedskipsis unusedwhen either direct or path usage exists.- Five new test cases in
UsageTestcovering the new behavior (path-only-used record, direct-field-type usage, mixed usage, Type-scope check, and the truly-orphan regression case). everything.checkcorpus updated: the previously-assertedEntity 'SomeOtherThing' is unusedremoved since the entity is genuinely path-referenced from another entity’s handler.
Documentation
CLAUDE.mdandNOTEBOOK.mdrefreshed to reflect current state through 1.23.0 (Scala 3.8.3, sbt-ossuminc 1.4.0, shipped AIHelperPass, GBNF grammar pipeline).NOTEBOOK.mddropped its release-by-release travelogue in favor of a focused design-nuances section.