Skip to content

Commit 8e9cb70

Browse files
committed
Ensured interfaces for multiple inheritance are processed before their originals.
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent b585a13 commit 8e9cb70

File tree

2 files changed

+13
-11
lines changed

2 files changed

+13
-11
lines changed

src/Generator/Passes/GetterSetterToPropertyPass.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,7 @@ private static Stream GetResourceStream(Assembly assembly)
347347

348348
public GetterSetterToPropertyPass()
349349
{
350+
VisitOptions.VisitClassBases = false;
350351
VisitOptions.VisitClassFields = false;
351352
VisitOptions.VisitClassProperties = false;
352353
VisitOptions.VisitClassMethods = false;

src/Generator/Passes/MultipleInheritancePass.cs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class MultipleInheritancePass : TranslationUnitPass
1313
/// We also need it to check if a class already has a complementary interface
1414
/// because different classes may have the same secondary bases.
1515
/// </summary>
16-
private readonly Dictionary<Class, Class> interfaces = new Dictionary<Class, Class>();
16+
private readonly HashSet<Class> interfaces = new HashSet<Class>();
1717

1818
public MultipleInheritancePass()
1919
{
@@ -30,8 +30,11 @@ public MultipleInheritancePass()
3030
public override bool VisitTranslationUnit(TranslationUnit unit)
3131
{
3232
bool result = base.VisitTranslationUnit(unit);
33-
foreach (var @interface in interfaces.Where(i => !(i.Key is ClassTemplateSpecialization)))
34-
@interface.Key.Namespace.Classes.Add(@interface.Value);
33+
foreach (var @interface in interfaces.Where(i => !(i is ClassTemplateSpecialization)))
34+
{
35+
int index = @interface.Namespace.Declarations.IndexOf(@interface.OriginalClass);
36+
@interface.Namespace.Declarations.Insert(index, @interface);
37+
}
3538
interfaces.Clear();
3639
return result;
3740
}
@@ -60,12 +63,9 @@ private Class GetInterface(Class @base)
6063
{
6164
if (@base.CompleteDeclaration != null)
6265
@base = (Class) @base.CompleteDeclaration;
63-
var name = "I" + @base.Name;
64-
if (interfaces.ContainsKey(@base))
65-
return interfaces[@base];
6666

67-
return @base.Namespace.Classes.FirstOrDefault(c => c.Name == name) ??
68-
GetNewInterface(name, @base);
67+
return interfaces.FirstOrDefault(i => i.OriginalClass == @base) ??
68+
GetNewInterface("I" + @base.Name, @base);
6969
}
7070

7171
private Class GetNewInterface(string name, Class @base)
@@ -80,8 +80,9 @@ private Class GetNewInterface(string name, Class @base)
8080
{
8181
Class template = specialization.TemplatedDecl.TemplatedClass;
8282
Class templatedInterface = GetInterface(template);
83-
if (interfaces.ContainsKey(specialization))
84-
return interfaces[specialization];
83+
@interface = interfaces.FirstOrDefault(i => i.OriginalClass == @base);
84+
if (@interface != null)
85+
return @interface;
8586
var specializedInterface = new ClassTemplateSpecialization();
8687
specializedInterface.Arguments.AddRange(specialization.Arguments);
8788
specializedInterface.TemplatedDecl = new ClassTemplate { TemplatedDecl = templatedInterface };
@@ -163,7 +164,7 @@ where property.IsDeclared
163164

164165
@base.Bases.Add(new BaseClassSpecifier { Type = new TagType(@interface) });
165166

166-
interfaces.Add(@base, @interface);
167+
interfaces.Add(@interface);
167168
if (@base.IsTemplate)
168169
{
169170
@interface.IsDependent = true;

0 commit comments

Comments
 (0)