Skip to content

Commit 7c26931

Browse files
usiemsmrbean-bremen
authored andcommitted
Also consider interfaces of super classes (issue #75)
1 parent 559d022 commit 7c26931

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

generator/abstractmetalang.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1640,20 +1640,21 @@ void AbstractMetaClass::fixFunctions()
16401640

16411641
AbstractMetaClass *super_class = baseClass();
16421642
AbstractMetaFunctionList funcs = functions();
1643+
AbstractMetaClassList interfaceClasses = interfaces();
16431644

16441645
// printf("fix functions for %s\n", qPrintable(name()));
16451646

16461647
if (super_class != 0)
16471648
super_class->fixFunctions();
16481649
int iface_idx = 0;
1649-
while (super_class || iface_idx < interfaces().size()) {
1650-
// printf(" - base: %s\n", qPrintable(super_class->name()));
1650+
while (super_class || iface_idx < interfaceClasses.size()) {
16511651

16521652
// Since we always traverse the complete hierarchy we are only
16531653
// interested in what each super class implements, not what
16541654
// we may have propagated from their base classes again.
16551655
AbstractMetaFunctionList super_funcs;
16561656
if (super_class) {
1657+
// printf(" - base: %s\n", qPrintable(super_class->name()));
16571658

16581659
// Super classes can never be final
16591660
if (super_class->isFinalInTargetLang()) {
@@ -1662,7 +1663,10 @@ void AbstractMetaClass::fixFunctions()
16621663
}
16631664
super_funcs = super_class->queryFunctions(AbstractMetaClass::ClassImplements);
16641665
} else {
1665-
super_funcs = interfaces().at(iface_idx)->queryFunctions(AbstractMetaClass::NormalFunctions);
1666+
AbstractMetaClass *iface_class = interfaceClasses.at(iface_idx);
1667+
// printf(" - iface: %s\n", qPrintable(iface_class->name()));
1668+
iface_class->fixFunctions();
1669+
super_funcs = iface_class->queryFunctions(AbstractMetaClass::NormalFunctions);
16661670
}
16671671

16681672
QSet<AbstractMetaFunction *> funcs_to_add;
@@ -1819,12 +1823,16 @@ void AbstractMetaClass::fixFunctions()
18191823
foreach (AbstractMetaFunction *f, funcs_to_add)
18201824
funcs << f->copy();
18211825

1822-
if (super_class)
1826+
if (super_class) {
1827+
interfaceClasses += super_class->interfaces();
18231828
super_class = super_class->baseClass();
1824-
else
1829+
} else {
18251830
iface_idx++;
1831+
}
18261832
}
18271833

1834+
// printf("end fix functions for %s\n", qPrintable(name()));
1835+
18281836
bool hasPrivateConstructors = false;
18291837
bool hasPublicConstructors = false;
18301838
foreach (AbstractMetaFunction *func, funcs) {

0 commit comments

Comments
 (0)