Browse Source

Fixed the "override" modifier of overridden methods and properties from secondary bases.

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

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

@ -470,6 +470,7 @@ namespace CppSharp.Generators.CSharp
var type = prop.Type; var type = prop.Type;
if (prop.Parameters.Count > 0 && prop.Type.IsPointerToPrimitiveType()) if (prop.Parameters.Count > 0 && prop.Type.IsPointerToPrimitiveType())
type = ((PointerType) prop.Type).Pointee; type = ((PointerType) prop.Type).Pointee;
GenerateDeclarationCommon(prop);
Write("{0} {1} {{ ", type, GetPropertyName(prop)); Write("{0} {1} {{ ", type, GetPropertyName(prop));
if (prop.HasGetter) if (prop.HasGetter)
Write("get; "); Write("get; ");
@ -1119,7 +1120,8 @@ namespace CppSharp.Generators.CSharp
if (prop.IsStatic) if (prop.IsStatic)
Write("static "); Write("static ");
if (prop.IsOverride) // check if overriding a property from a secondary base
if (prop.IsOverride && @class.GetRootBaseProperty(prop, true) != null)
Write("override "); Write("override ");
else if (prop.IsPure && Driver.Options.GenerateAbstractImpls) else if (prop.IsPure && Driver.Options.GenerateAbstractImpls)
Write("abstract "); Write("abstract ");
@ -1761,7 +1763,7 @@ namespace CppSharp.Generators.CSharp
WriteCloseBraceIndent(); WriteCloseBraceIndent();
NewLine(); NewLine();
WriteLine("public virtual void {0}()", destroyNativeInstance); WriteLine("public {0} void {1}()", hasBaseClass ? "override" : "virtual", destroyNativeInstance);
WriteStartBraceIndent(); WriteStartBraceIndent();
WriteLine("{0}(true);", destroyNativeInstance); WriteLine("{0}(true);", destroyNativeInstance);
WriteCloseBraceIndent(); WriteCloseBraceIndent();
@ -1976,7 +1978,10 @@ namespace CppSharp.Generators.CSharp
Write(Helpers.GetAccess(GetValidMethodAccess(method))); Write(Helpers.GetAccess(GetValidMethodAccess(method)));
} }
if (method.IsVirtual && !method.IsOverride && !method.IsOperator && // check if overriding a function from a secondary base
var isOverride = method.IsOverride && @class.GetRootBaseMethod(method, true) != null;
if (method.IsVirtual && !isOverride && !method.IsOperator &&
(!Driver.Options.GenerateAbstractImpls || !method.IsPure)) (!Driver.Options.GenerateAbstractImpls || !method.IsPure))
Write("virtual "); Write("virtual ");
@ -1986,7 +1991,7 @@ namespace CppSharp.Generators.CSharp
if (method.IsStatic || isBuiltinOperator) if (method.IsStatic || isBuiltinOperator)
Write("static "); Write("static ");
if (method.IsOverride) if (isOverride)
{ {
if (method.Access == AccessSpecifier.Private) if (method.Access == AccessSpecifier.Private)
Write("sealed "); Write("sealed ");

4
src/Generator/Passes/MultipleInheritancePass.cs

@ -181,8 +181,12 @@ namespace CppSharp.Passes
private static void ImplementInterfaceMethods(Class @class, Class @interface) private static void ImplementInterfaceMethods(Class @class, Class @interface)
{ {
var parameterTypeComparer = new ParameterTypeComparer();
foreach (var method in @interface.Methods) foreach (var method in @interface.Methods)
{ {
if (@class.Methods.Any(m => m.OriginalName == method.OriginalName &&
m.Parameters.SequenceEqual(method.Parameters, parameterTypeComparer)))
continue;
var impl = new Method(method) var impl = new Method(method)
{ {
Namespace = @class, Namespace = @class,

17
tests/CSharpTemp/CSharpTemp.cpp

@ -469,3 +469,20 @@ void TestNativeToManagedMap::setPropertyWithNoVirtualDtor(Bar* bar)
{ {
this->bar = bar; this->bar = bar;
} }
void SecondaryBase::VirtualMember()
{
}
int SecondaryBase::property()
{
return 0;
}
void SecondaryBase::setProperty(int value)
{
}
void TestOverrideFromSecondaryBase::VirtualMember()
{
}

15
tests/CSharpTemp/CSharpTemp.h

@ -478,3 +478,18 @@ protected:
double d; double d;
} u; } u;
}; };
class DLL_API SecondaryBase
{
public:
virtual void VirtualMember();
int property();
void setProperty(int value);
};
class DLL_API TestOverrideFromSecondaryBase : public Foo, public SecondaryBase
{
public:
void VirtualMember();
void setProperty(int value);
};

Loading…
Cancel
Save