From d68b7b3b56a6274123cb91feaffc310ed09d0667 Mon Sep 17 00:00:00 2001 From: triton Date: Wed, 16 Apr 2014 13:53:17 +0100 Subject: [PATCH] Fixed code generation for enum pointers as parameters. Fixes issue #217. --- src/Generator/Generators/CLI/CLIMarshal.cs | 15 ++++++++++++--- src/Generator/Generators/CLI/CLITypePrinter.cs | 11 +++++++++-- .../Generators/CSharp/CSharpTypePrinter.cs | 6 ++++++ tests/Basic/Basic.Tests.cs | 8 ++++++++ tests/Basic/Basic.h | 13 +++++++++++++ 5 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/Generator/Generators/CLI/CLIMarshal.cs b/src/Generator/Generators/CLI/CLIMarshal.cs index 45eda0ca..5d32143b 100644 --- a/src/Generator/Generators/CLI/CLIMarshal.cs +++ b/src/Generator/Generators/CLI/CLIMarshal.cs @@ -419,11 +419,20 @@ namespace CppSharp.Generators.CLI var cppTypeName = pointer.Visit(cppTypePrinter, quals); return VisitDelegateType(function, cppTypeName); + } + + Enumeration @enum; + if (pointee.IsTagDecl(out @enum)) + { + ArgumentPrefix.Write("&"); + Context.Return.Write("(::{0})*{1}", @enum.QualifiedOriginalName, + Context.Parameter.Name); + return true; } - Class @class; - if (pointee.IsTagDecl(out @class) && @class.IsValueType) - { + Class @class; + if (pointee.IsTagDecl(out @class) && @class.IsValueType) + { if (Context.Function == null) Context.Return.Write("&"); return pointee.Visit(this, quals); diff --git a/src/Generator/Generators/CLI/CLITypePrinter.cs b/src/Generator/Generators/CLI/CLITypePrinter.cs index 9875cfbe..84c9914b 100644 --- a/src/Generator/Generators/CLI/CLITypePrinter.cs +++ b/src/Generator/Generators/CLI/CLITypePrinter.cs @@ -129,7 +129,7 @@ namespace CppSharp.Generators.CLI public string VisitPointerType(PointerType pointer, TypeQualifiers quals) { - var pointee = pointer.Pointee; + var pointee = pointer.Pointee.Desugar(); if (pointee is FunctionType) { @@ -143,7 +143,7 @@ namespace CppSharp.Generators.CLI } PrimitiveType primitive; - if (pointee.Desugar().IsPrimitiveType(out primitive)) + if (pointee.IsPrimitiveType(out primitive)) { var param = Context.Parameter; if (param != null && (param.IsOut || param.IsInOut)) @@ -152,6 +152,13 @@ namespace CppSharp.Generators.CLI return VisitPrimitiveType(primitive, quals) + "*"; } + Enumeration @enum; + if (pointee.IsTagDecl(out @enum)) + { + var typeName = @enum.Visit(this); + return string.Format("{0}*", typeName); + } + return pointee.Visit(this, quals); } diff --git a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs index b0c098fb..df979a9e 100644 --- a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs +++ b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs @@ -222,6 +222,12 @@ namespace CppSharp.Generators.CSharp return VisitPrimitiveType(primitive, quals) + "*"; } + Enumeration @enum; + if (desugared.IsTagDecl(out @enum)) + { + return @enum.Name + "*"; + } + Class @class; if ((desugared.IsDependent || desugared.IsTagDecl(out @class)) && ContextKind == CSharpTypePrinterContextKind.Native) diff --git a/tests/Basic/Basic.Tests.cs b/tests/Basic/Basic.Tests.cs index 19095bb0..35f9412a 100644 --- a/tests/Basic/Basic.Tests.cs +++ b/tests/Basic/Basic.Tests.cs @@ -257,5 +257,13 @@ public class BasicTests : GeneratorTestFixture prop.FieldValue = 10; Assert.That(prop.FieldValue, Is.EqualTo(10)); } + + [Test] + public unsafe void TestArraysPointers() + { + var values = MyEnum.A; + var arrays = new TestArraysPointers(&values, 1); + Assert.That(arrays.Value, Is.EqualTo(MyEnum.A)); + } } \ No newline at end of file diff --git a/tests/Basic/Basic.h b/tests/Basic/Basic.h index d839385c..482ca179 100644 --- a/tests/Basic/Basic.h +++ b/tests/Basic/Basic.h @@ -350,3 +350,16 @@ struct DLL_API TestProperties int getFieldValue() { return Field; } void setFieldValue(int Value) { Field = Value; } }; + +enum struct MyEnum { A, B, C }; + +class DLL_API TestArraysPointers +{ +public: + TestArraysPointers(MyEnum *values, int count) + { + if (values && count) Value = values[0]; + } + + MyEnum Value; +}; \ No newline at end of file