Browse Source

Ensured interfaces for multiple inheritance are processed before their originals.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1078/head
Dimitar Dobrev 8 years ago
parent
commit
8e9cb70cc7
  1. 1
      src/Generator/Passes/GetterSetterToPropertyPass.cs
  2. 23
      src/Generator/Passes/MultipleInheritancePass.cs

1
src/Generator/Passes/GetterSetterToPropertyPass.cs

@ -347,6 +347,7 @@ namespace CppSharp.Passes @@ -347,6 +347,7 @@ namespace CppSharp.Passes
public GetterSetterToPropertyPass()
{
VisitOptions.VisitClassBases = false;
VisitOptions.VisitClassFields = false;
VisitOptions.VisitClassProperties = false;
VisitOptions.VisitClassMethods = false;

23
src/Generator/Passes/MultipleInheritancePass.cs

@ -13,7 +13,7 @@ namespace CppSharp.Passes @@ -13,7 +13,7 @@ namespace CppSharp.Passes
/// We also need it to check if a class already has a complementary interface
/// because different classes may have the same secondary bases.
/// </summary>
private readonly Dictionary<Class, Class> interfaces = new Dictionary<Class, Class>();
private readonly HashSet<Class> interfaces = new HashSet<Class>();
public MultipleInheritancePass()
{
@ -30,8 +30,11 @@ namespace CppSharp.Passes @@ -30,8 +30,11 @@ namespace CppSharp.Passes
public override bool VisitTranslationUnit(TranslationUnit unit)
{
bool result = base.VisitTranslationUnit(unit);
foreach (var @interface in interfaces.Where(i => !(i.Key is ClassTemplateSpecialization)))
@interface.Key.Namespace.Classes.Add(@interface.Value);
foreach (var @interface in interfaces.Where(i => !(i is ClassTemplateSpecialization)))
{
int index = @interface.Namespace.Declarations.IndexOf(@interface.OriginalClass);
@interface.Namespace.Declarations.Insert(index, @interface);
}
interfaces.Clear();
return result;
}
@ -60,12 +63,9 @@ namespace CppSharp.Passes @@ -60,12 +63,9 @@ namespace CppSharp.Passes
{
if (@base.CompleteDeclaration != null)
@base = (Class) @base.CompleteDeclaration;
var name = "I" + @base.Name;
if (interfaces.ContainsKey(@base))
return interfaces[@base];
return @base.Namespace.Classes.FirstOrDefault(c => c.Name == name) ??
GetNewInterface(name, @base);
return interfaces.FirstOrDefault(i => i.OriginalClass == @base) ??
GetNewInterface("I" + @base.Name, @base);
}
private Class GetNewInterface(string name, Class @base)
@ -80,8 +80,9 @@ namespace CppSharp.Passes @@ -80,8 +80,9 @@ namespace CppSharp.Passes
{
Class template = specialization.TemplatedDecl.TemplatedClass;
Class templatedInterface = GetInterface(template);
if (interfaces.ContainsKey(specialization))
return interfaces[specialization];
@interface = interfaces.FirstOrDefault(i => i.OriginalClass == @base);
if (@interface != null)
return @interface;
var specializedInterface = new ClassTemplateSpecialization();
specializedInterface.Arguments.AddRange(specialization.Arguments);
specializedInterface.TemplatedDecl = new ClassTemplate { TemplatedDecl = templatedInterface };
@ -163,7 +164,7 @@ namespace CppSharp.Passes @@ -163,7 +164,7 @@ namespace CppSharp.Passes
@base.Bases.Add(new BaseClassSpecifier { Type = new TagType(@interface) });
interfaces.Add(@base, @interface);
interfaces.Add(@interface);
if (@base.IsTemplate)
{
@interface.IsDependent = true;

Loading…
Cancel
Save