Skip to content

Move Bound struct out of SpacetimeDB.Internal to SpacetimeDB and Local out of SpacetiemDB.Runtime#3996

Merged
rekhoff merged 2 commits intomasterfrom
rekhoff/csharp-ambiguous-local-bound-fix
Jan 14, 2026
Merged

Move Bound struct out of SpacetimeDB.Internal to SpacetimeDB and Local out of SpacetiemDB.Runtime#3996
rekhoff merged 2 commits intomasterfrom
rekhoff/csharp-ambiguous-local-bound-fix

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
Copy link
Contributor

@JasonAtClockwork JasonAtClockwork left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM - the extra tests are a solid add.

@rekhoff rekhoff added this pull request to the merge queue Jan 14, 2026
Merged via the queue into master with commit f9ccf4c Jan 14, 2026
30 checks passed
@rekhoff rekhoff deleted the rekhoff/csharp-ambiguous-local-bound-fix branch January 15, 2026 00:21
cloutiertyler pushed a commit that referenced this pull request Jan 16, 2026
…d `Local` out of `SpacetiemDB.Runtime` (#3996)

# 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](#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
- [X] Ran:`dotnet test
crates/bindings-csharp/Codegen.Tests/Codegen.Tests.csproj`
- [X] Ran regression tests locally.
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