Browse Source

Fixed a bug - interfaces were not implemented if they'd been already created.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/512/head
Dimitar Dobrev 10 years ago
parent
commit
240ac3e460
  1. 29
      src/Generator/Passes/MultipleInheritancePass.cs

29
src/Generator/Passes/MultipleInheritancePass.cs

@ -16,6 +16,18 @@ namespace CppSharp.Passes
/// </summary> /// </summary>
private readonly Dictionary<Class, Class> interfaces = new Dictionary<Class, Class>(); private readonly Dictionary<Class, Class> interfaces = new Dictionary<Class, Class>();
public MultipleInheritancePass()
{
Options.VisitClassFields = false;
Options.VisitNamespaceEnums = false;
Options.VisitNamespaceVariables = false;
Options.VisitTemplateArguments = false;
Options.VisitClassMethods = false;
Options.VisitClassProperties = false;
Options.VisitFunctionReturnType = false;
Options.VisitFunctionParameters = false;
}
public override bool VisitTranslationUnit(TranslationUnit unit) public override bool VisitTranslationUnit(TranslationUnit unit)
{ {
bool result = base.VisitTranslationUnit(unit); bool result = base.VisitTranslationUnit(unit);
@ -102,13 +114,15 @@ namespace CppSharp.Passes
var @base = @class.Bases[i].Class; var @base = @class.Bases[i].Class;
if (@base.IsInterface) continue; if (@base.IsInterface) continue;
var @interface = GetInterface(@class, @base, true); var @interface = GetInterface(@base);
@class.Bases[i] = new BaseClassSpecifier { Type = new TagType(@interface) }; @class.Bases[i] = new BaseClassSpecifier { Type = new TagType(@interface) };
ImplementInterfaceMethods(@class, @interface);
ImplementInterfaceProperties(@class, @interface);
} }
return true; return true;
} }
private Class GetInterface(Class @class, Class @base, bool addMembers = false) private Class GetInterface(Class @base)
{ {
if (@base.CompleteDeclaration != null) if (@base.CompleteDeclaration != null)
@base = (Class) @base.CompleteDeclaration; @base = (Class) @base.CompleteDeclaration;
@ -117,10 +131,10 @@ namespace CppSharp.Passes
return interfaces[@base]; return interfaces[@base];
return @base.Namespace.Classes.FirstOrDefault(c => c.Name == name) ?? return @base.Namespace.Classes.FirstOrDefault(c => c.Name == name) ??
GetNewInterface(@class, name, @base, addMembers); GetNewInterface(name, @base);
} }
private Class GetNewInterface(Class @class, string name, Class @base, bool addMembers = false) private Class GetNewInterface(string name, Class @base)
{ {
var @interface = new Class var @interface = new Class
{ {
@ -133,7 +147,7 @@ namespace CppSharp.Passes
@interface.Bases.AddRange( @interface.Bases.AddRange(
from b in @base.Bases from b in @base.Bases
let i = GetInterface(@base, b.Class) let i = GetInterface(b.Class)
select new BaseClassSpecifier { Type = new TagType(i) }); select new BaseClassSpecifier { Type = new TagType(i) });
@interface.Methods.AddRange( @interface.Methods.AddRange(
@ -169,11 +183,6 @@ namespace CppSharp.Passes
@interface.Events.AddRange(@base.Events); @interface.Events.AddRange(@base.Events);
if (addMembers)
{
ImplementInterfaceMethods(@class, @interface);
ImplementInterfaceProperties(@class, @interface);
}
if (@base.Bases.All(b => b.Class != @interface)) if (@base.Bases.All(b => b.Class != @interface))
@base.Bases.Add(new BaseClassSpecifier { Type = new TagType(@interface) }); @base.Bases.Add(new BaseClassSpecifier { Type = new TagType(@interface) });

Loading…
Cancel
Save