diff --git a/src/Generator/Passes/CheckStaticClass.cs b/src/Generator/Passes/CheckStaticClass.cs index ed49f31a..48b1fba7 100644 --- a/src/Generator/Passes/CheckStaticClass.cs +++ b/src/Generator/Passes/CheckStaticClass.cs @@ -45,14 +45,17 @@ namespace CppSharp.Passes { var returnType = function.ReturnType.Type.Desugar(); - TagType tag; - if (!returnType.IsPointerTo(out tag)) + var tag = returnType as TagType; + if (tag == null) + returnType.IsPointerTo(out tag); + + if (tag == null) return false; var @class = (Class) function.Namespace; var decl = tag.Declaration; - if (decl is Class) + if (!(decl is Class)) return false; return @class.QualifiedOriginalName == decl.QualifiedOriginalName; @@ -79,7 +82,8 @@ namespace CppSharp.Passes // If one exists, we assume it's a factory function and the class is // not meant to be static. It's a simple heuristic but it should be // good enough for the time being. - if (@class.Functions.Any(ReturnsClassInstance)) + if (@class.Functions.Any(ReturnsClassInstance) || + @class.Methods.Any(ReturnsClassInstance)) return false; // TODO: We should take C++ friends into account here, they might allow diff --git a/tests/Basic/Basic.Tests.cs b/tests/Basic/Basic.Tests.cs index e39855c7..e5833086 100644 --- a/tests/Basic/Basic.Tests.cs +++ b/tests/Basic/Basic.Tests.cs @@ -284,6 +284,7 @@ public class BasicTests : GeneratorTestFixture Assert.That(TestStaticClass.Add(1, 2), Is.EqualTo(3)); Assert.That(TestStaticClass.OneTwoThree, Is.EqualTo(123)); Assert.That(TestStaticClassDerived.Foo(), Is.EqualTo(0)); + TestNotStaticClass.StaticFunction(); } [Test, Ignore] diff --git a/tests/Basic/Basic.h b/tests/Basic/Basic.h index 63bd1414..dbf453a4 100644 --- a/tests/Basic/Basic.h +++ b/tests/Basic/Basic.h @@ -347,6 +347,23 @@ private: int TestStaticClassDerived::Foo() { return 0; } +class DLL_API TestNotStaticClass +{ +public: + static TestNotStaticClass StaticFunction(); +private: + TestNotStaticClass(); +}; + +TestNotStaticClass::TestNotStaticClass() +{ +} + +TestNotStaticClass TestNotStaticClass::StaticFunction() +{ + return TestNotStaticClass(); +} + class HasIgnoredField { Base fieldOfIgnoredType;