Skip to content

Conversation

@rekhoff
Copy link
Contributor

@rekhoff rekhoff commented Jan 12, 2026

Description of Changes

This PR fixes a C# SDK regression where using Bound in index filters could trigger an ambiguous reference compiler error for Local after upgrading to v1.11.2, as reported in #3995.
It also fixes a related warning-spam regression (CS0436) where user projects could see Local type conflicts between generated module code and the SpacetimeDB.Runtime assembly.

  • Introduced a public SpacetimeDB.Bound type so users no longer need to import SpacetimeDB.Internal to use bounds in index filters.
  • Kept SpacetimeDB.Internal.Bound for compatibility, but added implicit conversions between SpacetimeDB.Internal.Bound and SpacetimeDB.Bound.
  • Updated the C# code generator to emit fully-qualified global::SpacetimeDB.Bound in generated index filter signatures, avoiding SpacetimeDB.Internal in public-facing APIs and preventing name collisions (e.g., Local).
  • Updated internal runtime bounds helpers (BTreeIndexBounds<...>) to explicitly use SpacetimeDB.Bound when constructing range-scan arguments.
  • Updated Codegen snapshot fixtures to match the new generated output (type name + formatting).
  • Fixed codegen output for ITableView static abstract member implementations to generate public static methods (required for the generated code to compile).
    It also fixes a related warning-spam regression (CS0436) where user projects could see Local type conflicts between generated module code and the SpacetimeDB.Runtime assembly.

Additional fix (related to the Local reports):

  • Removed the runtime assembly’s ownership of SpacetimeDB.Local (introduced more recently than the generated module Local) to prevent CS0436 duplicate-type warnings. Basically, the runtime’s concrete Local/ProcedureTxContext helpers were renamed and made internal so the code generator remains the sole owner of module-level SpacetimeDB.Local.

Regression coverage:

  • Added generator regression assertions to ensure generated code does not reference global::SpacetimeDB.Internal.Bound<...> and does reference global::SpacetimeDB.Bound<...>.
  • Added a runtime API regression assertion that SpacetimeDB.Bound exists and is public in the runtime reference.
  • Added a regression assertion that SpacetimeDB.Runtime does not define codegen-owned types (e.g. SpacetimeDB.Local, ProcedureContext, etc.) to prevent future CS0436 conflicts.
  • Added a “simulated downstream user file” compile check ensuring no CS0436 diagnostics occur when user code references SpacetimeDB.Local.

API and ABI breaking changes

None.

  • No schema or wire-format changes.
  • The changes are limited to C# type exposure / naming and codegen output.
  • SpacetimeDB.Internal.Bound remains usable via implicit conversions (backwards compatible for existing code).

Expected complexity level and risk

2 - Low

  • Changes are isolated to C# runtime type exposure, codegen type references, and snapshot updates.
  • No runtime behavior changes to index scan encoding/decoding; only avoids requiring SpacetimeDB.Internal in user code.

Testing

  • Ran:dotnet test crates/bindings-csharp/Codegen.Tests/Codegen.Tests.csproj
  • Ran regression tests locally.

@rekhoff rekhoff self-assigned this Jan 12, 2026
@rekhoff rekhoff changed the title Created Bound struct in a non-Internal SpacetimeDB namespace Move Bound struct out of SpacetimeDB.Internal to SpacetimeDB and Local out of SpacetiemDB.Runtime Jan 12, 2026
@rekhoff rekhoff marked this pull request as ready for review January 13, 2026 01:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants