From 9ce1fea794ecb31d2e836361c785f66cdc58d601 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Mon, 15 Jun 2015 22:35:21 +0300 Subject: [PATCH] Fixed the "override" modifier of overridden methods and properties from secondary bases. Signed-off-by: Dimitar Dobrev --- .../Generators/CSharp/CSharpTextTemplate.cs | 13 +++++++++---- src/Generator/Passes/MultipleInheritancePass.cs | 4 ++++ tests/CSharpTemp/CSharpTemp.cpp | 17 +++++++++++++++++ tests/CSharpTemp/CSharpTemp.h | 15 +++++++++++++++ 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index 003f5078..03756f81 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -470,6 +470,7 @@ namespace CppSharp.Generators.CSharp var type = prop.Type; if (prop.Parameters.Count > 0 && prop.Type.IsPointerToPrimitiveType()) type = ((PointerType) prop.Type).Pointee; + GenerateDeclarationCommon(prop); Write("{0} {1} {{ ", type, GetPropertyName(prop)); if (prop.HasGetter) Write("get; "); @@ -1119,7 +1120,8 @@ namespace CppSharp.Generators.CSharp if (prop.IsStatic) Write("static "); - if (prop.IsOverride) + // check if overriding a property from a secondary base + if (prop.IsOverride && @class.GetRootBaseProperty(prop, true) != null) Write("override "); else if (prop.IsPure && Driver.Options.GenerateAbstractImpls) Write("abstract "); @@ -1761,7 +1763,7 @@ namespace CppSharp.Generators.CSharp WriteCloseBraceIndent(); NewLine(); - WriteLine("public virtual void {0}()", destroyNativeInstance); + WriteLine("public {0} void {1}()", hasBaseClass ? "override" : "virtual", destroyNativeInstance); WriteStartBraceIndent(); WriteLine("{0}(true);", destroyNativeInstance); WriteCloseBraceIndent(); @@ -1976,7 +1978,10 @@ namespace CppSharp.Generators.CSharp 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)) Write("virtual "); @@ -1986,7 +1991,7 @@ namespace CppSharp.Generators.CSharp if (method.IsStatic || isBuiltinOperator) Write("static "); - if (method.IsOverride) + if (isOverride) { if (method.Access == AccessSpecifier.Private) Write("sealed "); diff --git a/src/Generator/Passes/MultipleInheritancePass.cs b/src/Generator/Passes/MultipleInheritancePass.cs index 71bf3c7e..0c7d8450 100644 --- a/src/Generator/Passes/MultipleInheritancePass.cs +++ b/src/Generator/Passes/MultipleInheritancePass.cs @@ -181,8 +181,12 @@ namespace CppSharp.Passes private static void ImplementInterfaceMethods(Class @class, Class @interface) { + var parameterTypeComparer = new ParameterTypeComparer(); 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) { Namespace = @class, diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp index 7f3bddc9..8ce166c6 100644 --- a/tests/CSharpTemp/CSharpTemp.cpp +++ b/tests/CSharpTemp/CSharpTemp.cpp @@ -469,3 +469,20 @@ void TestNativeToManagedMap::setPropertyWithNoVirtualDtor(Bar* bar) { this->bar = bar; } + +void SecondaryBase::VirtualMember() +{ +} + +int SecondaryBase::property() +{ + return 0; +} + +void SecondaryBase::setProperty(int value) +{ +} + +void TestOverrideFromSecondaryBase::VirtualMember() +{ +} diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index 27a52619..d4050719 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -478,3 +478,18 @@ protected: double d; } 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); +};