diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/Lib.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/Lib.cs index 6407c78de..baeef4879 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/Lib.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/Lib.cs @@ -5,10 +5,7 @@ using SpacetimeDB; public static partial class Module { [SpacetimeDB.Settings] - public const SpacetimeDB.Internal.CaseConversionPolicy CASE_CONVERSION_POLICY = SpacetimeDB - .Internal - .CaseConversionPolicy - .SnakeCase; + public const CaseConversionPolicy CASE_CONVERSION_POLICY = CaseConversionPolicy.SnakeCase; } [SpacetimeDB.Type] diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs index fcded15e6..821276035 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs @@ -523,7 +523,7 @@ static class ModuleRegistration new SpacetimeDB.ProcedureContext(identity, connectionId, random, time) ); SpacetimeDB.Internal.Module.SetCaseConversionPolicy( - SpacetimeDB.Internal.CaseConversionPolicy.SnakeCase + SpacetimeDB.CaseConversionPolicy.SnakeCase ); SpacetimeDB.Internal.Module.RegisterExplicitTableName("DemoTable", "canonical_table"); SpacetimeDB.Internal.Module.RegisterExplicitFunctionName( diff --git a/crates/bindings-csharp/Codegen/Diag.cs b/crates/bindings-csharp/Codegen/Diag.cs index 00041b779..ca5b9dba9 100644 --- a/crates/bindings-csharp/Codegen/Diag.cs +++ b/crates/bindings-csharp/Codegen/Diag.cs @@ -245,7 +245,7 @@ internal static class ErrorDescriptor group, "[SpacetimeDB.Settings] field must be a const CaseConversionPolicy", field => - $"Settings field {field.Name} must be declared as 'public const SpacetimeDB.Internal.CaseConversionPolicy ...'.", + $"Settings field {field.Name} must be declared as 'public const SpacetimeDB.CaseConversionPolicy ...'.", field => field ); diff --git a/crates/bindings-csharp/Codegen/Module.cs b/crates/bindings-csharp/Codegen/Module.cs index ba8d62951..bec0a8b36 100644 --- a/crates/bindings-csharp/Codegen/Module.cs +++ b/crates/bindings-csharp/Codegen/Module.cs @@ -61,7 +61,11 @@ record SettingsDeclaration public readonly string FullName; public readonly string? CaseConversionPolicy; - private const string CaseConversionPolicyTypeName = "SpacetimeDB.Internal.CaseConversionPolicy"; + private static readonly string[] CaseConversionPolicyTypeNames = + [ + "SpacetimeDB.CaseConversionPolicy", + "SpacetimeDB.Internal.CaseConversionPolicy", // backward compat + ]; public SettingsDeclaration(GeneratorAttributeSyntaxContext context, DiagReporter diag) { @@ -73,7 +77,7 @@ record SettingsDeclaration diag.Report(ErrorDescriptor.SettingsMustBeConstCaseConversionPolicy, fieldSymbol); return; } - if (fieldSymbol.Type.ToString() != CaseConversionPolicyTypeName) + if (!CaseConversionPolicyTypeNames.Contains(fieldSymbol.Type.ToString())) { diag.Report(ErrorDescriptor.SettingsMustBeConstCaseConversionPolicy, fieldSymbol); return; @@ -1981,7 +1985,7 @@ public class Module : IIncrementalGenerator var settingsRegistration = settings.Array.Length == 1 && settings.Array[0].CaseConversionPolicy is { } policyName - ? $"SpacetimeDB.Internal.Module.SetCaseConversionPolicy(SpacetimeDB.Internal.CaseConversionPolicy.{policyName});" + ? $"SpacetimeDB.Internal.Module.SetCaseConversionPolicy(SpacetimeDB.CaseConversionPolicy.{policyName});" : string.Empty; var explicitTableRegistrations = string.Join( diff --git a/crates/bindings-csharp/Runtime/Internal/Autogen/CaseConversionPolicy.g.cs b/crates/bindings-csharp/Runtime/Internal/Autogen/CaseConversionPolicy.g.cs index 0ab492e83..2500e5278 100644 --- a/crates/bindings-csharp/Runtime/Internal/Autogen/CaseConversionPolicy.g.cs +++ b/crates/bindings-csharp/Runtime/Internal/Autogen/CaseConversionPolicy.g.cs @@ -5,7 +5,7 @@ using System; -namespace SpacetimeDB.Internal +namespace SpacetimeDB { [SpacetimeDB.Type] public enum CaseConversionPolicy diff --git a/crates/bindings-csharp/Runtime/Internal/Autogen/RawModuleDefV10Section.g.cs b/crates/bindings-csharp/Runtime/Internal/Autogen/RawModuleDefV10Section.g.cs index 8f11f93b3..1a299f93c 100644 --- a/crates/bindings-csharp/Runtime/Internal/Autogen/RawModuleDefV10Section.g.cs +++ b/crates/bindings-csharp/Runtime/Internal/Autogen/RawModuleDefV10Section.g.cs @@ -18,7 +18,7 @@ namespace SpacetimeDB.Internal System.Collections.Generic.List Schedules, System.Collections.Generic.List LifeCycleReducers, System.Collections.Generic.List RowLevelSecurity, - CaseConversionPolicy CaseConversionPolicy, + SpacetimeDB.CaseConversionPolicy CaseConversionPolicy, ExplicitNames ExplicitNames )>; } diff --git a/crates/bindings-csharp/Runtime/Internal/Module.cs b/crates/bindings-csharp/Runtime/Internal/Module.cs index 468162dd5..8dcf6cebb 100644 --- a/crates/bindings-csharp/Runtime/Internal/Module.cs +++ b/crates/bindings-csharp/Runtime/Internal/Module.cs @@ -21,7 +21,7 @@ partial class RawModuleDefV10 private readonly Dictionary> defaultValuesByTable = new(StringComparer.Ordinal); - private CaseConversionPolicy? caseConversionPolicy = null; + private SpacetimeDB.CaseConversionPolicy? caseConversionPolicy = null; private readonly List explicitNames = []; // Note: this intends to generate a valid identifier, but it's not guaranteed to be unique as it's not proper mangling. @@ -89,7 +89,7 @@ partial class RawModuleDefV10 defaults.Add(new RawColumnDefaultValueV10(colId, new List(value))); } - internal void SetCaseConversionPolicy(CaseConversionPolicy policy) => + internal void SetCaseConversionPolicy(SpacetimeDB.CaseConversionPolicy policy) => caseConversionPolicy = policy; internal void RegisterExplicitTableName(string sourceName, string canonicalName) => @@ -332,7 +332,7 @@ public static class Module public static void RegisterTableDefaultValue(string table, ushort colId, byte[] value) => moduleDef.RegisterTableDefaultValue(table, colId, value); - public static void SetCaseConversionPolicy(CaseConversionPolicy policy) => + public static void SetCaseConversionPolicy(SpacetimeDB.CaseConversionPolicy policy) => moduleDef.SetCaseConversionPolicy(policy); public static void RegisterExplicitTableName(string sourceName, string canonicalName) => diff --git a/crates/codegen/examples/regen-csharp-moduledef.rs b/crates/codegen/examples/regen-csharp-moduledef.rs index 8f2c4003d..8f9450e76 100644 --- a/crates/codegen/examples/regen-csharp-moduledef.rs +++ b/crates/codegen/examples/regen-csharp-moduledef.rs @@ -54,6 +54,23 @@ fn main() -> anyhow::Result<()> { return Ok(()); } + // CaseConversionPolicy is part of the public API — move it to + // the SpacetimeDB namespace so users don't have to write + // SpacetimeDB.Internal.CaseConversionPolicy. + let code = if filename == "CaseConversionPolicy.g.cs" { + regex_replace!(&code, r"namespace SpacetimeDB\.Internal", "namespace SpacetimeDB") + } else { + // In other autogen files, qualify the type name in type position + // (before a space+identifier) so it resolves after the namespace move. + // The pattern "CaseConversionPolicy CaseConversionPolicy" becomes + // "SpacetimeDB.CaseConversionPolicy CaseConversionPolicy". + regex_replace!( + &code, + r"\bCaseConversionPolicy(\s+)CaseConversionPolicy\b", + "SpacetimeDB.CaseConversionPolicy${1}CaseConversionPolicy" + ) + }; + let code = regex_replace!(&code, r"\bAlgebraicType\b", "SpacetimeDB.BSATN.$0"); let code = regex_replace!( &code,