From da3a8dbea45e8ccf2a7af4c7e0991a9489c38bef Mon Sep 17 00:00:00 2001 From: Alexander Corrado Date: Sat, 23 Jul 2011 17:13:12 -0400 Subject: [PATCH] Generator: correctly deal with arbitrarily long inheritance chains --- src/generator/Generator.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/generator/Generator.cs b/src/generator/Generator.cs index 961e5096..4cdda1be 100644 --- a/src/generator/Generator.cs +++ b/src/generator/Generator.cs @@ -227,7 +227,7 @@ public class Generator { continue; } - if ((!dtor && n.HasValue ("overrides") && klass.BaseClasses [0].Node.CheckValueList ("members", n.Attributes ["overrides"])) || // excl. virtual methods from primary base (except dtor) + if ((!dtor && n.HasValue ("overrides") && CheckPrimaryBases (klass, b => b.Node.CheckValueList ("members", n.Attributes ["overrides"]))) || // excl. virtual methods from primary base (except dtor) (!n.IsTrue ("extern") && !n.IsTrue ("inline"))) continue; @@ -380,6 +380,15 @@ public class Generator { return false; } + // Checks klass's primary base, primary base's primary base, and so on up the hierarchy + bool CheckPrimaryBases (Class klass, Func predicate) + { + if (klass.BaseClasses.Count == 0) + return false; + var primaryBase = klass.BaseClasses [0]; + return predicate (primaryBase) || CheckPrimaryBases (primaryBase, predicate); + } + // Return a CppType for the type node N, return CppTypes.Unknown for unknown types CppType GetType (Node n) { return GetType (n, new CppType ());