From e62651a9544b27ff70c83a7f28c7d19673209710 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Wed, 26 Jul 2017 19:40:02 +0300 Subject: [PATCH] Fixed the getting of base methods to include ignored ones. Signed-off-by: Dimitar Dobrev --- src/AST/ClassExtensions.cs | 11 ++++++----- src/AST/FunctionExtensions.cs | 4 +++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/AST/ClassExtensions.cs b/src/AST/ClassExtensions.cs index b24d137436..64e1b5ef69 100644 --- a/src/AST/ClassExtensions.cs +++ b/src/AST/ClassExtensions.cs @@ -47,23 +47,24 @@ public static Class GetNonIgnoredRootBase(this Class @class) foreach (var @base in @class.Bases.Where( b => b.IsClass && b.Class.OriginalClass != @class && (!onlyPrimaryBase || !b.Class.IsInterface))) { + var baseClass = @base.Class.OriginalClass ?? @base.Class; Method baseMethod; if (!getTopmost) { - baseMethod = @base.Class.GetBaseMethod(@override, onlyPrimaryBase); + baseMethod = baseClass.GetBaseMethod(@override, onlyPrimaryBase); if (baseMethod != null) return baseMethod; } - baseMethod = (from method in @base.Class.Methods - where @override.CanOverride(method) - select method).FirstOrDefault(); + baseMethod = (from method in baseClass.Methods + where @override.CanOverride(method) + select method).FirstOrDefault(); if (baseMethod != null) return baseMethod; if (getTopmost) { - baseMethod = (@base.Class.GetBaseMethod(@override, onlyPrimaryBase, true)); + baseMethod = (baseClass.GetBaseMethod(@override, onlyPrimaryBase, true)); if (baseMethod != null) return baseMethod; } diff --git a/src/AST/FunctionExtensions.cs b/src/AST/FunctionExtensions.cs index 384bc21f46..53579798fe 100644 --- a/src/AST/FunctionExtensions.cs +++ b/src/AST/FunctionExtensions.cs @@ -89,7 +89,9 @@ public static bool CanOverride(this Method @override, Method method) { return (method.OriginalName == @override.OriginalName && method.OriginalReturnType.ResolvesTo(@override.OriginalReturnType) && - method.Parameters.SequenceEqual(@override.Parameters, ParameterTypeComparer.Instance)) || + method.Parameters.Where(p => p.Kind != ParameterKind.IndirectReturnType).SequenceEqual( + @override.Parameters.Where(p => p.Kind != ParameterKind.IndirectReturnType), + ParameterTypeComparer.Instance)) || (@override.IsDestructor && method.IsDestructor && method.IsVirtual); } }