Skip to content

v1.20.6-alpha -- converter: unit rules, lazy book validation (BDE apply 20+ min -> 26 s), unreachable-member warnings, fast proptree

Choose a tag to compare

@Alexl-git Alexl-git released this 05 Oct 10:54
· 795 commits to main since this release

Converter/editor engine gaps + property-tree redesign. Merge notice for the editor team: docs/NOTICE-2026-10-05-engine-1.20.6-merged.md (local). Battery 630/637 (7 = known environment failures + run-order flakes that pass alone).

MINOR-in-PATCH: the converter engine gains what the rule-book editor asked for. Only
DRAGLINT_VERSION moves; the extractor version is unchanged -- no index needs a re-parse.

Added

  • convert-apply applies unit rules (#unuse, #use, #useswap). info --json advertises
    capabilities.apply_unit_rules; the apply/1 JSON gains component_part, uses[],
    uses_removed and uses_added.
  • #depth N book directive. The default proptree / convert-scaffold depth is now 5
    (previously effectively 3).
  • --rules on proptree / convert-scaffold.
  • --progress-interval S: one JSON progress line on stderr every S seconds; off by default.
  • info --json capabilities book_depth, progress_lines, lazy_validate.
  • apply/1 refused + reason; text mode prints REFUSED: <reason>.
  • apply/1 unreachable[] (and the unreachable-path warning text) and classes_built.
  • R26 refusal: a #unuse / #useswap that would remove the unit declaring the From type of
    an instance left unconverted (skipped, or excluded by --only) refuses the unit:
    <rule> would leave <N> unconverted instance(s) of <Type> -- unit not changed.

Changed

  • convert-validate / convert-apply resolve paths lazily through a per-class member cache, and
    every #convert block is validated; proptree expands through the same cache.
  • Private members are never shown or resolved.
  • A rule through an inaccessible member is a warning and is skipped (owner ruling 2026-09-30).
  • JSON/text output is written in one buffered write, and stderr is flushed first, so a merged
    stdout/stderr stream still parses.
  • REFUSED: <reason> replaces ERROR: for refusals.
  • --only still filters instances only, never unit rules; a removal it would make unsafe is now
    refused (R26) instead of breaking the compile.
  • A .dfm cut short after indexing (an object's span runs past the end of the file) refuses the
    unit as stale (<Name>: index is stale for this .dfm -- reindex) instead of skipping that one
    instance and converting the rest.

Removed

  • --validate-all-blocks, blocks_not_validated, trees_built (replaced by classes_built).

Fixed

  • Per-file lint of a .dpr runs the AST checks.
  • try-except-swallowed accepts a captured exception in the routine's own local that is
    checked after the try.
  • An indented doc block directly on its declaration keeps its indent.
  • convert-apply refuses to splice a stale .dfm span, including a block that lost lines so its
    recorded end line now holds a later sibling's end (the splice used to delete the sibling).
  • A From-only header (#convert TFoo -> with its trailing space, or #convert TFoo) no longer reads
    as a From type TFoo ->: it is a line N: error #convert TFoo has no To type (R27); likewise
    #useswap X -> is #useswap X has no replacement unit.

Performance

  • BDE book convert-apply dry run: more than 20 min (cap hit) -> 26.5 s.
  • convert-validate BDE (TQuery -> TFDQuery): 408.6 s -> 17.9 s.
  • TabcToggleBtn book convert-apply: 129.8 s -> 16.7 s.
  • TFDQuery proptree depth-5 JSON: 80 s -> 14 s (byte-identical output).

Known

  • The unused-unit-in-uses parser false positive ships in 1.21.0 with a re-parse.