Browse Source

Handled indirect return params in type maps.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/310/head
Dimitar Dobrev 11 years ago
parent
commit
db30cde06d
  1. 24
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  2. 9
      src/Generator/Types/TypeMap.cs
  3. 6
      tests/CSharpTemp/CSharpTemp.Tests.cs
  4. 19
      tests/CSharpTemp/CSharpTemp.cpp
  5. 5
      tests/CSharpTemp/CSharpTemp.cs
  6. 18
      tests/CSharpTemp/CSharpTemp.h

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

@ -2262,8 +2262,28 @@ namespace CppSharp.Generators.CSharp
Class retClass; Class retClass;
indirectRetType.Type.Desugar().TryGetClass(out retClass); indirectRetType.Type.Desugar().TryGetClass(out retClass);
WriteLine("var {0} = new {1}.Internal();", GeneratedIdentifier("ret"), TypeMap typeMap;
QualifiedIdentifier(retClass.OriginalClass ?? retClass)); string construct = null;
if (Driver.TypeDatabase.FindTypeMap(retClass, out typeMap))
construct = typeMap.CSharpConstruct();
if (construct == null)
{
WriteLine("var {0} = new {1}.Internal();", GeneratedIdentifier("ret"),
QualifiedIdentifier(retClass.OriginalClass ?? retClass));
}
else
{
if (string.IsNullOrWhiteSpace(construct))
WriteLine("{0} {1};",
typeMap.CSharpSignature(new CSharpTypePrinterContext
{
Type = indirectRetType.Type.Desugar()
}),
GeneratedIdentifier("ret"));
else
WriteLine("var {0} = {1};", construct);
}
} }
var names = new List<string>(); var names = new List<string>();

9
src/Generator/Types/TypeMap.cs

@ -70,6 +70,15 @@ namespace CppSharp.Types
} }
/// <summary>
/// Used to construct a new instance of the mapped type.
/// </summary>
/// <returns></returns>
public virtual string CSharpConstruct()
{
return null;
}
#endregion #endregion
#region C++/CLI backend #region C++/CLI backend

6
tests/CSharpTemp/CSharpTemp.Tests.cs

@ -150,4 +150,10 @@ public class CSharpTempTests : GeneratorTestFixture
{ {
new HasPrivateOverride().PrivateOverride(); new HasPrivateOverride().PrivateOverride();
} }
[Test]
public void TestQFlags()
{
Assert.AreEqual(TestFlag.Flag2, new ComplexType().ReturnsQFlags);
}
} }

19
tests/CSharpTemp/CSharpTemp.cpp

@ -130,14 +130,29 @@ long P::prop()
return m_property + 100; return m_property + 100;
} }
template <typename T>
QFlags<T>::QFlags(T t) : flag(t)
{
}
template <typename T>
QFlags<T>::operator T()
{
return flag;
}
ComplexType::ComplexType() : qFlags(QFlags<TestFlag>(TestFlag::Flag2))
{
}
int ComplexType::check() int ComplexType::check()
{ {
return 5; return 5;
} }
QFlags<int> ComplexType::returnsQFlags() QFlags<TestFlag> ComplexType::returnsQFlags()
{ {
return QFlags<int>(); return qFlags;
} }
void ComplexType::takesQFlags(const QFlags<int> f) void ComplexType::takesQFlags(const QFlags<int> f)

5
tests/CSharpTemp/CSharpTemp.cs

@ -13,6 +13,11 @@ namespace CppSharp.Tests
[TypeMap("QFlags")] [TypeMap("QFlags")]
public class QFlags : TypeMap public class QFlags : TypeMap
{ {
public override string CSharpConstruct()
{
return string.Empty;
}
public override string CSharpSignature(CSharpTypePrinterContext ctx) public override string CSharpSignature(CSharpTypePrinterContext ctx)
{ {
TemplateArgument templateArgument = TemplateArgument templateArgument =

18
tests/CSharpTemp/CSharpTemp.h

@ -102,18 +102,30 @@ public:
Proprietor::Proprietor() {} Proprietor::Proprietor() {}
template <typename T> template <typename T>
class QFlags class DLL_API QFlags
{ {
public: public:
QFlags() {} QFlags(T t);
operator T();
private:
T flag;
};
enum class TestFlag
{
Flag1,
Flag2
}; };
class DLL_API ComplexType class DLL_API ComplexType
{ {
public: public:
ComplexType();
int check(); int check();
QFlags<int> returnsQFlags(); QFlags<TestFlag> returnsQFlags();
void takesQFlags(const QFlags<int> f); void takesQFlags(const QFlags<int> f);
private:
QFlags<TestFlag> qFlags;
}; };
class DLL_API P : Proprietor class DLL_API P : Proprietor

Loading…
Cancel
Save