Browse Source

Generated methods and variables of base classes of value types.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/273/head
Dimitar Dobrev 11 years ago
parent
commit
f77d394eb1
  1. 4
      src/Generator/Generators/CLI/CLIHeadersTemplate.cs
  2. 31
      src/Generator/Generators/CLI/CLISourcesTemplate.cs
  3. 42
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  4. 10
      tests/Basic/Basic.Tests.cs
  5. 6
      tests/Basic/Basic.h
  6. 3
      tests/Tests.h

4
src/Generator/Generators/CLI/CLIHeadersTemplate.cs

@ -491,6 +491,10 @@ namespace CppSharp.Generators.CLI @@ -491,6 +491,10 @@ namespace CppSharp.Generators.CLI
{
PushIndent();
if (@class.IsValueType)
foreach (var @base in @class.Bases.Where(b => b.IsClass && !b.Class.Ignore))
GenerateClassMethods(@base.Class);
var staticMethods = new List<Method>();
foreach (var method in @class.Methods)
{

31
src/Generator/Generators/CLI/CLISourcesTemplate.cs

@ -138,17 +138,7 @@ namespace CppSharp.Generators.CLI @@ -138,17 +138,7 @@ namespace CppSharp.Generators.CLI
GenerateClassConstructors(@class);
foreach (var method in @class.Methods)
{
if (ASTUtils.CheckIgnoreMethod(method, Options))
continue;
// C++/CLI does not allow special member funtions for value types.
if (@class.IsValueType && method.IsCopyConstructor)
continue;
GenerateMethod(method, @class);
}
GenerateClassMethods(@class, @class);
if (CSharpTextTemplate.ShouldGenerateClassNativeField(@class))
{
@ -217,6 +207,25 @@ namespace CppSharp.Generators.CLI @@ -217,6 +207,25 @@ namespace CppSharp.Generators.CLI
}
}
private void GenerateClassMethods(Class @class, Class realOwner)
{
if (@class.IsValueType)
foreach (var @base in @class.Bases.Where(b => b.IsClass && !b.Class.Ignore))
GenerateClassMethods(@base.Class, realOwner);
foreach (var method in @class.Methods)
{
if (ASTUtils.CheckIgnoreMethod(method, this.Options))
continue;
// C++/CLI does not allow special member funtions for value types.
if (@class.IsValueType && method.IsCopyConstructor)
continue;
GenerateMethod(method, realOwner);
}
}
private void GenerateClassProperties(Class @class, Class realOwner)
{
if (@class.IsValueType)

42
src/Generator/Generators/CSharp/CSharpTextTemplate.cs

@ -471,9 +471,12 @@ namespace CppSharp.Generators.CSharp @@ -471,9 +471,12 @@ namespace CppSharp.Generators.CSharp
PopBlock(NewLineKind.BeforeNextBlock);
}
private IEnumerable<Function> GatherClassInternalFunctions(Class @class)
private IEnumerable<Function> GatherClassInternalFunctions(Class @class, bool includeCtors = true)
{
var functions = new HashSet<Function>();
var functions = new List<Function>();
if (@class.IsValueType)
foreach (var @base in @class.Bases.Where(b => b.IsClass && !b.Class.Ignore))
functions.AddRange(GatherClassInternalFunctions(@base.Class, false));
Action<Method> tryAddOverload = method =>
{
@ -487,18 +490,21 @@ namespace CppSharp.Generators.CSharp @@ -487,18 +490,21 @@ namespace CppSharp.Generators.CSharp
functions.Add(method);
};
foreach (var ctor in @class.Constructors)
if (includeCtors)
{
if (@class.IsStatic)
continue;
foreach (var ctor in @class.Constructors)
{
if (@class.IsStatic)
continue;
if (ctor.IsMoveConstructor)
continue;
if (ctor.IsMoveConstructor)
continue;
if (ctor.IsDefaultConstructor && !@class.HasNonTrivialDefaultConstructor)
continue;
if (ctor.IsDefaultConstructor && !@class.HasNonTrivialDefaultConstructor)
continue;
tryAddOverload(ctor);
tryAddOverload(ctor);
}
}
if (@class.HasNonTrivialDestructor && !@class.IsStatic)
@ -521,7 +527,7 @@ namespace CppSharp.Generators.CSharp @@ -521,7 +527,7 @@ namespace CppSharp.Generators.CSharp
if (prop.GetMethod != null)
tryAddOverload(prop.GetMethod);
if (prop.SetMethod != null)
if (prop.SetMethod != null && prop.SetMethod != prop.GetMethod)
tryAddOverload(prop.SetMethod);
}
@ -1119,6 +1125,10 @@ namespace CppSharp.Generators.CSharp @@ -1119,6 +1125,10 @@ namespace CppSharp.Generators.CSharp
public void GenerateClassMethods(Class @class)
{
if (@class.IsValueType)
foreach (var @base in @class.Bases.Where(b => b.IsClass && !b.Class.Ignore))
GenerateClassMethods(@base.Class);
var staticMethods = new List<Method>();
foreach (var method in @class.Methods)
{
@ -1145,6 +1155,10 @@ namespace CppSharp.Generators.CSharp @@ -1145,6 +1155,10 @@ namespace CppSharp.Generators.CSharp
public void GenerateClassVariables(Class @class)
{
if (@class.IsValueType)
foreach (var @base in @class.Bases.Where(b => b.IsClass && !b.Class.Ignore))
GenerateClassVariables(@base.Class);
foreach (var variable in @class.Variables)
{
if (!variable.IsGenerated) continue;
@ -1161,12 +1175,8 @@ namespace CppSharp.Generators.CSharp @@ -1161,12 +1175,8 @@ namespace CppSharp.Generators.CSharp
private void GenerateClassProperties(Class @class)
{
if (@class.IsValueType)
{
foreach (var @base in @class.Bases.Where(b => b.IsClass && b.Class.IsDeclared))
{
foreach (var @base in @class.Bases.Where(b => b.IsClass && !b.Class.Ignore && b.Class.IsDeclared))
GenerateClassProperties(@base.Class);
}
}
GenerateProperties(@class);
}

10
tests/Basic/Basic.Tests.cs

@ -368,5 +368,15 @@ public class BasicTests : GeneratorTestFixture @@ -368,5 +368,15 @@ public class BasicTests : GeneratorTestFixture
var ret = basic.TestNullPtrTypeRet();
Assert.AreEqual(IntPtr.Zero, new IntPtr(ret));
}
[Test]
public void TestValueTypeInheritance()
{
var bar2 = new Bar2 { A = 24 };
Assert.That(bar2.RetItem1(), Is.EqualTo(Bar.Item.Item1));
Assert.That(bar2.returnPointerToValueType().A, Is.EqualTo(24));
var inheritTestIndexedPropertiesInValueType = new InheritTestIndexedPropertiesInValueType();
Assert.That(inheritTestIndexedPropertiesInValueType[2], Is.EqualTo(2));
}
}

6
tests/Basic/Basic.h

@ -433,7 +433,7 @@ const foo_t& TestIndexedProperties::operator[](double f) { return p; } @@ -433,7 +433,7 @@ const foo_t& TestIndexedProperties::operator[](double f) { return p; }
TestProperties* TestIndexedProperties::operator[](unsigned char b) { return &f; }
const TestProperties& TestIndexedProperties::operator[](short b) { return f; }
struct DLL_API TestIndexedPropertiesInValueType
struct DLL_API CS_VALUETYPE TestIndexedPropertiesInValueType
{
public:
int operator[](int i);
@ -441,6 +441,10 @@ public: @@ -441,6 +441,10 @@ public:
int TestIndexedPropertiesInValueType::operator[](int i) { return i; }
struct DLL_API CS_VALUETYPE InheritTestIndexedPropertiesInValueType : public TestIndexedPropertiesInValueType
{
};
enum struct MyEnum { A, B, C };
class DLL_API TestArraysPointers

3
tests/Tests.h

@ -23,4 +23,5 @@ @@ -23,4 +23,5 @@
#endif
#define CS_OUT
#define CS_IN_OUT
#define CS_IN_OUT
#define CS_VALUETYPE

Loading…
Cancel
Save