Move CaseConversionPolicy to public SpacetimeDB namespace (#4382)

Move `CaseConversionPolicy` from `SpacetimeDB.Internal` to the public
`SpacetimeDB` namespace so module authors can write:

```csharp
[SpacetimeDB.Settings]
public const CaseConversionPolicy CASE_CONVERSION_POLICY = CaseConversionPolicy.SnakeCase;
```

instead of the verbose:

```csharp
public const SpacetimeDB.Internal.CaseConversionPolicy CASE_CONVERSION_POLICY = SpacetimeDB.Internal.CaseConversionPolicy.SnakeCase;
```

### Changes
- Move enum definition from `SpacetimeDB.Internal` to `SpacetimeDB`
namespace in autogen
- Fully qualify all `Internal` references to
`SpacetimeDB.CaseConversionPolicy`
- Codegen source generator accepts both
`SpacetimeDB.CaseConversionPolicy` and
`SpacetimeDB.Internal.CaseConversionPolicy` for backward compatibility
- Updated test fixture and verified snapshots
- All 4 codegen tests pass

---------

Co-authored-by: clockwork-labs-bot <clockwork-labs-bot@users.noreply.github.com>
This commit is contained in:
clockwork-labs-bot
2026-02-20 17:21:46 -05:00
committed by GitHub
parent 3c881f3641
commit dd2c95f113
8 changed files with 32 additions and 14 deletions
@@ -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]
@@ -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(
+1 -1
View File
@@ -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
);
+7 -3
View File
@@ -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(
@@ -5,7 +5,7 @@
using System;
namespace SpacetimeDB.Internal
namespace SpacetimeDB
{
[SpacetimeDB.Type]
public enum CaseConversionPolicy
@@ -18,7 +18,7 @@ namespace SpacetimeDB.Internal
System.Collections.Generic.List<RawScheduleDefV10> Schedules,
System.Collections.Generic.List<RawLifeCycleReducerDefV10> LifeCycleReducers,
System.Collections.Generic.List<RawRowLevelSecurityDefV9> RowLevelSecurity,
CaseConversionPolicy CaseConversionPolicy,
SpacetimeDB.CaseConversionPolicy CaseConversionPolicy,
ExplicitNames ExplicitNames
)>;
}
@@ -21,7 +21,7 @@ partial class RawModuleDefV10
private readonly Dictionary<string, List<RawColumnDefaultValueV10>> defaultValuesByTable =
new(StringComparer.Ordinal);
private CaseConversionPolicy? caseConversionPolicy = null;
private SpacetimeDB.CaseConversionPolicy? caseConversionPolicy = null;
private readonly List<ExplicitNameEntry> 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<byte>(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) =>
@@ -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,