Skip to content

feat!: generate typed keys for every neutral resx, with or without a designer - #43

Merged
rent-a-developer merged 2 commits into
release/issue-29-v2.0.0from
feature/issue-34-designerless-keys
Oct 16, 2026
Merged

rent-a-developer merged 2 commits into
release/issue-29-v2.0.0from
feature/issue-34-designerless-keys

Conversation

@rent-a-developer

@rent-a-developer rent-a-developer commented Oct 16, 2026 •

Copy link
Copy Markdown
Owner

Refs #34
Part of #29

The build wiring passes MSBuild's resource name (ManifestResourceName, LogicalName, WithCulture) to the generator through the analyzer config file, and each generated Keys class creates its own ResourceManager from it. Also: the pre-release gate removes cached ResXLocalization packages before the package consumers run, and the generator project no longer lists AnalyzerReleases.*.md twice.

BREAKING CHANGE: generated Keys classes carry their own ResourceManager, created from the resource name MSBuild computes, and their keys no longer use the designer's ResourceManager. Files without a designer and dotted neutral files now produce keys classes; RXLGEN002 is removed. Two files that produce the same keys class report RXLGEN004 instead of merging. See docs/guides/migration-2.0.md.

Checklist

Everything under Always applies to every pull request. The rest applies only when its trigger does —
tick it, or leave it and say why in the description. A box that does not apply is not a box to tick.

Always

  • pwsh -File scripts/pre-commit-gate.ps1 passes. It runs the public-API reminder, checks line endings,
    style, formatting and member ordering, builds Release and runs the test suites. Use -Fix to have it
    apply the tidying rather than only report it.
  • The Release build produces zero warnings. TreatWarningsAsErrors is on, so this also covers style,
    member ordering, trim and public-API diagnostics.
  • Branch name follows <type>/issue-<number>-<slug>, or <type>/<slug> when there is no issue — see
    CONTRIBUTING.md.

If the change adds behaviour or fixes a bug

  • It is covered by tests.
  • CHANGELOG.md has an entry under ## [Unreleased]. Do not bump a version — the version, the
    release date and the tag are the maintainer's, at release time.

If the change touches one UI package

  • It is mirrored into the other, or it genuinely does not apply there — see
    CONTRIBUTING.md. The Avalonia and WPF markup
    extensions and converters are deliberate mirrors of each other.

If the change touches resource lookup, the generated keys, or the packaging that carries them

Culture fallback, satellite discovery, the source generator's output, the buildTransitive wiring, or a
dependency version. Nothing is trimmed on the just-in-time compiler, so no other check in this repository
can see the damage a mistake here does to a trimmed application.

  • pwsh -File scripts/verify-package-aot.ps1 -Pack passes for both frameworks
    (-Framework net8.0 and the net10.0 default).
  • No new IL2xxx / IL3xxx diagnostics, and none suppressed.

If the change touches the public API

  • The affected PublicAPI.Unshipped.txt is updated with pwsh -File scripts/update-public-api.ps1, and
    the diff was reviewed line by line. A *REMOVED* entry is a breaking change.
  • The XML documentation and the affected pages under docs/ are updated.

…designer

The build wiring passes MSBuild's resource name (ManifestResourceName, LogicalName,
WithCulture) to the generator through the analyzer config file, and each generated
<Name>Keys class creates its own ResourceManager from it. Also: the pre-release gate
removes cached ResXLocalization packages before the package consumers run, and the
generator project no longer lists AnalyzerReleases.*.md twice.

Refs #34

BREAKING CHANGE: generated <Name>Keys classes carry their own ResourceManager, created from the
resource name MSBuild computes, and their keys no longer use the designer's ResourceManager.
Files without a designer and dotted neutral files now produce keys classes; RXLGEN002 is
removed. Two files that produce the same keys class report RXLGEN004 instead of merging. See
docs/guides/migration-2.0.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@rent-a-developer rent-a-developer added this to the v2.0.0 milestone Oct 16, 2026
@rent-a-developer rent-a-developer self-assigned this Oct 16, 2026
@codecov

codecov Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 93.00000% with 7 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...Localization.SourceGenerators/ResxKeysGenerator.cs 93.00% 0 Missing and 7 partials ⚠️

📢 Thoughts on this report? Let us know!

…mporary markup-compile pass

A .resx without a designer takes its keys-class namespace from CustomToolNamespace when it is
set. In WPF's temporary markup-compile pass the "_<random>_wpftmp" suffix is removed from our
own copies of the resource names and of CustomToolNamespace (see
build/ResXLocalization.Resx.targets). The pre-release gate also runs every package consumer on
the .NET 8 SDK, and a new consumer covers a RootNamespace derived from the project name.

Refs #34

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@rent-a-developer
rent-a-developer merged commit b07f13f into release/issue-29-v2.0.0 Oct 16, 2026
17 checks passed
@rent-a-developer
rent-a-developer deleted the feature/issue-34-designerless-keys branch October 16, 2026 08:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking change enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant