diff options
author | Brant K. Kyser <brantkyser@gmail.com> | 2013-01-10 13:28:37 -0600 |
---|---|---|
committer | William S Fulton <wsf@fultondesigns.co.uk> | 2013-01-17 08:13:03 +0000 |
commit | 3bdcb14117eec448bf2f77897d5706ebe0b555d3 (patch) | |
tree | 2a9460da2d717e83435a9db14b39f21469a5a906 | |
parent | dba0adce71def7257f6acdc1cb790be5f18c5c39 (diff) | |
download | swig-3bdcb14117eec448bf2f77897d5706ebe0b555d3.tar.gz |
Add jniclasspackage pragma & change error regarding use of nspace without -package to warning.
-rw-r--r-- | Source/Include/swigwarn.h | 1 | ||||
-rw-r--r-- | Source/Modules/java.cxx | 41 |
2 files changed, 33 insertions, 9 deletions
diff --git a/Source/Include/swigwarn.h b/Source/Include/swigwarn.h index 1aae86fdd..76f61ea93 100644 --- a/Source/Include/swigwarn.h +++ b/Source/Include/swigwarn.h @@ -241,6 +241,7 @@ #define WARN_JAVA_TYPEMAP_JAVACONSTRUCT_UNDEF 823 #define WARN_JAVA_TYPEMAP_DIRECTORIN_NODESC 824 #define WARN_JAVA_NO_DIRECTORCONNECT_ATTR 825 +#define WARN_JAVA_NSPACE_WITHOUT_PACKAGE 826 /* please leave 810-829 free for Java */ diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index 57ac7ca52..e9b6f813c 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -67,6 +67,7 @@ class JAVA:public Language { String *imclass_imports; //intermediary class imports from %pragma String *module_imports; //module imports from %pragma String *imclass_baseclass; //inheritance for intermediary class class from %pragma + String *imclass_class_package; //package in which to generate the jni class String *module_baseclass; //inheritance for module class from %pragma String *imclass_interfaces; //interfaces for intermediary class class from %pragma String *module_interfaces; //interfaces for module class from %pragma @@ -364,6 +365,7 @@ public: proxy_class_code = NewString(""); module_class_constants_code = NewString(""); imclass_baseclass = NewString(""); + imclass_class_package = NewString(""); imclass_interfaces = NewString(""); imclass_class_modifiers = NewString(""); module_class_code = NewString(""); @@ -444,7 +446,7 @@ public: } // Generate the intermediary class { - String *filen = NewStringf("%s%s.java", SWIG_output_directory(), imclass_name); + String *filen = NewStringf("%s%s/%s.java", SWIG_output_directory(), imclass_class_package, imclass_name); File *f_im = NewFile(filen, "w", SWIG_output_files()); if (!f_im) { FileErrorDisplay(filen); @@ -457,8 +459,10 @@ public: // Start writing out the intermediary class file emitBanner(f_im); - if (package) - Printf(f_im, "package %s;\n", package); + if (Len(imclass_class_package)) + Printf(f_im, "package %s;", imclass_class_package); + else if (package) + Printf(f_im, "package %s;\n", package); if (imclass_imports) Printf(f_im, "%s\n", imclass_imports); @@ -625,6 +629,8 @@ public: module_class_constants_code = NULL; Delete(imclass_baseclass); imclass_baseclass = NULL; + Delete(imclass_class_package); + imclass_class_package = NULL; Delete(imclass_interfaces); imclass_interfaces = NULL; Delete(imclass_class_modifiers); @@ -1186,8 +1192,7 @@ public: full_imclass_name = NewStringf("%s.%s", package, imclass_name); } else { String *name = Getattr(n, "name") ? Getattr(n, "name") : NewString("<unnamed>"); - Swig_error(Getfile(n), Getline(n), "The nspace feature used on '%s' is not supported unless a package is specified with -package - Java does not support types declared in a named package accessing types declared in an unnamed package.\n", name); - SWIG_exit(EXIT_FAILURE); + Swig_warning(WARN_JAVA_NSPACE_WITHOUT_PACKAGE, Getfile(n), Getline(n), "The nspace feature is used on '%s' without a package is specified with -package - This may result in generated code that does not compile as Java does not support types declared in a named package accessing types declared in an unnamed package.\n", name); } } } @@ -1574,7 +1579,8 @@ public: * pragmaDirective() * * Valid Pragmas: - * jniclassbase - base (extends) for the intermediary class + * jniclassbase - base (extends) for the intermediary + * jniclasspackage - package in which to generate the jni class * jniclassclassmodifiers - class modifiers for the intermediary class * jniclasscode - text (java code) is copied verbatim to the intermediary class * jniclassimports - import statements for the intermediary class @@ -1602,7 +1608,25 @@ public: if (Strcmp(code, "jniclassbase") == 0) { Delete(imclass_baseclass); imclass_baseclass = Copy(strvalue); - } else if (Strcmp(code, "jniclassclassmodifiers") == 0) { + } else if (Strcmp(code, "jniclasspackage") == 0) { + Delete(imclass_class_package); + imclass_class_package = Copy(strvalue); + String *imclass_class_package_jniname = makeValidJniName(imclass_class_package); + Printv(jnipackage, imclass_class_package_jniname, NIL); + Delete(imclass_class_package_jniname); + Replaceall(jnipackage, NSPACE_SEPARATOR, "_"); + Append(jnipackage, "_"); + + String *wrapper_name = NewString(""); + String *imclass_class_jniname = makeValidJniName(imclass_name); + Printf(wrapper_name, "Java_%s%s_%%f", jnipackage, imclass_class_jniname); + Delete(imclass_class_jniname); + + Swig_name_unregister("wrapper"); + Swig_name_register("wrapper", Char(wrapper_name)); + + Delete(wrapper_name); + } else if (Strcmp(code, "jniclassclassmodifiers") == 0) { Delete(imclass_class_modifiers); imclass_class_modifiers = Copy(strvalue); } else if (Strcmp(code, "jniclasscode") == 0) { @@ -1894,8 +1918,7 @@ public: full_imclass_name = NewStringf("%s.%s", package, imclass_name); } else { String *name = Getattr(n, "name") ? Getattr(n, "name") : NewString("<unnamed>"); - Swig_error(Getfile(n), Getline(n), "The nspace feature used on '%s' is not supported unless a package is specified with -package - Java does not support types declared in a named package accessing types declared in an unnamed package.\n", name); - SWIG_exit(EXIT_FAILURE); + Swig_warning(WARN_JAVA_NSPACE_WITHOUT_PACKAGE, Getfile(n), Getline(n), "The nspace feature is used on '%s' without a package is specified with -package - This may result in generated code that does not compile as Java does not support types declared in a named package accessing types declared in an unnamed package.\n", name); } } |