From 100d43c2b0f24c229f1ba2d7b0744287b1183a58 Mon Sep 17 00:00:00 2001 From: triton Date: Sun, 26 Oct 2014 02:58:49 +0000 Subject: [PATCH] Fixes classes wrongly being assigned as static classes. Closes #348. --- src/Generator/Passes/CheckStaticClass.cs | 12 ++++++++---- tests/Basic/Basic.Tests.cs | 1 + tests/Basic/Basic.h | 17 +++++++++++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) 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;