Browse Source

Generated correct code when overriding a property from an indirect secondary base.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/534/head
Dimitar Dobrev 10 years ago
parent
commit
9d9d7b520a
  1. 13
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  2. 7
      src/Generator/Passes/MultipleInheritancePass.cs
  3. 22
      tests/CSharpTemp/CSharpTemp.cpp
  4. 20
      tests/CSharpTemp/CSharpTemp.h

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

@ -1154,11 +1154,17 @@ namespace CppSharp.Generators.CSharp
Write("static "); Write("static ");
// check if overriding a property from a secondary base // check if overriding a property from a secondary base
if (prop.IsOverride && @class.GetRootBaseProperty(prop, true) != null) Property rootBaseProperty;
var isOverride = prop.IsOverride &&
(rootBaseProperty = @class.GetRootBaseProperty(prop, true)) != null &&
(rootBaseProperty.IsVirtual || rootBaseProperty.IsPure);
if (isOverride)
Write("override "); Write("override ");
else if (prop.IsPure) else if (prop.IsPure)
Write("abstract "); Write("abstract ");
else if (prop.IsVirtual)
if (prop.IsVirtual && !isOverride && !prop.IsPure)
Write("virtual "); Write("virtual ");
WriteLine("{0} {1}", prop.Type, GetPropertyName(prop)); WriteLine("{0} {1}", prop.Type, GetPropertyName(prop));
@ -2025,7 +2031,8 @@ namespace CppSharp.Generators.CSharp
// check if overriding a function from a secondary base // check if overriding a function from a secondary base
Method rootBaseMethod; Method rootBaseMethod;
var isOverride = method.IsOverride && var isOverride = method.IsOverride &&
(rootBaseMethod = @class.GetRootBaseMethod(method, true)) != null && rootBaseMethod.IsVirtual; (rootBaseMethod = @class.GetRootBaseMethod(method, true)) != null &&
(rootBaseMethod.IsVirtual || rootBaseMethod.IsPure);
if (method.IsVirtual && !isOverride && !method.IsOperator && !method.IsPure) if (method.IsVirtual && !isOverride && !method.IsOperator && !method.IsPure)
Write("virtual "); Write("virtual ");

7
src/Generator/Passes/MultipleInheritancePass.cs

@ -199,12 +199,7 @@ namespace CppSharp.Passes
m.Parameters.SequenceEqual(method.Parameters.Where(p => !p.Ignore), m.Parameters.SequenceEqual(method.Parameters.Where(p => !p.Ignore),
parameterTypeComparer))) parameterTypeComparer)))
continue; continue;
var impl = new Method(method) var impl = new Method(method) { Namespace = @class };
{
Namespace = @class,
IsVirtual = false,
IsOverride = false
};
var rootBaseMethod = @class.GetRootBaseMethod(method, true); var rootBaseMethod = @class.GetRootBaseMethod(method, true);
if (rootBaseMethod != null && rootBaseMethod.IsDeclared) if (rootBaseMethod != null && rootBaseMethod.IsDeclared)
impl.ExplicitInterfaceImpl = @interface; impl.ExplicitInterfaceImpl = @interface;

22
tests/CSharpTemp/CSharpTemp.cpp

@ -737,3 +737,25 @@ void MultiOverloadPtrToRef::TakePrimTypePtr(int* ptr)
ptr[1] = 200; ptr[1] = 200;
ptr[2] = 300; ptr[2] = 300;
} }
OverrideFromIndirectSecondaryBaseBase::OverrideFromIndirectSecondaryBaseBase()
{
}
int OverrideFromIndirectSecondaryBaseBase::property()
{
return 0;
}
OverrideFromDirectSecondaryBase::OverrideFromDirectSecondaryBase()
{
}
OverrideFromIndirectSecondaryBase::OverrideFromIndirectSecondaryBase()
{
}
int OverrideFromIndirectSecondaryBase::property()
{
return 1;
}

20
tests/CSharpTemp/CSharpTemp.h

@ -672,3 +672,23 @@ public:
int* ReturnPrimTypePtr(); int* ReturnPrimTypePtr();
void TakePrimTypePtr(int* ptr); void TakePrimTypePtr(int* ptr);
}; };
class DLL_API OverrideFromIndirectSecondaryBaseBase
{
public:
OverrideFromIndirectSecondaryBaseBase();
virtual int property();
};
class DLL_API OverrideFromDirectSecondaryBase : public Foo, public OverrideFromIndirectSecondaryBaseBase
{
public:
OverrideFromDirectSecondaryBase();
};
class OverrideFromIndirectSecondaryBase : public OverrideFromDirectSecondaryBase
{
public:
OverrideFromIndirectSecondaryBase();
int property();
};

Loading…
Cancel
Save