Skip to content

oxabl: v3.0.0

Choose a tag to compare

@evanbrobertson evanbrobertson released this 16 Oct 12:49
ca5da31

3.0.0 (2026-10-16)

� BREAKING CHANGES

  • analysis: oxabl_lint::RunShared now has a lifetime parameter so it can borrow a callee summary provider. Types that store RunShared must supply that lifetime.
  • parser: StatementKind has new Enable, Disable, Hide and View variants; those statements no longer parse to Skipped.
  • parser: StatementKind has new Form and DefineWidget variants and SymbolKind has a new Widget variant; FORM and static widget definitions no longer parse to Skipped.
  • workspace: SourcesConfig gains the public fields encoding and fallback_encoding, and PipelineConfig gains the public field decoding. Code that builds either with a struct literal must set them.
  • scope: oxabl_semantic::AnalysisContext has a new public field, elided_includes, so a struct literal of it no longer compiles. Build it with AnalysisContext::new and with_elided_includes.
  • pipeline: ConditionalIncludeClosure has a new references field and is now #[non_exhaustive].
  • workspace: SourcesConfig has a new pub field, root_relative_include_paths; PipelineConfig has a new pub field, root_relative_include_paths; IncludeContext has a new pub field, root_relative_paths.
  • parser: StatementKind has a new Put variant; PUT no longer parses to Skipped.
  • pipeline: CollectedDiagnostics has a new public field, include_origin, so code that builds it with a struct expression must set it.
  • workspace: SourcesConfig and PipelineConfig gain a pub root_extensions field.
  • index: index_file takes an IncludeContext instead of a PreprocessorConfig. SharedProducers::build and definitions_in take an IncludeContext instead of a filesystem and a PreprocessorConfig. IndexHandle::set_preprocessor is replaced by set_environment, which takes the PipelineConfig, and IndexEnvironment gains an include_paths field.
  • pipeline: the edge_set_with callback receives a LintResult without lint findings or type-check diagnostics; edge_set runs no lint rules.
  • lint: oxabl_analyze::CollectedDiagnostics has a new public field, include_findings. Code that builds it with a struct literal must set it or use ..Default::default().
  • preprocessor: PreprocessedFile has a new pub field, skipped_includes.
  • semantic: SymbolKind has a new Sequence variant.
  • parser: StatementKind has a new VariableDeclarationList variant, so exhaustive matches on StatementKind must handle it.
  • lint: StatementKind::Procedure gains an is_prototype field.

Features

  • analysis: add callee summaries and database explanations (ac6fd5d)
  • cli: add check --watch (e01b176), closes #144
  • cli: analyse files in parallel with check --jobs (a3a2978)
  • effects: check index choices against COMPILE ... XREF output (ed7321b)
  • effects: measure call-graph coverage, summaries and TX004 over a tree (b3a369c)
  • effects: strict ABL M4: call graph, database effects, callee summaries, DB001 and explain (f68126d)
  • examples: count conditional references, include closures and degraded roots in the edge census (04ef3cd)
  • handles: add oxabl_handles, lifetimes of dynamic objects per unit (005ae67)
  • handles: read compound guards, failed NO-ERROR creates and class widget pools (881727e)
  • index: index classes built from includes through the preprocessor (1d80f13), closes #225
  • lint: add NL001 and NL002 unknown-value warnings (17e0c6c)
  • lint: add NL004 nullable-db-field (0ea9cd2)
  • lint: add the strict.access rule DB001 find-in-loop (df71f57)
  • lint: add the strict.handles rules HD001-HD005 (0dd3530)
  • lint: add the strict.locks rules LK001-LK003 (318f55f)
  • lint: add the strict.transactions rules TX001-TX005 (1253cc8)
  • lint: strict ABL M6 slice 1: CL003 signature-mismatch and CL004 unresolved-call (16f4256)
  • nulls: count NL003 findings per directory over a tree (1254ce4)
  • nulls: NL004 nullable-db-field (7515ae3)
  • nulls: strict ABL M5: oxabl_nulls, NL001, NL002 and NL003 (906d636)
  • nulls: treat database fields the schema starts at ? as sources of unknown values (3b39aba)
  • parser: accept USING-imported keyword class names and OE12 VAR lists (498faa2)
  • parser: head-parse ENABLE, DISABLE, HIDE and VIEW (d983d80), closes #136
  • parser: head-parse FORM and declare static widgets (27d2c24), closes #136
  • parser: head-parse PUT and trim the harvest of OS-* file statements (ba9faee), closes #136
  • pipeline: list the class and program names a conditional include's target writes (81462eb)
  • pipeline: retain include-origin findings with their compilation context (950e08b)
  • preprocessor: carry include references in not-taken &IF branches (b1057ac)
  • scope: add oxabl_scope, the compiler's buffer scopes, transaction blocks and locks per unit (cebe727)
  • scope: check the scope engine against COMPILE ... LISTING output (19f0ae2)
  • scope: strict-analysis M3: oxabl_scope, the LISTING harness, LK001-LK003 and TX001-TX005 (d4779c9)
  • semantic: resolve sequence operands against the loaded schema (95bbbc2), closes #185
  • workspace: make the root extension set configurable (8994bb4), closes #143
  • workspace: read source files in a configured encoding (68164e3)
  • workspace: search each root's own directory first with root_relative_include_paths (1793dc7)

