|
| 1 | +# Changelog |
| 2 | + |
| 3 | +All notable changes to this project are documented here. Format |
| 4 | +follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) |
| 5 | +and [Semantic Versioning](https://semver.org/spec/v2.0.0.html). |
| 6 | + |
| 7 | +--- |
| 8 | + |
| 9 | +## [0.10.0] - 2026-05-11 |
| 10 | + |
| 11 | +The "DFM scanner" release: detector count grows from 21 to **41 |
| 12 | +total** (21 Pascal + 20 DFM), plus full IDE-side support for working |
| 13 | +on DFM findings as text in the Code Editor. |
| 14 | + |
| 15 | +### Added |
| 16 | + |
| 17 | +- **DFM scanner with 20 dedicated detectors** across six clusters |
| 18 | + (Dead-Wiring, Data-Access, Security, Master-Detail, UI/UX, |
| 19 | + Localization). Each comes with a before/after fix hint and DUnitX |
| 20 | + tests. See [DETECTORS.md](DETECTORS.md). |
| 21 | +- **DFM parsing infrastructure**: own DFM lexer, DFM parser, and |
| 22 | + component graph (`uDfmLexer`, `uDfmParser`, `uDfmComponentGraph`). |
| 23 | +- **DFM analysis pipeline**: runner, FormBinder (couples Pascal AST |
| 24 | + to DFM graph), repo-wide form index (`TDfmRepoIndex`), and |
| 25 | + DB-field helper for SQL-from-property detection. |
| 26 | +- **Cross-unit form index** so detectors can answer questions like |
| 27 | + "is this published event referenced anywhere in the repo?" and |
| 28 | + "which form owns this datasource?". |
| 29 | +- **`.dfm`-aware VCS diff**: when `.dfm` is touched in the branch, |
| 30 | + the companion `.pas` is queued for analysis automatically (and |
| 31 | + vice versa). |
| 32 | +- **HTML report**: file dropdown groups `.pas` and `.dfm` with the |
| 33 | + same basename under one heading; severity badges filter both |
| 34 | + views consistently. |
| 35 | +- **IDE plugin — DFM finding opens DFM as text** in the Code Editor |
| 36 | + via the Close-and-Reopen pattern (DFMCheck/GExperts-style). When |
| 37 | + the companion `.pas` is modified, falls back to opening the |
| 38 | + `.pas` and showing a status-bar hint that Alt+F12 toggles to the |
| 39 | + DFM source. New return enum `TOpenFileMode` |
| 40 | + (`ofmRegular` / `ofmDfmAsText` / `ofmDfmFallbackPas`) so the |
| 41 | + status bar can describe what happened. |
| 42 | +- **Standalone EXE — modal DFM text viewer** on double-click: opens |
| 43 | + the form file as text with the finding line highlighted and the |
| 44 | + caret pre-positioned (EM_LINEINDEX). |
| 45 | +- **Smarter double-click on DFM findings** in the standalone grid: |
| 46 | + routes `.dfm` to the modal viewer, `.pas` via ShellExecute as |
| 47 | + before. |
| 48 | +- **Stat-tile readability bump**: tile fonts grow +1pt (Icon, Count |
| 49 | + 11→12; Caption 6→7). |
| 50 | +- **Demo resources** for trying the DFM scanner: |
| 51 | + - `uOrderForm.pas` + `.dfm`: `TADOQuery` + `TFields` + `TDBEdit`s |
| 52 | + with intentional smells. |
| 53 | + - `uCustomerForm.pas` + `.dfm`: `TFDQuery` → `TDataSetProvider` |
| 54 | + → `TClientDataSet` → `TDataSource` chain. |
| 55 | + |
| 56 | +### Changed |
| 57 | + |
| 58 | +- `uIDEEditorIntegration.OpenFileAtLine` now returns |
| 59 | + `TOpenFileMode`; callers can describe the result in the status |
| 60 | + bar. Old `Boolean` return is gone — bump the version of any |
| 61 | + third-party caller (unlikely outside this repo). |
| 62 | +- `SafeCloseModule` uses `CloseModule(True)` (save-if-dirty) |
| 63 | + unconditionally — the Modified flag is unreliable in Delphi 12 |
| 64 | + directly after `OpenFile` and blocked the Close-and-Reopen trick. |
| 65 | +- README + README-de tagline rewritten to highlight the **41 |
| 66 | + detectors total** + DFM scanner feature surface; added a |
| 67 | + "Related projects and alternatives" section and a "Keywords" |
| 68 | + block for discoverability. |
| 69 | + |
| 70 | +### Fixed |
| 71 | + |
| 72 | +- `TEditSource Refcount = 2` error during IDE destroy after |
| 73 | + rapid DFM→PAS click sequences. Cause: implicit interface |
| 74 | + references kept the source alive past IDE-internal destroy |
| 75 | + ordering. Fix: explicit `:= nil` on the `IOTAModule` reference |
| 76 | + in `SafeCloseModule`. |
| 77 | +- DFM-finding line off-by-one in the standalone modal viewer. |
| 78 | +- `TDictionary<string, Cardinal>` var-parameter type mismatch in |
| 79 | + `uExportHtml` (inline-var was inferred as `Integer`). |
| 80 | + |
| 81 | +--- |
| 82 | + |
| 83 | +## [0.9.0] - 2026-03-15 |
| 84 | + |
| 85 | +### Added |
| 86 | + |
| 87 | +- **SARIF report** (`--report-sarif`) for GitHub Code Scanning, |
| 88 | + GitLab CI, Azure DevOps, and other SARIF-aware CI/CD systems. |
| 89 | + Findings show up as inline annotations in PR diffs. |
| 90 | +- **Custom-rule engine** with YAML profiles (`analyser-rules.yml`) |
| 91 | + loadable per project. Profiles in `examples/` for common |
| 92 | + starting points. |
| 93 | +- **Rule Catalog** — all detectors expose machine-readable |
| 94 | + metadata (id, severity, category, fix hint). |
| 95 | + |
| 96 | +--- |
| 97 | + |
| 98 | +## [0.8.0] - 2026-02-04 |
| 99 | + |
| 100 | +### Added |
| 101 | + |
| 102 | +- **Headless CLI mode**: `analyser.d12.exe --path X --full|--branch |
| 103 | + --report-sarif Y` runs the same engine as the IDE plugin without |
| 104 | + RAD Studio, for use in CI pipelines and pre-commit hooks. |
| 105 | +- **Exit-code mapping**: 0 clean / 1 hints / 2 warnings / |
| 106 | + 3 errors — drop-in for hook scripts. |
| 107 | + |
| 108 | +--- |
| 109 | + |
| 110 | +## [0.7.1] - 2026-01-20 |
| 111 | + |
| 112 | +### Added |
| 113 | + |
| 114 | +- **IDE hover-hint overlay** on finding lines. |
| 115 | +- **Hover-overlay description** as multiline wrap text. |
| 116 | + |
| 117 | +### Fixed |
| 118 | + |
| 119 | +- IDE plugin: first docking now reliably switches into compact |
| 120 | + layout. |
| 121 | +- Three detectors received false-positive reduction work. |
| 122 | + |
| 123 | +### Changed |
| 124 | + |
| 125 | +- Central three-tier responsive layout for the IDE plugin. |
| 126 | +- FormatMismatch fixes. |
| 127 | + |
| 128 | +--- |
| 129 | + |
| 130 | +## [0.7.0] - 2025-12-XX |
| 131 | + |
| 132 | +### Added |
| 133 | + |
| 134 | +- **Docked-mode UI**: two breakpoints (700/400) with sub-panel |
| 135 | + width shrinking; Hamburger menu absorbs all actions; SearchEdit |
| 136 | + shrinks in docked mode. |
| 137 | +- **DPI scaling** + extracted layout constants. |
| 138 | + |
| 139 | +--- |
| 140 | + |
| 141 | +## [0.6.x and earlier] |
| 142 | + |
| 143 | +Initial release stream — Sonar-style classification, 21 Pascal |
| 144 | +detectors, Git+SVN branch-changes mode, dxgettext localisation, |
| 145 | +HTML/CSV/JSON export, Claude AI prompt copy, theme-aware rendering. |
| 146 | +See `git log` for granular history before the changelog was |
| 147 | +introduced. |
| 148 | + |
| 149 | +--- |
| 150 | + |
| 151 | +## Conventions |
| 152 | + |
| 153 | +- **MAJOR.MINOR.PATCH** follows SemVer for the public API of the |
| 154 | + IDE plugin (BPL exports) and the standalone CLI (flags + exit |
| 155 | + codes). Detector additions are **MINOR** bumps; behaviour or |
| 156 | + signature changes that break either are **MAJOR**. |
| 157 | +- The pre-1.0 line is still allowed to break public surface in |
| 158 | + MINOR bumps when the change is necessary — every such case is |
| 159 | + called out under **Changed** with a migration note. |
| 160 | +- Each entry is grouped under **Added / Changed / Fixed / Removed |
| 161 | + / Deprecated / Security** so a reader can scan one section. |
| 162 | +- Dates are absolute (`YYYY-MM-DD`) so relative phrasing like |
| 163 | + "last week" doesn't drift. |
0 commit comments