diff --git a/src/Generator/Generators/CLI/CLIHeadersTemplate.cs b/src/Generator/Generators/CLI/CLIHeadersTemplate.cs index 4b5b8d44..ec6395a7 100644 --- a/src/Generator/Generators/CLI/CLIHeadersTemplate.cs +++ b/src/Generator/Generators/CLI/CLIHeadersTemplate.cs @@ -563,6 +563,9 @@ namespace CppSharp.Generators.CLI Write("{0}", @class.Name); + if (@class.IsStatic) + Write(" abstract sealed"); + if (@class.IsOpaque) { WriteLine(";"); diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index 6160eaa6..b4e0d928 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -486,8 +486,11 @@ namespace CppSharp.Generators.CSharp functions.Add(method); }; - foreach (var ctor in @class.Constructors) - { + foreach (var ctor in @class.Constructors) + { + if (@class.IsStatic) + continue; + if (ctor.IsMoveConstructor) continue; @@ -497,7 +500,7 @@ namespace CppSharp.Generators.CSharp tryAddOverload(ctor); } - if (@class.HasNonTrivialDestructor) + if (@class.HasNonTrivialDestructor && !@class.IsStatic) foreach (var dtor in @class.Destructors) tryAddOverload(dtor); @@ -698,6 +701,8 @@ namespace CppSharp.Generators.CSharp public static bool ShouldGenerateClassNativeField(Class @class) { + if (@class.IsStatic) + return false; return @class.IsRefType && (!@class.HasBase || !HasRefBase(@class)); } @@ -712,6 +717,10 @@ namespace CppSharp.Generators.CSharp if (Driver.Options.GenerateAbstractImpls && @class.IsAbstract) Write("abstract "); + if (@class.IsStatic) + Write("static "); + + // This token needs to directly precede the "class" token. if (Options.GeneratePartialClasses) Write("partial "); @@ -743,7 +752,7 @@ namespace CppSharp.Generators.CSharp } } - if (bases.Count > 0) + if (bases.Count > 0 && !@class.IsStatic) Write(" : {0}", string.Join(", ", bases)); } @@ -1750,6 +1759,9 @@ namespace CppSharp.Generators.CSharp public void GenerateClassConstructors(Class @class) { + if (@class.IsStatic) + return; + // Output a default constructor that takes the native pointer. GenerateNativeConstructor(@class); diff --git a/tests/Basic/Basic.Tests.cs b/tests/Basic/Basic.Tests.cs index 87dd9f70..de11f9a9 100644 --- a/tests/Basic/Basic.Tests.cs +++ b/tests/Basic/Basic.Tests.cs @@ -204,7 +204,8 @@ public class BasicTests : GeneratorTestFixture [Test] public void TestStaticClasses() { - Assert.That(TestStaticClass.Add(1, 2), Is.EqualTo(3)); + Assert.That(TestStaticClass.Add(1, 2), Is.EqualTo(3)); + Assert.That(TestStaticClassDerived.Foo(), Is.EqualTo(0)); } [Test, Ignore] diff --git a/tests/Basic/Basic.h b/tests/Basic/Basic.h index fe7e7491..7e19d8d8 100644 --- a/tests/Basic/Basic.h +++ b/tests/Basic/Basic.h @@ -291,6 +291,15 @@ private: int TestStaticClass::Add(int a, int b) { return a + b; } +struct DLL_API TestStaticClassDerived : TestStaticClass +{ + static int Foo(); + +private: + TestStaticClassDerived(); +}; + +int TestStaticClassDerived::Foo() { return 0; } class HasIgnoredField {