From 0ecb7fc156948b6dc8447641f332ae84b8ed0475 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Fri, 28 Jul 2017 00:32:22 +0300 Subject: [PATCH] Changed the getting of a root base method to use the list of overrides. Signed-off-by: Dimitar Dobrev --- src/AST/Method.cs | 7 +++++++ .../Passes/EqualiseAccessOfOverrideAndBasePass.cs | 2 +- .../Passes/FixDefaultParamValuesOfOverridesPass.cs | 2 +- src/Generator/Passes/MultipleInheritancePass.cs | 1 - src/Generator/Passes/ObjectOverridesPass.cs | 6 +++--- src/Generator/Passes/RenamePass.cs | 7 ++++++- 6 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/AST/Method.cs b/src/AST/Method.cs index f424b706..7847969a 100644 --- a/src/AST/Method.cs +++ b/src/AST/Method.cs @@ -118,6 +118,7 @@ namespace CppSharp.AST public bool IsConst { get; set; } public bool IsExplicit { get; set; } public bool IsOverride => OverriddenMethods.Any(); + public Method BaseMethod => IsOverride ? OverriddenMethods[0] : null; // True if the method is final / sealed. public bool IsFinal { get; set; } @@ -165,6 +166,12 @@ namespace CppSharp.AST public List OverriddenMethods { get; } = new List(); + public Method GetRootBaseMethod() + { + return BaseMethod == null || BaseMethod.BaseMethod == null ? + BaseMethod : BaseMethod.GetRootBaseMethod(); + } + public override T Visit(IDeclVisitor visitor) { return visitor.VisitMethodDecl(this); diff --git a/src/Generator/Passes/EqualiseAccessOfOverrideAndBasePass.cs b/src/Generator/Passes/EqualiseAccessOfOverrideAndBasePass.cs index 513b9ce5..35f0051c 100644 --- a/src/Generator/Passes/EqualiseAccessOfOverrideAndBasePass.cs +++ b/src/Generator/Passes/EqualiseAccessOfOverrideAndBasePass.cs @@ -25,7 +25,7 @@ namespace CppSharp.Passes if (!base.VisitMethodDecl(method) || !method.IsOverride) return false; - var baseMethod = ((Class) method.Namespace).GetBaseMethod(method); + var baseMethod = method.GetRootBaseMethod(); if (!baseMethod.IsGenerated) return false; diff --git a/src/Generator/Passes/FixDefaultParamValuesOfOverridesPass.cs b/src/Generator/Passes/FixDefaultParamValuesOfOverridesPass.cs index ce76460e..aa3de995 100644 --- a/src/Generator/Passes/FixDefaultParamValuesOfOverridesPass.cs +++ b/src/Generator/Passes/FixDefaultParamValuesOfOverridesPass.cs @@ -9,7 +9,7 @@ namespace CppSharp.Passes if (!method.IsOverride || method.IsSynthetized) return true; - Method rootBaseMethod = ((Class)method.Namespace).GetBaseMethod(method); + Method rootBaseMethod = method.GetRootBaseMethod(); for (int i = 0; i < method.Parameters.Count; i++) { var rootBaseParameter = rootBaseMethod.Parameters[i]; diff --git a/src/Generator/Passes/MultipleInheritancePass.cs b/src/Generator/Passes/MultipleInheritancePass.cs index b04214ed..10d77c93 100644 --- a/src/Generator/Passes/MultipleInheritancePass.cs +++ b/src/Generator/Passes/MultipleInheritancePass.cs @@ -2,7 +2,6 @@ using System.Linq; using CppSharp.AST; using CppSharp.Generators; -using CppSharp.Generators.CSharp; namespace CppSharp.Passes { diff --git a/src/Generator/Passes/ObjectOverridesPass.cs b/src/Generator/Passes/ObjectOverridesPass.cs index 3b610035..6cad17da 100644 --- a/src/Generator/Passes/ObjectOverridesPass.cs +++ b/src/Generator/Passes/ObjectOverridesPass.cs @@ -64,7 +64,7 @@ namespace CppSharp GenerateEquals(@class, block, method); if (method.Name == "ToString" && method.Parameters.Count == 0) - GenerateToString(@class, block, method); + GenerateToString(block); } void GenerateGetHashCode(Block block) @@ -86,7 +86,7 @@ namespace CppSharp block.Write("return __Instance == obj->__Instance;"); } - void GenerateToString(Class @class, Block block, Method method) + void GenerateToString(Block block) { needsStreamInclude = true; block.WriteLine("std::ostringstream os;"); @@ -129,7 +129,7 @@ namespace CppSharp SynthKind = FunctionSynthKind.ComplementOperator, IsProxy = true }; - toStringMethod.OverriddenMethods.Add(new Method { Name = "Equals" }); + toStringMethod.OverriddenMethods.Add(new Method { Name = "ToString" }); @class.Methods.Add(toStringMethod); Diagnostics.Debug("Function converted to ToString: {0}::{1}", diff --git a/src/Generator/Passes/RenamePass.cs b/src/Generator/Passes/RenamePass.cs index 3d29e80a..b83149c7 100644 --- a/src/Generator/Passes/RenamePass.cs +++ b/src/Generator/Passes/RenamePass.cs @@ -49,7 +49,12 @@ namespace CppSharp.Passes var method = decl as Method; if (method != null && !method.IsStatic) { - var rootBaseMethod = ((Class) method.Namespace).GetBaseMethod(method); + Method rootBaseMethod; + var @class = method.OriginalNamespace as Class; + if (@class != null && @class.IsInterface) + rootBaseMethod = (Method) method.OriginalFunction; + else + rootBaseMethod = method.GetRootBaseMethod(); if (rootBaseMethod != null && rootBaseMethod != method) { newName = rootBaseMethod.Name;