Skip to content

feat(persistence)!: inline vs-solutionpersistence; rename SolutionModel → Solution; namespace cleanup#257

Merged
ChrisonSimtian merged 1 commit into
mainfrom
feat/inline-vs-solutionpersistence
May 28, 2026
Merged

feat(persistence)!: inline vs-solutionpersistence; rename SolutionModel → Solution; namespace cleanup#257
ChrisonSimtian merged 1 commit into
mainfrom
feat/inline-vs-solutionpersistence

Conversation

@ChrisonSimtian

Copy link
Copy Markdown
Collaborator

⚠️ Breaking change — package IDs and namespaces change. Migration paths preserved via the Nuke.Common.ProjectModel.* transition shim.

Closes #248. Codefix follow-up tracked in #253.

This replaces the previous #254 which was auto-closed when its base branch (feat/consumer-compat-tests-on-main) was deleted on the #256 merge. Same commit content, now correctly based on main (which already has #256's consumer sentinels).

Affected surface

Was Now
Fallout.SolutionModel (package, project, assembly) Fallout.Solution at src/Persistence/Fallout.Solution/
Fallout.VisualStudio.SolutionPersistence (package, project, assembly) Fallout.Persistence.Solution at src/Persistence/Fallout.Persistence.Solution/
Fallout.Common.ProjectModel.* namespace Fallout.Solutions.* (plural per BCL convention)
Microsoft.VisualStudio.SolutionPersistence.{Model,Serializer,Utilities,...} namespace Fallout.Persistence.Solution.{Model,Serializer,Utilities,...}
vendor/vs-solutionpersistence/ submodule gone — sources inlined

Breaking-change detection result

The consumer-compat sentinels added in #256 caught this rename exactly:

  • Fallout.Consumer.Local — broke (used Fallout.Common.ProjectModel + referenced src/Fallout.SolutionModel/). Resolved in this PR by updating the csproj path to src/Persistence/Fallout.Solution/ and the using to Fallout.Solutions. That update IS the documented consumer migration recipe.
  • Nuke.Consumer — unaffected. The new Fallout.Solutions.*Nuke.Common.ProjectModel.* shim mapping in ShimMarker.cs transparently covers the rename for NUKE-era consumers.
  • Fallout.Consumer.NuGet — unaffected (pinned to Fallout.* 11.0.8, predates the rename).

So the blast radius is precisely what the shim's contract promised: only consumers using direct local Fallout source (no shim, no published packages) have to touch their code. Shim users and pinned-NuGet users see nothing.

Summary

  • Vendored fork eliminated. The fork-of-fork-of-Microsoft (vendor/ submodule pointing at ChrisonSimtian/vs-solutionpersistence) is gone. 92 source files inlined into a new Fallout.Persistence.Solution project under src/Persistence/, owned outright by Fallout. No more submodule + fork-rebase coordination.
  • Onion layering. src/Persistence/ is now the layered home for persistence-ring code. Future persistence-related projects go here.
  • Facade renamed and rehoused. src/Fallout.SolutionModel/src/Persistence/Fallout.Solution/. The rebrand-era namespace mismatch (Fallout.Common.ProjectModel) is fixed to match the assembly name — Fallout.Solutions (plural to avoid Fallout.Solution.Solution awkwardness).
  • Transition shim preserved. src/Shims/Nuke.Common/ShimMarker.cs now declares two mappings: the existing Fallout.Common.*Nuke.Common.* plus a new Fallout.Solutions.*Nuke.Common.ProjectModel.*. NUKE-era consumer code using using Nuke.Common.ProjectModel; [Solution] readonly Solution Solution; keeps compiling.

What's NOT in this PR

  • Visibility narrowing. Parser types stay public for now. The [InternalsVisibleTo] decorations on Fallout.Persistence.Solution.csproj are future-intent. Per-type narrowing needs cascading CS0050 analysis — separate PR.
  • Codefix update. Fallout.Migrate.Analyzers's NukeFallout rewriter still produces Fallout.Common.ProjectModel.* (which is now a dead namespace). Test expectations temporarily reverted to match today's behavior. Tracked in Update Nuke→Fallout codefix to map Common.ProjectModel → Solutions for v11 #253.
  • Dead-code prune. Inlined the full 92-file surface; auditing which files are actually used by Fallout's call graph is a follow-up.
  • Archiving the old fork repo. Once this merges, ChrisonSimtian/vs-solutionpersistence is unreferenced. Archive (or transfer to Fallout-build once that's live) — tracked in chore(ci): drop Qodana #11.

Test plan

…el → Solution; namespace cleanup

Closes #248. Codefix follow-up tracked in #253.

⚠️ Breaking change

The vendored Microsoft.VisualStudio.SolutionPersistence fork (vendor/
submodule, fork-of-fork-of-Microsoft) is gone. Sources inlined into a
new Fallout.Persistence.Solution project under src/Persistence/, owned
outright by Fallout. The facade was renamed and rehoused alongside it
in src/Persistence/Fallout.Solution/, and the long-standing rebrand-era
namespace mismatch (Fallout.Common.ProjectModel) is fixed to match the
assembly name (Fallout.Solutions, plural per BCL convention to avoid
Fallout.Solution.Solution awkwardness).

Package IDs:
- Fallout.SolutionModel → Fallout.Solution
- Fallout.VisualStudio.SolutionPersistence → Fallout.Persistence.Solution

Namespaces:
- Fallout.Common.ProjectModel → Fallout.Solutions
- Microsoft.VisualStudio.SolutionPersistence.{Model,Serializer,Utilities,...}
  → Fallout.Persistence.Solution.{Model,Serializer,Utilities,...}

Transition shim:
The Nuke.Common shim (src/Shims/Nuke.Common/ShimMarker.cs) now mirrors
BOTH Fallout.Common.* → Nuke.Common.* AND Fallout.Solutions.* →
Nuke.Common.ProjectModel.*, so NUKE-era consumer code using
`using Nuke.Common.ProjectModel; [Solution] readonly Solution Solution;`
keeps compiling.

Onion layering:
This PR establishes src/Persistence/ as the home for persistence-ring
code. Future persistence-related projects go under the same directory.

Visibility narrowing deferred:
Parser types remain public for this PR. The IVT decorations in
Fallout.Persistence.Solution.csproj are future-intent. Per-type
narrowing requires cascading CS0050 analysis — separate PR.

Tests:
- All 12 test assemblies pass (453 passed, 7 skipped, 0 failed).
- StronglyTypedSolutionGenerator verified snapshot regenerated.
- RealWorldSmokeTests expectations temporarily reverted to expect
  Fallout.Common.ProjectModel paths (the namespace migration codefix
  in Fallout.Migrate.Analyzers hasn't been updated for v11 yet — see #253).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@ChrisonSimtian ChrisonSimtian added enhancement New feature or request breaking-change Change is breaking — requires major version bump per CLAUDE.md semver policy. target/v11 labels May 28, 2026
@ChrisonSimtian ChrisonSimtian merged commit 3b6afae into main May 28, 2026
2 checks passed
@ChrisonSimtian ChrisonSimtian deleted the feat/inline-vs-solutionpersistence branch May 28, 2026 06:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking-change Change is breaking — requires major version bump per CLAUDE.md semver policy. enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Eliminate the vendored vs-solutionpersistence fork — upstream nuget or inline within Fallout

1 participant