Multiple inheritance warnings and ignored base classes fixes

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@7618 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
William S Fulton 2005-10-08 11:42:20 +00:00
commit 4bff2bc406
4 changed files with 76 additions and 54 deletions

View file

@ -1254,15 +1254,27 @@ class CSHARP : public Language {
List *baselist = Getattr(n,"bases"); List *baselist = Getattr(n,"bases");
if (baselist) { if (baselist) {
Iterator base = First(baselist); Iterator base = First(baselist);
c_baseclassname = Getattr(base.item,"name"); while(base.item && GetFlag(base.item,"feature:ignore")) {
baseclass = Copy(getProxyName(c_baseclassname)); base = Next(base);
if (baseclass){
c_baseclass = SwigType_namestr(Getattr(base.item,"name"));
} }
base = Next(base);
if (base.item) { if (base.item) {
Swig_warning(WARN_CSHARP_MULTIPLE_INHERITANCE, input_file, line_number, c_baseclassname = Getattr(base.item,"name");
"Warning for %s proxy: Base %s ignored. Multiple inheritance is not supported in C#.\n", typemap_lookup_type, Getattr(base.item,"name")); baseclass = Copy(getProxyName(c_baseclassname));
if (baseclass)
c_baseclass = SwigType_namestr(Getattr(base.item,"name"));
base = Next(base);
/* Warn about multiple inheritance for additional base class(es) */
while (base.item) {
if (GetFlag(base.item,"feature:ignore")) {
base = Next(base);
continue;
}
String *proxyclassname = SwigType_str(Getattr(n,"classtypeobj"),0);
String *baseclassname = SwigType_str(Getattr(base.item,"name"),0);
Swig_warning(WARN_CSHARP_MULTIPLE_INHERITANCE, input_file, line_number,
"Warning for %s proxy: Base %s ignored. Multiple inheritance is not supported in C#.\n", proxyclassname, baseclassname);
base = Next(base);
}
} }
} }

View file

@ -1494,15 +1494,27 @@ class JAVA : public Language {
List *baselist = Getattr(n,"bases"); List *baselist = Getattr(n,"bases");
if (baselist) { if (baselist) {
Iterator base = First(baselist); Iterator base = First(baselist);
c_baseclassname = Getattr(base.item,"name"); while(base.item && GetFlag(base.item,"feature:ignore")) {
baseclass = Copy(getProxyName(c_baseclassname)); base = Next(base);
if (baseclass){
c_baseclass = SwigType_namestr(Getattr(base.item,"name"));
} }
base = Next(base);
if (base.item) { if (base.item) {
Swig_warning(WARN_JAVA_MULTIPLE_INHERITANCE, input_file, line_number, c_baseclassname = Getattr(base.item,"name");
"Warning for %s proxy: Base %s ignored. Multiple inheritance is not supported in Java.\n", typemap_lookup_type, Getattr(base.item,"name")); baseclass = Copy(getProxyName(c_baseclassname));
if (baseclass)
c_baseclass = SwigType_namestr(Getattr(base.item,"name"));
base = Next(base);
/* Warn about multiple inheritance for additional base class(es) */
while (base.item) {
if (GetFlag(base.item,"feature:ignore")) {
base = Next(base);
continue;
}
String *proxyclassname = SwigType_str(Getattr(n,"classtypeobj"),0);
String *baseclassname = SwigType_str(Getattr(base.item,"name"),0);
Swig_warning(WARN_JAVA_MULTIPLE_INHERITANCE, input_file, line_number,
"Warning for %s proxy: Base %s ignored. Multiple inheritance is not supported in Java.\n", proxyclassname, baseclassname);
base = Next(base);
}
} }
} }

View file

@ -11,6 +11,8 @@
* Portions copyright Ananova Ltd (c) 2002 * Portions copyright Ananova Ltd (c) 2002
* Sam Liddicott <sam@ananova.com> * Sam Liddicott <sam@ananova.com>
* *
* TODO: Replace stderr messages with Swig_warning
*
*/ */
char cvsroot_php4_cxx[] = "$Header$"; char cvsroot_php4_cxx[] = "$Header$";
@ -81,8 +83,6 @@ static Hash *shadow_set_vars;
static int native_constructor=0; static int native_constructor=0;
static Hash *zend_types = 0; static Hash *zend_types = 0;
static String *this_shadow_baseclass = 0; //inheritance for shadow class from %pragma and cpp_inherit
static String *this_shadow_multinherit = 0;
static int shadow = 1; static int shadow = 1;
// These static variables are used to pass some state from Handlers into functionWrapper // These static variables are used to pass some state from Handlers into functionWrapper
@ -1385,6 +1385,7 @@ public:
if(shadow) { if(shadow) {
char *rename = GetChar(n, "sym:name"); char *rename = GetChar(n, "sym:name");
if (!addSymbol(rename,n)) return SWIG_ERROR; if (!addSymbol(rename,n)) return SWIG_ERROR;
shadow_classname = Swig_copy_string(rename); shadow_classname = Swig_copy_string(rename);
cs_entry = NewString(""); cs_entry = NewString("");
@ -1396,43 +1397,31 @@ public:
SWIG_exit(1); SWIG_exit(1);
} }
this_shadow_baseclass = NewString("");
this_shadow_multinherit = NewString("");
shadow_get_vars = NewHash(); shadow_get_vars = NewHash();
shadow_set_vars = NewHash(); shadow_set_vars = NewHash();
/* Deal with inheritance */ /* Deal with inheritance */
List *baselist = Getattr(n, "bases"); List *baselist = Getattr(n,"bases");
if (baselist) {
if(baselist) { Iterator base = First(baselist);
int class_count = 0; while(base.item && GetFlag(base.item,"feature:ignore")) {
Iterator base = First(baselist); base = Next(base);
while(base.item && GetFlag(base.item,"feature:ignore")) { }
base = Next(base); base = Next(base);
} if (base.item) {
/* Warn about multiple inheritance for additional base class(es) */
if (base.item && is_shadow(Getattr(base.item, "name"))) { while (base.item) {
class_count++; if (GetFlag(base.item,"feature:ignore")) {
Printf(this_shadow_baseclass, "%s", Getattr(base.item, "name")); base = Next(base);
} continue;
}
if (base.item) for(base = Next(base); base.item; base = Next(base)) { String *proxyclassname = SwigType_str(Getattr(n,"classtypeobj"),0);
if (GetFlag(base.item,"feature:ignore")) { String *baseclassname = SwigType_str(Getattr(base.item,"name"),0);
continue; Swig_warning(WARN_PHP4_MULTIPLE_INHERITANCE, input_file, line_number,
} "Warning for %s proxy: Base %s ignored. Multiple inheritance is not supported in Php4.\n", proxyclassname, baseclassname);
if(is_shadow(Getattr(base.item, "name"))) { base = Next(base);
class_count++; }
Printf(this_shadow_multinherit, "%s ", Getattr(base.item, "name")); }
}
}
if(class_count > 1) {
Printf(stderr,
"Error: %s inherits from multiple base classes(%s %s). "
"Multiple inheritance is not directly supported by PHP4, SWIG may support it at some point in the future.\n",
shadow_classname, base.item, this_shadow_multinherit);
}
} }
/* Write out class init code */ /* Write out class init code */
@ -1675,10 +1664,8 @@ public:
free(shadow_classname); free(shadow_classname);
shadow_classname = NULL; shadow_classname = NULL;
Delete(this_shadow_baseclass); this_shadow_baseclass = NULL;
Delete(shadow_set_vars); shadow_set_vars = NULL; Delete(shadow_set_vars); shadow_set_vars = NULL;
Delete(shadow_get_vars); shadow_get_vars = NULL; Delete(shadow_get_vars); shadow_get_vars = NULL;
Delete(this_shadow_multinherit); this_shadow_multinherit = NULL;
Printf(all_cs_entry,"%s { NULL, NULL, NULL}\n};\n",cs_entry); Printf(all_cs_entry,"%s { NULL, NULL, NULL}\n};\n",cs_entry);
//??delete cs_entry; //??delete cs_entry;

View file

@ -1676,6 +1676,9 @@ public:
List *baselist = Getattr(n,"bases"); List *baselist = Getattr(n,"bases");
if (baselist && Len(baselist)) { if (baselist && Len(baselist)) {
Iterator base = First(baselist); Iterator base = First(baselist);
while(base.item && GetFlag(base.item,"feature:ignore")) {
base = Next(base);
}
while (base.item) { while (base.item) {
String *basename = Getattr(base.item,"name"); String *basename = Getattr(base.item,"name");
String *basenamestr = SwigType_namestr(basename); String *basenamestr = SwigType_namestr(basename);
@ -1701,12 +1704,20 @@ public:
Delete(btype); Delete(btype);
} }
base = Next(base); base = Next(base);
while(base.item && GetFlag(base.item,"feature:ignore")) {
base = Next(base);
}
if (!multipleInheritance) { if (!multipleInheritance) {
/* Warn about multiple inheritance for additional base class(es) listed */ /* Warn about multiple inheritance for additional base class(es) */
while (base.item) { while (base.item) {
basename = Getattr(n,"name"); if (GetFlag(base.item,"feature:ignore")) {
base = Next(base);
continue;
}
String *proxyclassname = SwigType_str(Getattr(n,"classtypeobj"),0);
String *baseclassname = SwigType_str(Getattr(base.item,"name"),0);
Swig_warning(WARN_RUBY_MULTIPLE_INHERITANCE, input_file, line_number, Swig_warning(WARN_RUBY_MULTIPLE_INHERITANCE, input_file, line_number,
"Warning for %s: Base %s ignored. Multiple inheritance is not supported in Ruby.\n", basename, basename); "Warning for %s proxy: Base %s ignored. Multiple inheritance is not supported in Ruby.\n", proxyclassname, baseclassname);
base = Next(base); base = Next(base);
} }
} }