From ed5f461a3388eb256a9bd28a8724045464458f31 Mon Sep 17 00:00:00 2001 From: Ingvar Stepanyan Date: Mon, 6 Jan 2025 18:58:07 +0000 Subject: [PATCH] [release/v1.0.0-rc2-hotfix3]: C#: fix class names for unique column indices (#2088) --- .../ExtraCompilationErrors.verified.txt | 260 +----------------- .../diag/snapshots/Module#FFI.verified.cs | 30 +- .../Codegen.Tests/fixtures/server/Lib.cs | 10 + .../server/snapshots/Module#FFI.verified.cs | 133 ++++++++- ...ltipleUniqueIndexesHadSameName.verified.cs | 92 +++++++ crates/bindings-csharp/Codegen/Module.cs | 6 +- 6 files changed, 253 insertions(+), 278 deletions(-) create mode 100644 crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#RegressionMultipleUniqueIndexesHadSameName.verified.cs diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/ExtraCompilationErrors.verified.txt b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/ExtraCompilationErrors.verified.txt index 254cb11d35a..f397ab03c14 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/ExtraCompilationErrors.verified.txt +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/ExtraCompilationErrors.verified.txt @@ -185,17 +185,17 @@ internal static readonly SpacetimeDB.BSATN.IReadWrite Unsuppor }, {/* - public sealed class TestUniqueNotEquatableUniqueIndex : UniqueIndex> { - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - internal TestUniqueNotEquatableUniqueIndex(TestUniqueNotEquatable handle) : base(handle, "idx_TestUniqueNotEquatable_TestUniqueNotEquatable_UniqueField_unique") {} + public sealed class UniqueFieldUniqueIndex : UniqueIndex> { + ^^^^^^^^^^^^^^^^^^^^^^ + internal UniqueFieldUniqueIndex(TestUniqueNotEquatable handle) : base(handle, "idx_TestUniqueNotEquatable_TestUniqueNotEquatable_UniqueField_unique") {} */ - Message: Partial declarations of 'TestUniqueNotEquatable.TestUniqueNotEquatableUniqueIndex' must not specify different base classes, + Message: The type 'int?' cannot be used as type parameter 'T' in the generic type or method 'UniqueIndex'. The nullable type 'int?' does not satisfy the constraint of 'System.IEquatable'. Nullable types can not satisfy any interface constraints., Severity: Error, Descriptor: { - Id: CS0263, + Id: CS0313, Title: , - HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0263), - MessageFormat: Partial declarations of '{0}' must not specify different base classes, + HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0313), + MessageFormat: The type '{3}' cannot be used as type parameter '{2}' in the generic type or method '{0}'. The nullable type '{3}' does not satisfy the constraint of '{1}'. Nullable types can not satisfy any interface constraints., Category: Compiler, DefaultSeverity: Error, IsEnabledByDefault: true, @@ -207,248 +207,18 @@ internal static readonly SpacetimeDB.BSATN.IReadWrite Unsuppor } }, {/* - public sealed class TestUniqueNotEquatableUniqueIndex : UniqueIndex> { - internal TestUniqueNotEquatableUniqueIndex(TestUniqueNotEquatable handle) : base(handle, "idx_TestUniqueNotEquatable_TestUniqueNotEquatable_UniqueField_unique") {} - ^^^^ - // Important: don't move this to the base class. +public UniqueFieldUniqueIndex UniqueField => new(this); +public sealed class PrimaryKeyFieldUniqueIndex : UniqueIndex> { + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + internal PrimaryKeyFieldUniqueIndex(TestUniqueNotEquatable handle) : base(handle, "idx_TestUniqueNotEquatable_TestUniqueNotEquatable_PrimaryKeyField_unique") {} */ - Message: 'UniqueIndex>.UniqueIndex(TestUniqueNotEquatable, string)' is inaccessible due to its protection level, + Message: The type 'TestEnumWithExplicitValues' cannot be used as type parameter 'T' in the generic type or method 'UniqueIndex'. There is no boxing conversion from 'TestEnumWithExplicitValues' to 'System.IEquatable'., Severity: Error, Descriptor: { - Id: CS0122, + Id: CS0315, Title: , - HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0122), - MessageFormat: '{0}' is inaccessible due to its protection level, - Category: Compiler, - DefaultSeverity: Error, - IsEnabledByDefault: true, - CustomTags: [ - Compiler, - Telemetry, - NotConfigurable - ] - } - }, - {/* - // `globalName` in one generic definition, leading to buggy `Row?` expansion for either one or another. - public global::TestUniqueNotEquatable? Find(int? key) => DoFilter(key).Cast().SingleOrDefault(); - ^^^^^^^^ - public bool Update(global::TestUniqueNotEquatable row) => DoUpdate(row.UniqueField, row); -*/ - Message: The name 'DoFilter' does not exist in the current context, - Severity: Error, - Descriptor: { - Id: CS0103, - Title: , - HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0103), - MessageFormat: The name '{0}' does not exist in the current context, - Category: Compiler, - DefaultSeverity: Error, - IsEnabledByDefault: true, - CustomTags: [ - Compiler, - Telemetry, - NotConfigurable - ] - } - }, - {/* - public global::TestUniqueNotEquatable? Find(int? key) => DoFilter(key).Cast().SingleOrDefault(); - public bool Update(global::TestUniqueNotEquatable row) => DoUpdate(row.UniqueField, row); - ^^^^^^^^ -} -*/ - Message: The name 'DoUpdate' does not exist in the current context, - Severity: Error, - Descriptor: { - Id: CS0103, - Title: , - HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0103), - MessageFormat: The name '{0}' does not exist in the current context, - Category: Compiler, - DefaultSeverity: Error, - IsEnabledByDefault: true, - CustomTags: [ - Compiler, - Telemetry, - NotConfigurable - ] - } - }, - {/* -} -public TestUniqueNotEquatableUniqueIndex UniqueField => new(this); - ^^^^^^^^^ -public sealed class TestUniqueNotEquatableUniqueIndex : UniqueIndex> { -*/ - Message: The call is ambiguous between the following methods or properties: 'TestUniqueNotEquatable.TestUniqueNotEquatableUniqueIndex.TestUniqueNotEquatableUniqueIndex(TestUniqueNotEquatable)' and 'TestUniqueNotEquatable.TestUniqueNotEquatableUniqueIndex.TestUniqueNotEquatableUniqueIndex(TestUniqueNotEquatable)', - Severity: Error, - Descriptor: { - Id: CS0121, - Title: , - HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0121), - MessageFormat: The call is ambiguous between the following methods or properties: '{0}' and '{1}', - Category: Compiler, - DefaultSeverity: Error, - IsEnabledByDefault: true, - CustomTags: [ - Compiler, - Telemetry, - NotConfigurable - ] - } - }, - {/* -public TestUniqueNotEquatableUniqueIndex UniqueField => new(this); -public sealed class TestUniqueNotEquatableUniqueIndex : UniqueIndex> { - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - internal TestUniqueNotEquatableUniqueIndex(TestUniqueNotEquatable handle) : base(handle, "idx_TestUniqueNotEquatable_TestUniqueNotEquatable_PrimaryKeyField_unique") {} -*/ - Message: The type 'TestUniqueNotEquatable' already contains a definition for 'TestUniqueNotEquatableUniqueIndex', - Severity: Error, - Descriptor: { - Id: CS0102, - Title: , - HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0102), - MessageFormat: The type '{0}' already contains a definition for '{1}', - Category: Compiler, - DefaultSeverity: Error, - IsEnabledByDefault: true, - CustomTags: [ - Compiler, - Telemetry, - NotConfigurable - ] - } - }, - {/* -public sealed class TestUniqueNotEquatableUniqueIndex : UniqueIndex> { - internal TestUniqueNotEquatableUniqueIndex(TestUniqueNotEquatable handle) : base(handle, "idx_TestUniqueNotEquatable_TestUniqueNotEquatable_PrimaryKeyField_unique") {} - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - // Important: don't move this to the base class. -*/ - Message: Type 'TestUniqueNotEquatable.TestUniqueNotEquatableUniqueIndex' already defines a member called 'TestUniqueNotEquatableUniqueIndex' with the same parameter types, - Severity: Error, - Descriptor: { - Id: CS0111, - Title: , - HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0111), - MessageFormat: Type '{1}' already defines a member called '{0}' with the same parameter types, - Category: Compiler, - DefaultSeverity: Error, - IsEnabledByDefault: true, - CustomTags: [ - Compiler, - Telemetry, - NotConfigurable - ] - } - }, - {/* -public sealed class TestUniqueNotEquatableUniqueIndex : UniqueIndex> { - internal TestUniqueNotEquatableUniqueIndex(TestUniqueNotEquatable handle) : base(handle, "idx_TestUniqueNotEquatable_TestUniqueNotEquatable_PrimaryKeyField_unique") {} - ^^^^ - // Important: don't move this to the base class. -*/ - Message: 'UniqueIndex>.UniqueIndex(TestUniqueNotEquatable, string)' is inaccessible due to its protection level, - Severity: Error, - Descriptor: { - Id: CS0122, - Title: , - HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0122), - MessageFormat: '{0}' is inaccessible due to its protection level, - Category: Compiler, - DefaultSeverity: Error, - IsEnabledByDefault: true, - CustomTags: [ - Compiler, - Telemetry, - NotConfigurable - ] - } - }, - {/* - // `globalName` in one generic definition, leading to buggy `Row?` expansion for either one or another. - public global::TestUniqueNotEquatable? Find(TestEnumWithExplicitValues key) => DoFilter(key).Cast().SingleOrDefault(); - ^^^^^^^^ - public bool Update(global::TestUniqueNotEquatable row) => DoUpdate(row.PrimaryKeyField, row); -*/ - Message: The name 'DoFilter' does not exist in the current context, - Severity: Error, - Descriptor: { - Id: CS0103, - Title: , - HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0103), - MessageFormat: The name '{0}' does not exist in the current context, - Category: Compiler, - DefaultSeverity: Error, - IsEnabledByDefault: true, - CustomTags: [ - Compiler, - Telemetry, - NotConfigurable - ] - } - }, - {/* - public global::TestUniqueNotEquatable? Find(TestEnumWithExplicitValues key) => DoFilter(key).Cast().SingleOrDefault(); - public bool Update(global::TestUniqueNotEquatable row) => DoUpdate(row.PrimaryKeyField, row); - ^^^^^^ -} -*/ - Message: Type 'TestUniqueNotEquatable.TestUniqueNotEquatableUniqueIndex' already defines a member called 'Update' with the same parameter types, - Severity: Error, - Descriptor: { - Id: CS0111, - Title: , - HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0111), - MessageFormat: Type '{1}' already defines a member called '{0}' with the same parameter types, - Category: Compiler, - DefaultSeverity: Error, - IsEnabledByDefault: true, - CustomTags: [ - Compiler, - Telemetry, - NotConfigurable - ] - } - }, - {/* - public global::TestUniqueNotEquatable? Find(TestEnumWithExplicitValues key) => DoFilter(key).Cast().SingleOrDefault(); - public bool Update(global::TestUniqueNotEquatable row) => DoUpdate(row.PrimaryKeyField, row); - ^^^^^^^^ -} -*/ - Message: The name 'DoUpdate' does not exist in the current context, - Severity: Error, - Descriptor: { - Id: CS0103, - Title: , - HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0103), - MessageFormat: The name '{0}' does not exist in the current context, - Category: Compiler, - DefaultSeverity: Error, - IsEnabledByDefault: true, - CustomTags: [ - Compiler, - Telemetry, - NotConfigurable - ] - } - }, - {/* -} -public TestUniqueNotEquatableUniqueIndex PrimaryKeyField => new(this); - ^^^^^^^^^ -} -*/ - Message: The call is ambiguous between the following methods or properties: 'TestUniqueNotEquatable.TestUniqueNotEquatableUniqueIndex.TestUniqueNotEquatableUniqueIndex(TestUniqueNotEquatable)' and 'TestUniqueNotEquatable.TestUniqueNotEquatableUniqueIndex.TestUniqueNotEquatableUniqueIndex(TestUniqueNotEquatable)', - Severity: Error, - Descriptor: { - Id: CS0121, - Title: , - HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0121), - MessageFormat: The call is ambiguous between the following methods or properties: '{0}' and '{1}', + HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0315), + MessageFormat: The type '{3}' cannot be used as type parameter '{2}' in the generic type or method '{0}'. There is no boxing conversion from '{3}' to '{1}'., Category: Compiler, DefaultSeverity: Error, IsEnabledByDefault: true, diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs index 35e6e65bd0f..ebe5e0e15ac 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs @@ -78,7 +78,7 @@ public bool Delete(global::TestAutoIncNotInteger row) => global::TestAutoIncNotInteger >.DoDelete(row); - public sealed class TestAutoIncNotIntegerUniqueIndex + public sealed class IdentityFieldUniqueIndex : UniqueIndex< TestAutoIncNotInteger, global::TestAutoIncNotInteger, @@ -86,7 +86,7 @@ public sealed class TestAutoIncNotIntegerUniqueIndex SpacetimeDB.BSATN.String > { - internal TestAutoIncNotIntegerUniqueIndex(TestAutoIncNotInteger handle) + internal IdentityFieldUniqueIndex(TestAutoIncNotInteger handle) : base( handle, "idx_TestAutoIncNotInteger_TestAutoIncNotInteger_IdentityField_unique" @@ -102,7 +102,7 @@ public bool Update(global::TestAutoIncNotInteger row) => DoUpdate(row.IdentityField, row); } - public TestAutoIncNotIntegerUniqueIndex IdentityField => new(this); + public IdentityFieldUniqueIndex IdentityField => new(this); } public readonly struct TestDuplicateTableName @@ -188,7 +188,7 @@ public bool Delete(global::TestIncompatibleSchedule row) => global::TestIncompatibleSchedule >.DoDelete(row); - public sealed class TestIncompatibleSchedule1UniqueIndex + public sealed class ScheduledIdUniqueIndex : UniqueIndex< TestIncompatibleSchedule1, global::TestIncompatibleSchedule, @@ -196,7 +196,7 @@ public sealed class TestIncompatibleSchedule1UniqueIndex SpacetimeDB.BSATN.U64 > { - internal TestIncompatibleSchedule1UniqueIndex(TestIncompatibleSchedule1 handle) + internal ScheduledIdUniqueIndex(TestIncompatibleSchedule1 handle) : base( handle, "idx_TestIncompatibleSchedule1_TestIncompatibleSchedule1_ScheduledId_unique" @@ -212,7 +212,7 @@ public bool Update(global::TestIncompatibleSchedule row) => DoUpdate(row.ScheduledId, row); } - public TestIncompatibleSchedule1UniqueIndex ScheduledId => new(this); + public ScheduledIdUniqueIndex ScheduledId => new(this); } public readonly struct TestIncompatibleSchedule2 @@ -259,7 +259,7 @@ public bool Delete(global::TestIncompatibleSchedule row) => global::TestIncompatibleSchedule >.DoDelete(row); - public sealed class TestIncompatibleSchedule2UniqueIndex + public sealed class ScheduledIdUniqueIndex : UniqueIndex< TestIncompatibleSchedule2, global::TestIncompatibleSchedule, @@ -267,7 +267,7 @@ public sealed class TestIncompatibleSchedule2UniqueIndex SpacetimeDB.BSATN.U64 > { - internal TestIncompatibleSchedule2UniqueIndex(TestIncompatibleSchedule2 handle) + internal ScheduledIdUniqueIndex(TestIncompatibleSchedule2 handle) : base( handle, "idx_TestIncompatibleSchedule2_TestIncompatibleSchedule2_ScheduledId_unique" @@ -283,7 +283,7 @@ public bool Update(global::TestIncompatibleSchedule row) => DoUpdate(row.ScheduledId, row); } - public TestIncompatibleSchedule2UniqueIndex ScheduledId => new(this); + public ScheduledIdUniqueIndex ScheduledId => new(this); } public readonly struct TestTableTaggedEnum @@ -360,7 +360,7 @@ public bool Delete(global::TestUniqueNotEquatable row) => global::TestUniqueNotEquatable >.DoDelete(row); - public sealed class TestUniqueNotEquatableUniqueIndex + public sealed class UniqueFieldUniqueIndex : UniqueIndex< TestUniqueNotEquatable, global::TestUniqueNotEquatable, @@ -368,7 +368,7 @@ public sealed class TestUniqueNotEquatableUniqueIndex SpacetimeDB.BSATN.ValueOption > { - internal TestUniqueNotEquatableUniqueIndex(TestUniqueNotEquatable handle) + internal UniqueFieldUniqueIndex(TestUniqueNotEquatable handle) : base( handle, "idx_TestUniqueNotEquatable_TestUniqueNotEquatable_UniqueField_unique" @@ -384,9 +384,9 @@ public bool Update(global::TestUniqueNotEquatable row) => DoUpdate(row.UniqueField, row); } - public TestUniqueNotEquatableUniqueIndex UniqueField => new(this); + public UniqueFieldUniqueIndex UniqueField => new(this); - public sealed class TestUniqueNotEquatableUniqueIndex + public sealed class PrimaryKeyFieldUniqueIndex : UniqueIndex< TestUniqueNotEquatable, global::TestUniqueNotEquatable, @@ -394,7 +394,7 @@ public sealed class TestUniqueNotEquatableUniqueIndex SpacetimeDB.BSATN.Enum > { - internal TestUniqueNotEquatableUniqueIndex(TestUniqueNotEquatable handle) + internal PrimaryKeyFieldUniqueIndex(TestUniqueNotEquatable handle) : base( handle, "idx_TestUniqueNotEquatable_TestUniqueNotEquatable_PrimaryKeyField_unique" @@ -410,7 +410,7 @@ public bool Update(global::TestUniqueNotEquatable row) => DoUpdate(row.PrimaryKeyField, row); } - public TestUniqueNotEquatableUniqueIndex PrimaryKeyField => new(this); + public PrimaryKeyFieldUniqueIndex PrimaryKeyField => new(this); } } diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/Lib.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/Lib.cs index 84b699424a5..be158de68be 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/Lib.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/Lib.cs @@ -188,3 +188,13 @@ partial struct BTreeViews public string Faction; } + +[SpacetimeDB.Table] +partial struct RegressionMultipleUniqueIndexesHadSameName +{ + [SpacetimeDB.Unique] + public uint Unique1; + + [SpacetimeDB.Unique] + public uint Unique2; +} diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs index 8d14a1cd232..293a4a0e140 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs @@ -208,7 +208,7 @@ internal readonly struct BTreeViews public bool Delete(global::BTreeViews row) => SpacetimeDB.Internal.ITableView.DoDelete(row); - internal sealed class BTreeViewsUniqueIndex + internal sealed class IdUniqueIndex : UniqueIndex< BTreeViews, global::BTreeViews, @@ -216,7 +216,7 @@ internal sealed class BTreeViewsUniqueIndex SpacetimeDB.Identity.BSATN > { - internal BTreeViewsUniqueIndex(BTreeViews handle) + internal IdUniqueIndex(BTreeViews handle) : base(handle, "idx_BTreeViews_BTreeViews_Id_unique") { } // Important: don't move this to the base class. @@ -228,7 +228,7 @@ internal BTreeViewsUniqueIndex(BTreeViews handle) public bool Update(global::BTreeViews row) => DoUpdate(row.Id, row); } - internal BTreeViewsUniqueIndex Id => new(this); + internal IdUniqueIndex Id => new(this); internal sealed class LocationIndex() : SpacetimeDB.Internal.IndexBase("bt_BTreeViews_Location") @@ -358,10 +358,10 @@ public readonly struct MultiTable1 public bool Delete(global::MultiTableRow row) => SpacetimeDB.Internal.ITableView.DoDelete(row); - public sealed class MultiTable1UniqueIndex + public sealed class FooUniqueIndex : UniqueIndex { - internal MultiTable1UniqueIndex(MultiTable1 handle) + internal FooUniqueIndex(MultiTable1 handle) : base(handle, "idx_MultiTable1_MultiTable1_Foo_unique") { } // Important: don't move this to the base class. @@ -373,7 +373,7 @@ internal MultiTable1UniqueIndex(MultiTable1 handle) public bool Update(global::MultiTableRow row) => DoUpdate(row.Foo, row); } - public MultiTable1UniqueIndex Foo => new(this); + public FooUniqueIndex Foo => new(this); public sealed class NameIndex() : SpacetimeDB.Internal.IndexBase("bt_MultiTable1_Name") @@ -437,10 +437,10 @@ public readonly struct MultiTable2 public bool Delete(global::MultiTableRow row) => SpacetimeDB.Internal.ITableView.DoDelete(row); - public sealed class MultiTable2UniqueIndex + public sealed class BarUniqueIndex : UniqueIndex { - internal MultiTable2UniqueIndex(MultiTable2 handle) + internal BarUniqueIndex(MultiTable2 handle) : base(handle, "idx_MultiTable2_MultiTable2_Bar_unique") { } // Important: don't move this to the base class. @@ -452,7 +452,7 @@ internal MultiTable2UniqueIndex(MultiTable2 handle) public bool Update(global::MultiTableRow row) => DoUpdate(row.Bar, row); } - public MultiTable2UniqueIndex Bar => new(this); + public BarUniqueIndex Bar => new(this); } public readonly struct PrivateTable @@ -506,10 +506,10 @@ public readonly struct PublicTable public bool Delete(global::PublicTable row) => SpacetimeDB.Internal.ITableView.DoDelete(row); - public sealed class PublicTableUniqueIndex + public sealed class IdUniqueIndex : UniqueIndex { - internal PublicTableUniqueIndex(PublicTable handle) + internal IdUniqueIndex(PublicTable handle) : base(handle, "idx_PublicTable_PublicTable_Id_unique") { } // Important: don't move this to the base class. @@ -521,7 +521,107 @@ internal PublicTableUniqueIndex(PublicTable handle) public bool Update(global::PublicTable row) => DoUpdate(row.Id, row); } - public PublicTableUniqueIndex Id => new(this); + public IdUniqueIndex Id => new(this); + } + + internal readonly struct RegressionMultipleUniqueIndexesHadSameName + : SpacetimeDB.Internal.ITableView< + RegressionMultipleUniqueIndexesHadSameName, + global::RegressionMultipleUniqueIndexesHadSameName + > + { + static global::RegressionMultipleUniqueIndexesHadSameName SpacetimeDB.Internal.ITableView< + RegressionMultipleUniqueIndexesHadSameName, + global::RegressionMultipleUniqueIndexesHadSameName + >.ReadGenFields( + System.IO.BinaryReader reader, + global::RegressionMultipleUniqueIndexesHadSameName row + ) + { + return row; + } + + public ulong Count => + SpacetimeDB.Internal.ITableView< + RegressionMultipleUniqueIndexesHadSameName, + global::RegressionMultipleUniqueIndexesHadSameName + >.DoCount(); + + public IEnumerable Iter() => + SpacetimeDB.Internal.ITableView< + RegressionMultipleUniqueIndexesHadSameName, + global::RegressionMultipleUniqueIndexesHadSameName + >.DoIter(); + + public global::RegressionMultipleUniqueIndexesHadSameName Insert( + global::RegressionMultipleUniqueIndexesHadSameName row + ) => + SpacetimeDB.Internal.ITableView< + RegressionMultipleUniqueIndexesHadSameName, + global::RegressionMultipleUniqueIndexesHadSameName + >.DoInsert(row); + + public bool Delete(global::RegressionMultipleUniqueIndexesHadSameName row) => + SpacetimeDB.Internal.ITableView< + RegressionMultipleUniqueIndexesHadSameName, + global::RegressionMultipleUniqueIndexesHadSameName + >.DoDelete(row); + + internal sealed class Unique1UniqueIndex + : UniqueIndex< + RegressionMultipleUniqueIndexesHadSameName, + global::RegressionMultipleUniqueIndexesHadSameName, + uint, + SpacetimeDB.BSATN.U32 + > + { + internal Unique1UniqueIndex(RegressionMultipleUniqueIndexesHadSameName handle) + : base( + handle, + "idx_RegressionMultipleUniqueIndexesHadSameName_RegressionMultipleUniqueIndexesHadSameName_Unique1_unique" + ) { } + + // Important: don't move this to the base class. + // C# generics don't play well with nullable types and can't accept both struct-type-based and class-type-based + // `globalName` in one generic definition, leading to buggy `Row?` expansion for either one or another. + public global::RegressionMultipleUniqueIndexesHadSameName? Find(uint key) => + DoFilter(key) + .Cast() + .SingleOrDefault(); + + public bool Update(global::RegressionMultipleUniqueIndexesHadSameName row) => + DoUpdate(row.Unique1, row); + } + + internal Unique1UniqueIndex Unique1 => new(this); + + internal sealed class Unique2UniqueIndex + : UniqueIndex< + RegressionMultipleUniqueIndexesHadSameName, + global::RegressionMultipleUniqueIndexesHadSameName, + uint, + SpacetimeDB.BSATN.U32 + > + { + internal Unique2UniqueIndex(RegressionMultipleUniqueIndexesHadSameName handle) + : base( + handle, + "idx_RegressionMultipleUniqueIndexesHadSameName_RegressionMultipleUniqueIndexesHadSameName_Unique2_unique" + ) { } + + // Important: don't move this to the base class. + // C# generics don't play well with nullable types and can't accept both struct-type-based and class-type-based + // `globalName` in one generic definition, leading to buggy `Row?` expansion for either one or another. + public global::RegressionMultipleUniqueIndexesHadSameName? Find(uint key) => + DoFilter(key) + .Cast() + .SingleOrDefault(); + + public bool Update(global::RegressionMultipleUniqueIndexesHadSameName row) => + DoUpdate(row.Unique2, row); + } + + internal Unique2UniqueIndex Unique2 => new(this); } public readonly struct SendMessageTimer @@ -565,7 +665,7 @@ public bool Delete(global::Timers.SendMessageTimer row) => global::Timers.SendMessageTimer >.DoDelete(row); - public sealed class SendMessageTimerUniqueIndex + public sealed class ScheduledIdUniqueIndex : UniqueIndex< SendMessageTimer, global::Timers.SendMessageTimer, @@ -573,7 +673,7 @@ public sealed class SendMessageTimerUniqueIndex SpacetimeDB.BSATN.U64 > { - internal SendMessageTimerUniqueIndex(SendMessageTimer handle) + internal ScheduledIdUniqueIndex(SendMessageTimer handle) : base(handle, "idx_SendMessageTimer_SendMessageTimer_ScheduledId_unique") { } // Important: don't move this to the base class. @@ -586,7 +686,7 @@ public bool Update(global::Timers.SendMessageTimer row) => DoUpdate(row.ScheduledId, row); } - public SendMessageTimerUniqueIndex ScheduledId => new(this); + public ScheduledIdUniqueIndex ScheduledId => new(this); } } @@ -598,6 +698,8 @@ public sealed class Local public Internal.TableHandles.MultiTable2 MultiTable2 => new(); public Internal.TableHandles.PrivateTable PrivateTable => new(); public Internal.TableHandles.PublicTable PublicTable => new(); + internal Internal.TableHandles.RegressionMultipleUniqueIndexesHadSameName RegressionMultipleUniqueIndexesHadSameName => + new(); public Internal.TableHandles.SendMessageTimer SendMessageTimer => new(); } } @@ -718,6 +820,7 @@ public static void Main() SpacetimeDB.Internal.Module.RegisterTable(); SpacetimeDB.Internal.Module.RegisterTable(); SpacetimeDB.Internal.Module.RegisterTable(); + SpacetimeDB.Internal.Module.RegisterTable(); SpacetimeDB.Internal.Module.RegisterTable(); } diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#RegressionMultipleUniqueIndexesHadSameName.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#RegressionMultipleUniqueIndexesHadSameName.verified.cs new file mode 100644 index 00000000000..855a2dfa400 --- /dev/null +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#RegressionMultipleUniqueIndexesHadSameName.verified.cs @@ -0,0 +1,92 @@ +//HintName: RegressionMultipleUniqueIndexesHadSameName.cs +// +#nullable enable + +partial struct RegressionMultipleUniqueIndexesHadSameName + : SpacetimeDB.Internal.ITable +{ + public void ReadFields(System.IO.BinaryReader reader) + { + Unique1 = BSATN.Unique1.Read(reader); + Unique2 = BSATN.Unique2.Read(reader); + } + + public void WriteFields(System.IO.BinaryWriter writer) + { + BSATN.Unique1.Write(writer, Unique1); + BSATN.Unique2.Write(writer, Unique2); + } + + public readonly partial struct BSATN + : SpacetimeDB.BSATN.IReadWrite + { + internal static readonly SpacetimeDB.BSATN.U32 Unique1 = new(); + internal static readonly SpacetimeDB.BSATN.U32 Unique2 = new(); + + public RegressionMultipleUniqueIndexesHadSameName Read(System.IO.BinaryReader reader) => + SpacetimeDB.BSATN.IStructuralReadWrite.Read( + reader + ); + + public void Write( + System.IO.BinaryWriter writer, + RegressionMultipleUniqueIndexesHadSameName value + ) + { + value.WriteFields(writer); + } + + public SpacetimeDB.BSATN.AlgebraicType GetAlgebraicType( + SpacetimeDB.BSATN.ITypeRegistrar registrar + ) => + registrar.RegisterType( + _ => new SpacetimeDB.BSATN.AlgebraicType.Product( + new SpacetimeDB.BSATN.AggregateElement[] + { + new(nameof(Unique1), Unique1.GetAlgebraicType(registrar)), + new(nameof(Unique2), Unique2.GetAlgebraicType(registrar)) + } + ) + ); + } + + static IEnumerable SpacetimeDB.Internal.ITable.MakeTableDesc( + SpacetimeDB.BSATN.ITypeRegistrar registrar + ) => + [ + new( + new( + TableName: nameof(SpacetimeDB.Local.RegressionMultipleUniqueIndexesHadSameName), + Columns: + [ + new(nameof(Unique1), BSATN.Unique1.GetAlgebraicType(registrar)), + new(nameof(Unique2), BSATN.Unique2.GetAlgebraicType(registrar)) + ], + Indexes: [], + Constraints: + [ + new( + "RegressionMultipleUniqueIndexesHadSameName_Unique1", + (byte)SpacetimeDB.Internal.ColumnAttrs.Unique, + [0] + ), + new( + "RegressionMultipleUniqueIndexesHadSameName_Unique2", + (byte)SpacetimeDB.Internal.ColumnAttrs.Unique, + [1] + ) + ], + Sequences: [], + // "system" | "user" + TableType: "user", + // "public" | "private" + TableAccess: "private", + Scheduled: null + ), + (uint) + ( + (SpacetimeDB.BSATN.AlgebraicType.Ref)new BSATN().GetAlgebraicType(registrar) + ).Ref_ + ), + ]; +} // RegressionMultipleUniqueIndexesHadSameName diff --git a/crates/bindings-csharp/Codegen/Module.cs b/crates/bindings-csharp/Codegen/Module.cs index 38bf4723ee9..e420982279c 100644 --- a/crates/bindings-csharp/Codegen/Module.cs +++ b/crates/bindings-csharp/Codegen/Module.cs @@ -289,15 +289,15 @@ var ct in GetConstraints(viewName) { var iUniqueIndex = $""; yield return $$""" - {{vis}} sealed class {{viewName}}UniqueIndex : UniqueIndex<{{viewName}}, {{globalName}}, {{f.Type}}, {{f.TypeInfo}}> { - internal {{viewName}}UniqueIndex({{viewName}} handle) : base(handle, "idx_{{viewName}}_{{viewName}}_{{ct.col.Name}}_unique") {} + {{vis}} sealed class {{f.Name}}UniqueIndex : UniqueIndex<{{viewName}}, {{globalName}}, {{f.Type}}, {{f.TypeInfo}}> { + internal {{f.Name}}UniqueIndex({{viewName}} handle) : base(handle, "idx_{{viewName}}_{{viewName}}_{{ct.col.Name}}_unique") {} // Important: don't move this to the base class. // C# generics don't play well with nullable types and can't accept both struct-type-based and class-type-based // `globalName` in one generic definition, leading to buggy `Row?` expansion for either one or another. public {{globalName}}? Find({{f.Type}} key) => DoFilter(key).Cast<{{globalName}}?>().SingleOrDefault(); public bool Update({{globalName}} row) => DoUpdate(row.{{f.Name}}, row); } - {{vis}} {{viewName}}UniqueIndex {{f.Name}} => new(this); + {{vis}} {{f.Name}}UniqueIndex {{f.Name}} => new(this); """; } }