Browse Source

Simplified the getting of base methods from only the primary bases.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/904/head
Dimitar Dobrev 8 years ago
parent
commit
e0367c5601
  1. 22
      src/AST/ClassExtensions.cs
  2. 2
      src/AST/FunctionExtensions.cs
  3. 2
      src/Generator/Passes/MultipleInheritancePass.cs

22
src/AST/ClassExtensions.cs

@ -41,33 +41,21 @@ namespace CppSharp.AST
} }
} }
public static Method GetBaseMethod(this Class @class, Method @override, public static Method GetBaseMethod(this Class @class, Method @override)
bool onlyPrimaryBase = false, bool getTopmost = false)
{ {
foreach (var @base in @class.Bases.Where( foreach (var @base in @class.Bases.Where(
b => b.IsClass && b.Class.OriginalClass != @class && (!onlyPrimaryBase || !b.Class.IsInterface))) b => b.IsClass && b.Class.OriginalClass != @class && !b.Class.IsInterface))
{ {
var baseClass = @base.Class.OriginalClass ?? @base.Class; var baseClass = @base.Class.OriginalClass ?? @base.Class;
Method baseMethod; Method baseMethod = baseClass.GetBaseMethod(@override);
if (!getTopmost) if (baseMethod != null)
{ return baseMethod;
baseMethod = baseClass.GetBaseMethod(@override, onlyPrimaryBase);
if (baseMethod != null)
return baseMethod;
}
baseMethod = (from method in baseClass.Methods baseMethod = (from method in baseClass.Methods
where @override.CanOverride(method) where @override.CanOverride(method)
select method).FirstOrDefault(); select method).FirstOrDefault();
if (baseMethod != null) if (baseMethod != null)
return baseMethod; return baseMethod;
if (getTopmost)
{
baseMethod = (baseClass.GetBaseMethod(@override, onlyPrimaryBase, true));
if (baseMethod != null)
return baseMethod;
}
} }
return null; return null;
} }

2
src/AST/FunctionExtensions.cs

@ -81,7 +81,7 @@ namespace CppSharp.AST
var @class = method.Namespace as Class; var @class = method.Namespace as Class;
Method rootBaseMethod; Method rootBaseMethod;
return method.IsOverride && return method.IsOverride &&
(rootBaseMethod = @class.GetBaseMethod(method, true)) != null && (rootBaseMethod = @class.GetBaseMethod(method)) != null &&
rootBaseMethod.IsGenerated && rootBaseMethod.IsVirtual; rootBaseMethod.IsGenerated && rootBaseMethod.IsVirtual;
} }

2
src/Generator/Passes/MultipleInheritancePass.cs

@ -181,7 +181,7 @@ namespace CppSharp.Passes
OriginalNamespace = @interface, OriginalNamespace = @interface,
OriginalFunction = method.OriginalFunction OriginalFunction = method.OriginalFunction
}; };
var rootBaseMethod = @class.GetBaseMethod(method, true); var rootBaseMethod = @class.GetBaseMethod(method);
if (rootBaseMethod != null && rootBaseMethod.IsDeclared) if (rootBaseMethod != null && rootBaseMethod.IsDeclared)
impl.ExplicitInterfaceImpl = @interface; impl.ExplicitInterfaceImpl = @interface;
@class.Methods.Add(impl); @class.Methods.Add(impl);

Loading…
Cancel
Save