From f16a5ff6e03243a0f5335e29d2c7e1ecc829f13a Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Mon, 17 Feb 2014 11:59:18 +0200 Subject: [PATCH] Ensured default values, if any, of parameters of overrides, are generated. Signed-off-by: Dimitar Dobrev Conflicts: src/Generator/Driver.cs tests/Basic/Basic.cpp tests/Basic/Basic.h --- src/Generator/Driver.cs | 3 +++ .../FixDefaultParamValuesOfOverridesPass.cs | 20 +++++++++++++++++++ tests/CSharpTemp/CSharpTemp.Tests.cs | 6 ++++++ tests/CSharpTemp/CSharpTemp.cpp | 8 ++++++++ tests/CSharpTemp/CSharpTemp.h | 12 +++++++++++ 5 files changed, 49 insertions(+) create mode 100644 src/Generator/Passes/FixDefaultParamValuesOfOverridesPass.cs diff --git a/src/Generator/Driver.cs b/src/Generator/Driver.cs index a90cbb41..ff02888a 100644 --- a/src/Generator/Driver.cs +++ b/src/Generator/Driver.cs @@ -241,7 +241,10 @@ namespace CppSharp TranslationUnitPasses.AddPass(new CheckFlagEnumsPass()); TranslationUnitPasses.AddPass(new CheckDuplicatedNamesPass()); if (Options.IsCSharpGenerator && Options.GenerateDefaultValuesForArguments) + { TranslationUnitPasses.AddPass(new HandleDefaultParamValuesPass()); + TranslationUnitPasses.AddPass(new FixDefaultParamValuesOfOverridesPass()); + } if (Options.GenerateAbstractImpls) TranslationUnitPasses.AddPass(new GenerateAbstractImplementationsPass()); diff --git a/src/Generator/Passes/FixDefaultParamValuesOfOverridesPass.cs b/src/Generator/Passes/FixDefaultParamValuesOfOverridesPass.cs new file mode 100644 index 00000000..ab1c852b --- /dev/null +++ b/src/Generator/Passes/FixDefaultParamValuesOfOverridesPass.cs @@ -0,0 +1,20 @@ +using CppSharp.AST; + +namespace CppSharp.Passes +{ + public class FixDefaultParamValuesOfOverridesPass : TranslationUnitPass + { + public override bool VisitMethodDecl(Method method) + { + if (method.IsOverride && !method.IsSynthetized) + { + Method rootBaseMethod = ((Class) method.Namespace).GetRootBaseMethod(method); + for (int i = 0; i < method.Parameters.Count; i++) + { + method.Parameters[i].DefaultArgument = rootBaseMethod.Parameters[i].DefaultArgument; + } + } + return base.VisitMethodDecl(method); + } + } +} diff --git a/tests/CSharpTemp/CSharpTemp.Tests.cs b/tests/CSharpTemp/CSharpTemp.Tests.cs index ec7e2b92..928c0c55 100644 --- a/tests/CSharpTemp/CSharpTemp.Tests.cs +++ b/tests/CSharpTemp/CSharpTemp.Tests.cs @@ -144,4 +144,10 @@ public class CSharpTempTests : GeneratorTestFixture { AnotherUnit.FunctionInAnotherUnit(); } + + [Test] + public void TestPrivateOverride() + { + new HasPrivateOverride().PrivateOverride(); + } } \ No newline at end of file diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp index c2301bbe..74c8cc20 100644 --- a/tests/CSharpTemp/CSharpTemp.cpp +++ b/tests/CSharpTemp/CSharpTemp.cpp @@ -234,3 +234,11 @@ void MethodsWithDefaultValues::DefaultRefTypeBeforeAndAfterOthers(int i, Foo foo void MethodsWithDefaultValues::DefaultIntAssignedAnEnum(int i) { } + +void HasPrivateOverrideBase::privateOverride(int i) +{ +} + +void HasPrivateOverride::privateOverride(int i) +{ +} diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index 9c1902fc..3952ddca 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -186,3 +186,15 @@ public: void DefaultRefTypeBeforeAndAfterOthers(int i = 5, Foo foo = Foo(), Bar::Items item = Bar::Item2, Baz baz = Baz()); void DefaultIntAssignedAnEnum(int i = Bar::Item1); }; + +class DLL_API HasPrivateOverrideBase +{ +public: + virtual void privateOverride(int i = 5); +}; + +class DLL_API HasPrivateOverride : public HasPrivateOverrideBase +{ +private: + virtual void privateOverride(int i); +};