Bug Fixes

  • cli: share callee summaries across check --watch handles (4552d86)
  • handles: model calls, :HANDLE identity, unmapped frees, COPY-LOB, shadowed frees and a work budget (05f23ef)
  • issue sweep 2 (downstream edges, parser members) (430fc3b)
  • lexer: stop printing to stdout on an overflowing number literal (14d970e)
  • lint: leave a recovered parse unjudged by the strict.handles rules (4396af1)
  • lint: report handle findings anchored in an include at the use site (b414a76)
  • lint: update example for is_prototype (601246a)
  • parser: read database-qualified names in record statements (6d8cbf1)
  • scope: let an include that did not arrive between statements hide a write or a release (5afe7fd)
  • scope: pair LISTING blocks by the end of the file path (8965d2d)
  • semantic: an unqualified name under an unread superclass is unknowable (07b4825), closes #178
  • sweep of 25 open parser, semantic, lint and schema issues (f01fcce)
  • UPDATE/SET frame fields, shared summaries in check --watch, rustdoc links (bd0df69)

Performance Improvements

  • check: scan the SHARED producer map on every core (fa951a2)
  • cli: build the watch cycle's reverse graph on the check's jobs (7a20d8e)
  • examples: scan the edge_pass producer map on the run's threads (4a5bde8)
  • nulls: bound the work of the null analyses (edbd5cb)
  • nulls: bound the work of the null analyses and report units that fall back (5cebc88)
  • pipeline: build edge sets without lint rules or type checks (bcf44d3), closes #218

Dependencies

  • The following workspace dependencies were updated
    • dependencies
      • oxabl_parser bumped from 2.0.0 to 3.0.0
      • oxabl_lexer bumped from 1.0.2 to 2.0.0
      • oxabl_common bumped from 1.2.0 to 1.2.1
      • oxabl_ast bumped from 2.0.0 to 3.0.0
      • oxabl_workspace bumped from 2.0.0 to 3.0.0
      • oxabl_preprocessor bumped from 0.6.0 to 0.7.0
      • oxabl_semantic bumped from 2.0.0 to 3.0.0
      • oxabl_schema bumped from 0.3.1 to 0.4.0
      • oxabl_analyze bumped from 2.0.0 to 3.0.0
      • oxabl_pipeline bumped from 2.0.0 to 3.0.0
      • oxabl_lint bumped from 2.0.0 to 3.0.0
      • oxabl_lsp bumped from 2.0.0 to 3.0.0
      • oxabl_daemon bumped from 0.4.0 to 0.5.0
      • oxabl_formatter bumped from 1.0.3 to 2.0.0
    • dev-dependencies
      • oxabl_analyze bumped from 2.0.0 to 3.0.0
      • oxabl_common bumped from 1.2.0 to 1.2.1
      • oxabl_schema bumped from 0.3.1 to 0.4.0
      • oxabl_workspace bumped from 2.0.0 to 3.0.0
      • oxabl_pipeline bumped from 2.0.0 to 3.0.0
      • oxabl_flow bumped from 0.2.0 to 0.3.0
      • oxabl_handles bumped from 0.1.0 to 0.2.0
      • oxabl_scope bumped from 0.1.0 to 0.2.0
      • oxabl_effects bumped from 0.1.0 to 0.2.0
      • oxabl_nulls bumped from 0.1.0 to 0.2.0
      • oxabl_index bumped from 2.0.0 to 3.0.0