Skip to content

Commit 19c8c7f

Browse files
Name the release 2.2.0, and say what the pinned AssemblyVersion does not cover (#941)
Version and FileVersion move to 2.2.0; BREAKING-CHANGES.md's "Unreleased" section becomes "2.2.0 -- since 2.1.0". AssemblyVersion stays 2.0.0.0, as it has for the whole of 2.x. The comment on that pin said holding it at 2.0.0.0 "makes every 2.x release a drop-in replacement". That is true of binding and not of compatibility, and this release is where the difference shows: 2.2.0 renames two members that shipped in 2.1.0, so a consumer that swaps the assembly without recompiling still binds and then throws MissingMethodException when the call is reached. The comment now says which of the two it guarantees, and the BREAKING-CHANGES entry says the same thing from the caller's side rather than claiming the rename can only surface as a build error. The number is checked against #746: 2.2.0 advances tier 1 and completes none of it, and the note recording that is on the issue. Measured on this tree: suite 7117 passed / 0 failed. Against a build of the merge commit: casbench 116/119 with 0 wrong, 0 error, 0 timeout; canoncheck idempotence 0/834 and order 0/2738 for the canonical form, matching the committed baseline exactly; rulecheck 30 sets, 1365 applications, 0 that never settle, 0 value changes. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
1 parent 3e3a391 commit 19c8c7f

2 files changed

Lines changed: 19 additions & 8 deletions

File tree

‎BREAKING-CHANGES.md‎

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ read first.
1515

1616
---
1717

18-
## Unreleased — since 2.1.0
18+
## 2.2.0 — since 2.1.0
1919

2020
### At a glance
2121

@@ -326,10 +326,17 @@ one a caller reached for:
326326
| `RewriteRules.RationaliseDenominator` | `RewriteRules.RationalizeDenominator` |
327327
| `Patterns.RationaliseDenominator` (internal) | `Patterns.RationalizeDenominator` |
328328

329-
**This one breaks a build rather than an answer** — the compiler names the missing member, so there
330-
is nothing to discover at runtime. The rule set's `Name` comes from `nameof`, so a caller that
331-
matched on the string `"RationaliseDenominator"` gets `"RationalizeDenominator"` instead; that part
332-
*is* silent, and it is the only part that is.
329+
**If you recompile, this breaks a build rather than an answer** — the compiler names the missing
330+
member. Two ways it can reach you later than that:
331+
332+
- `AssemblyVersion` is pinned at `2.0.0.0` for the whole of 2.x precisely so that a consumer can
333+
drop a new DLL in without a binding redirect. Do that without recompiling, and a call to
334+
`Transformation.Rationalisation` throws `MissingMethodException` when it is *reached*, not when
335+
the assembly loads. That is the one path on which this behaves like a silent change.
336+
- The rule set's `Name` comes from `nameof`, so a caller matching on the string
337+
`"RationaliseDenominator"` now sees `"RationalizeDenominator"` and simply stops matching.
338+
339+
Recompiling against 2.2.0 turns both into compile errors, except the string.
333340

334341
Documentation prose keeps British spelling throughout — `Factorize` has always sat beside the word
335342
"factorisation" and still does. The convention is about identifiers.

‎Sources/Package.Build.props‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,21 @@
1717
release tag, so what ships is named by the tag; this is what a local build and the
1818
assembly metadata carry.
1919
-->
20-
<Version>2.1.0</Version>
20+
<Version>2.2.0</Version>
2121

2222
<!--
2323
Pinned to the major for the whole of 2.x, and deliberately not tracking Version.
2424
The assembly is strong-named (see AngouriMath.csproj), and for a signed assembly
2525
every AssemblyVersion change breaks binding on consumers that do not add a redirect.
26-
Holding it at 2.0.0.0 makes every 2.x release a drop-in replacement. FileVersion
26+
Holding it at 2.0.0.0 lets a 2.x assembly load in place of another without one.
27+
28+
That is binding, not compatibility: a member removed or renamed within 2.x still
29+
throws MissingMethodException when a consumer compiled against the older assembly
30+
reaches it. 2.2.0 renames two, both recorded in BREAKING-CHANGES.md. FileVersion
2731
carries the release for anyone reading the file properties.
2832
-->
2933
<AssemblyVersion>2.0.0.0</AssemblyVersion>
30-
<FileVersion>2.1.0.0</FileVersion>
34+
<FileVersion>2.2.0.0</FileVersion>
3135

3236
<Authors>WhiteBlackGoose and contributors</Authors>
3337
<Company>Angouri</Company>

0 commit comments

Comments
 (0)