interface inheritance (1)

This commit is contained in:
Vladimir Kalinin 2013-05-22 00:20:58 +04:00
commit 5ccf08e3ec

View file

@ -1274,7 +1274,9 @@ public:
// Add extra indentation // Add extra indentation
Replaceall(enum_code, "\n", "\n "); Replaceall(enum_code, "\n", "\n ");
Replaceall(enum_code, " \n", "\n"); Replaceall(enum_code, " \n", "\n");
if (GetFlag(getCurrentClass(), "feature:interface"))
Printv(interface_class_code, " ", enum_code, "\n\n", NIL);
else
Printv(proxy_class_constants_code, " ", enum_code, "\n\n", NIL); Printv(proxy_class_constants_code, " ", enum_code, "\n\n", NIL);
} else { } else {
// Global enums are defined in their own file // Global enums are defined in their own file
@ -1723,7 +1725,10 @@ public:
} }
return ret; return ret;
} }
void addInterfaceNameAndUpcasts(String* interface_list, String* interface_upcasts, Node* base, String* c_classname) { void addInterfaceNameAndUpcasts(String* interface_list, String* interface_upcasts, Hash* base_list, String* c_classname) {
List* keys = Keys(base_list);
for (Iterator it = First(keys); it.item; it = Next(it)) {
Node* base = Getattr(base_list, it.item);
String* c_baseclass = SwigType_namestr(Getattr(base, "name")); String* c_baseclass = SwigType_namestr(Getattr(base, "name"));
String* iname = Getattr(base, "feature:interface:name"); String* iname = Getattr(base, "feature:interface:name");
if (Len(interface_list)) if (Len(interface_list))
@ -1757,6 +1762,22 @@ public:
Delete(upcast_method); Delete(upcast_method);
Delete(c_baseclass); Delete(c_baseclass);
} }
Delete(keys);
Delete(base_list);
}
void collectInterfaceBases(Hash* bases, Node* n) {
if (Getattr(n, "feature:interface")) {
String* name = Getattr(n, "feature:interface:name");
if (Getattr(bases, name))
return;
Setattr(bases, name, n);
}
if (List *baselist = Getattr(n, "bases")) {
for (Iterator base = First(baselist); base.item; base = Next(base))
collectInterfaceBases(bases, base.item);
}
}
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
* emitProxyClassDefAndCPPCasts() * emitProxyClassDefAndCPPCasts()
@ -1780,17 +1801,13 @@ public:
Delete(attributes); Delete(attributes);
// C++ inheritance // C++ inheritance
List* interface_classes = NewHash();
if (!purebase_replace) { if (!purebase_replace) {
List *baselist = Getattr(n, "bases"); List *baselist = Getattr(n, "bases");
if (baselist) { if (baselist) {
Iterator base = First(baselist); Iterator base = First(baselist);
while (base.item && GetFlag(base.item, "feature:ignore")) { while (base.item && (GetFlag(base.item, "feature:ignore") || Getattr(base.item, "feature:interface")))
base = Next(base); base = Next(base);
}
while (base.item && Getattr(base.item, "feature:interface")) {
addInterfaceNameAndUpcasts(interface_list, interface_upcasts, base.item, c_classname);
base = Next(base);
}
if (base.item) { if (base.item) {
c_baseclassname = Getattr(base.item, "name"); c_baseclassname = Getattr(base.item, "name");
baseclass = Copy(getProxyName(c_baseclassname)); baseclass = Copy(getProxyName(c_baseclassname));
@ -1799,9 +1816,7 @@ public:
base = Next(base); base = Next(base);
/* Warn about multiple inheritance for additional base class(es) */ /* Warn about multiple inheritance for additional base class(es) */
while (base.item) { while (base.item) {
if (Getattr(base.item, "feature:interface")) { if (!GetFlag(base.item, "feature:ignore") && !Getattr(base.item, "feature:interface")) {
addInterfaceNameAndUpcasts(interface_list, interface_upcasts, base.item, c_classname);
} else if (!GetFlag(base.item, "feature:ignore")) {
String *proxyclassname = Getattr(n, "classtypeobj"); String *proxyclassname = Getattr(n, "classtypeobj");
String *baseclassname = Getattr(base.item, "name"); String *baseclassname = Getattr(base.item, "name");
Swig_warning(WARN_JAVA_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), Swig_warning(WARN_JAVA_MULTIPLE_INHERITANCE, Getfile(n), Getline(n),
@ -1811,10 +1826,9 @@ public:
} }
} }
} }
if (Getattr(n, "feature:interface")) {
addInterfaceNameAndUpcasts(interface_list, interface_upcasts, n, c_classname);
}
} }
collectInterfaceBases(interface_classes, n);
addInterfaceNameAndUpcasts(interface_list, interface_upcasts, interface_classes, c_classname);
bool derived = baseclass && getProxyName(c_baseclassname); bool derived = baseclass && getProxyName(c_baseclassname);
if (derived && purebase_notderived) if (derived && purebase_notderived)
@ -1988,11 +2002,12 @@ public:
if (List *baselist = Getattr(n, "bases")) { if (List *baselist = Getattr(n, "bases")) {
String* bases = 0; String* bases = 0;
for (Iterator base = First(baselist); base.item; base = Next(base)) { for (Iterator base = First(baselist); base.item; base = Next(base)) {
if (GetFlag(base.item, "feature:ignore") || !Getattr(base.item, "feature:interface")) if (GetFlag(base.item, "feature:ignore") || !Getattr(base.item, "feature:interface")) {
continue; // TODO: warn about skipped non-interface bases continue; // TODO: warn about skipped non-interface bases
}
String* base_iname = Getattr(base.item, "feature:interface:name"); String* base_iname = Getattr(base.item, "feature:interface:name");
if (!bases) if (!bases)
bases = NewStringf(" : %s", base_iname); bases = Copy(base_iname);
else { else {
Append(bases, ", "); Append(bases, ", ");
Append(bases, base_iname); Append(bases, base_iname);