Browse Source

Fixed a crash when a constructor takes a template or specialisation.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1033/head
Dimitar Dobrev 9 years ago
parent
commit
ae9eede6f1
  1. 22
      src/AST/ClassExtensions.cs
  2. 2
      src/Generator/Generators/CSharp/CSharpSources.cs
  3. 17
      src/Generator/Passes/ParamTypeToInterfacePass.cs
  4. 12
      tests/CSharp/CSharpTemplates.h

22
src/AST/ClassExtensions.cs

@ -178,6 +178,28 @@ namespace CppSharp.AST
c => c.Name == dependentClass.Name)).ToList(); c => c.Name == dependentClass.Name)).ToList();
} }
public static Class GetInterface(this Class @class)
{
var specialization = @class as ClassTemplateSpecialization;
Class @interface = null;
if (specialization == null)
{
@interface = @class.Namespace.Classes.Find(
c => c.OriginalClass == @class && c.IsInterface);
}
else
{
Class template = specialization.TemplatedDecl.TemplatedClass;
Class templatedInterface = @class.Namespace.Classes.Find(
c => c.OriginalClass == template && c.IsInterface);
if (templatedInterface != null)
@interface = templatedInterface.Specializations.FirstOrDefault(
s => s.OriginalClass == specialization && s.IsInterface);
}
return @interface;
}
public static bool HasDependentValueFieldInLayout(this Class @class) public static bool HasDependentValueFieldInLayout(this Class @class)
{ {
if (@class.Fields.Any(f => IsValueDependent(f.Type))) if (@class.Fields.Any(f => IsValueDependent(f.Type)))

2
src/Generator/Generators/CSharp/CSharpSources.cs

@ -2595,7 +2595,7 @@ namespace CppSharp.Generators.CSharp
Class paramClass; Class paramClass;
Class @interface = null; Class @interface = null;
if (paramType.TryGetClass(out paramClass)) if (paramType.TryGetClass(out paramClass))
@interface = paramClass.Namespace.Classes.Find(c => c.OriginalClass == paramClass); @interface = paramClass.GetInterface();
var paramName = string.Format("{0}{1}", var paramName = string.Format("{0}{1}",
method.Parameters[0].Type.IsPrimitiveTypeConvertibleToRef() ? method.Parameters[0].Type.IsPrimitiveTypeConvertibleToRef() ?

17
src/Generator/Passes/ParamTypeToInterfacePass.cs

@ -59,22 +59,7 @@ namespace CppSharp.Passes
if (!finalType.TryGetClass(out @class)) if (!finalType.TryGetClass(out @class))
return; return;
var specialization = @class as ClassTemplateSpecialization; Class @interface = @class.GetInterface();
Class @interface = null;
if (specialization == null)
{
@interface = @class.Namespace.Classes.Find(
c => c.OriginalClass == @class && c.IsInterface);
}
else
{
Class template = specialization.TemplatedDecl.TemplatedClass;
Class templatedInterface = @class.Namespace.Classes.Find(
c => c.OriginalClass == template && c.IsInterface);
if (templatedInterface != null)
@interface = templatedInterface.Specializations.FirstOrDefault(
s => s.OriginalClass == specialization);
}
if (@interface == null) if (@interface == null)
return; return;

12
tests/CSharp/CSharpTemplates.h

@ -137,6 +137,7 @@ public:
T field; T field;
}; };
DependentValueFields(); DependentValueFields();
DependentValueFields(IndependentFields<T> i);
~DependentValueFields(); ~DependentValueFields();
DependentValueFields& returnInjectedClass(); DependentValueFields& returnInjectedClass();
DependentValueFields returnValue(); DependentValueFields returnValue();
@ -163,6 +164,11 @@ DependentValueFields<T>::~DependentValueFields()
{ {
} }
template <typename T>
DependentValueFields<T>::DependentValueFields(IndependentFields<T> i)
{
}
template <typename T> template <typename T>
T DependentValueFields<T>::getDependentValue() T DependentValueFields<T>::getDependentValue()
{ {
@ -404,6 +410,7 @@ class VirtualTemplate
{ {
public: public:
VirtualTemplate(); VirtualTemplate();
VirtualTemplate(IndependentFields<int> i);
VirtualTemplate(OptionalTemplateArgs<T> optionalTemplateArgs); VirtualTemplate(OptionalTemplateArgs<T> optionalTemplateArgs);
virtual ~VirtualTemplate(); virtual ~VirtualTemplate();
virtual int function(); virtual int function();
@ -415,6 +422,11 @@ VirtualTemplate<T>::VirtualTemplate()
{ {
} }
template <typename T>
VirtualTemplate<T>::VirtualTemplate(IndependentFields<int> i)
{
}
template <typename T> template <typename T>
VirtualTemplate<T>::VirtualTemplate(OptionalTemplateArgs<T> optionalTemplateArgs) VirtualTemplate<T>::VirtualTemplate(OptionalTemplateArgs<T> optionalTemplateArgs)
{ {

Loading…
Cancel
Save