/tags/rel-2.0.1/Source/Modules/csharp.cxx
# · C++ · 1761 lines · 1257 code · 248 blank · 256 comment · 312 complexity · 342b4754cea09ac4873ab439710a62b9 MD5 · raw file
Large files are truncated click here to view the full file
- /* -----------------------------------------------------------------------------
- * This file is part of SWIG, which is licensed as a whole under version 3
- * (or any later version) of the GNU General Public License. Some additional
- * terms also apply to certain portions of SWIG. The full details of the SWIG
- * license and copyrights can be found in the LICENSE and COPYRIGHT files
- * included with the SWIG source code as distributed by the SWIG developers
- * and at http://www.swig.org/legal.html.
- *
- * csharp.cxx
- *
- * C# language module for SWIG.
- * ----------------------------------------------------------------------------- */
- char cvsroot_csharp_cxx[] = "$Id: csharp.cxx 12224 2010-09-20 19:11:55Z wsfulton $";
- #include "swigmod.h"
- #include <limits.h> // for INT_MAX
- #include "cparse.h"
- #include <ctype.h>
- /* Hash type used for upcalls from C/C++ */
- typedef DOH UpcallData;
- class CSHARP:public Language {
- static const char *usage;
- const String *empty_string;
- const String *public_string;
- const String *protected_string;
- Hash *swig_types_hash;
- File *f_begin;
- File *f_runtime;
- File *f_runtime_h;
- File *f_header;
- File *f_wrappers;
- File *f_init;
- File *f_directors;
- File *f_directors_h;
- List *filenames_list;
- bool proxy_flag; // Flag for generating proxy classes
- bool native_function_flag; // Flag for when wrapping a native function
- bool enum_constant_flag; // Flag for when wrapping an enum or constant
- bool static_flag; // Flag for when wrapping a static functions or member variables
- bool variable_wrapper_flag; // Flag for when wrapping a nonstatic member variable
- bool wrapping_member_flag; // Flag for when wrapping a member variable/enum/const
- bool global_variable_flag; // Flag for when wrapping a global variable
- bool old_variable_names; // Flag for old style variable names in the intermediary class
- bool generate_property_declaration_flag; // Flag for generating properties
- String *imclass_name; // intermediary class name
- String *module_class_name; // module class name
- String *imclass_class_code; // intermediary class code
- String *proxy_class_def;
- String *proxy_class_code;
- String *module_class_code;
- String *proxy_class_name; // proxy class name
- String *full_proxy_class_name;// fully qualified proxy class name when using nspace feature, otherwise same as proxy_class_name
- String *full_imclass_name; // fully qualified intermediary class name when using nspace feature, otherwise same as imclass_name
- String *variable_name; //Name of a variable being wrapped
- String *proxy_class_constants_code;
- String *module_class_constants_code;
- String *enum_code;
- String *dllimport; // DllImport attribute name
- String *namespce; // Optional namespace name
- 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 *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
- String *imclass_class_modifiers; //class modifiers for intermediary class overriden by %pragma
- String *module_class_modifiers; //class modifiers for module class overriden by %pragma
- String *upcasts_code; //C++ casts for inheritance hierarchies C++ code
- String *imclass_cppcasts_code; //C++ casts up inheritance hierarchies intermediary class code
- String *director_callback_typedefs; // Director function pointer typedefs for callbacks
- String *director_callbacks; // Director callback function pointer member variables
- String *director_delegate_callback; // Director callback method that delegates are set to call
- String *director_delegate_definitions; // Director delegates definitions in proxy class
- String *director_delegate_instances; // Director delegates member variables in proxy class
- String *director_method_types; // Director method types
- String *director_connect_parms; // Director delegates parameter list for director connect call
- String *destructor_call; //C++ destructor call if any
- // Director method stuff:
- List *dmethods_seq;
- Hash *dmethods_table;
- int n_dmethods;
- int n_directors;
- int first_class_dmethod;
- int curr_class_dmethod;
- enum EnumFeature { SimpleEnum, TypeunsafeEnum, TypesafeEnum, ProperEnum };
- public:
- /* -----------------------------------------------------------------------------
- * CSHARP()
- * ----------------------------------------------------------------------------- */
- CSHARP():empty_string(NewString("")),
- public_string(NewString("public")),
- protected_string(NewString("protected")),
- swig_types_hash(NULL),
- f_begin(NULL),
- f_runtime(NULL),
- f_runtime_h(NULL),
- f_header(NULL),
- f_wrappers(NULL),
- f_init(NULL),
- f_directors(NULL),
- f_directors_h(NULL),
- filenames_list(NULL),
- proxy_flag(true),
- native_function_flag(false),
- enum_constant_flag(false),
- static_flag(false),
- variable_wrapper_flag(false),
- wrapping_member_flag(false),
- global_variable_flag(false),
- old_variable_names(false),
- generate_property_declaration_flag(false),
- imclass_name(NULL),
- module_class_name(NULL),
- imclass_class_code(NULL),
- proxy_class_def(NULL),
- proxy_class_code(NULL),
- module_class_code(NULL),
- proxy_class_name(NULL),
- full_proxy_class_name(NULL),
- full_imclass_name(NULL),
- variable_name(NULL),
- proxy_class_constants_code(NULL),
- module_class_constants_code(NULL),
- enum_code(NULL),
- dllimport(NULL),
- namespce(NULL),
- imclass_imports(NULL),
- module_imports(NULL),
- imclass_baseclass(NULL),
- module_baseclass(NULL),
- imclass_interfaces(NULL),
- module_interfaces(NULL),
- imclass_class_modifiers(NULL),
- module_class_modifiers(NULL),
- upcasts_code(NULL),
- imclass_cppcasts_code(NULL),
- director_callback_typedefs(NULL),
- director_callbacks(NULL),
- director_delegate_callback(NULL),
- director_delegate_definitions(NULL),
- director_delegate_instances(NULL),
- director_method_types(NULL),
- director_connect_parms(NULL),
- destructor_call(NULL),
- dmethods_seq(NULL),
- dmethods_table(NULL),
- n_dmethods(0),
- n_directors(0) {
- /* for now, multiple inheritance in directors is disabled, this
- should be easy to implement though */
- director_multiple_inheritance = 0;
- director_language = 1;
- }
- /* -----------------------------------------------------------------------------
- * getProxyName()
- *
- * Test to see if a type corresponds to something wrapped with a proxy class.
- * Return NULL if not otherwise the proxy class name, fully qualified with
- * a namespace if the nspace feature is used.
- * ----------------------------------------------------------------------------- */
-
- String *getProxyName(SwigType *t) {
- String *proxyname = NULL;
- if (proxy_flag) {
- Node *n = classLookup(t);
- if (n) {
- proxyname = Getattr(n, "proxyname");
- if (!proxyname) {
- String *nspace = Getattr(n, "sym:nspace");
- String *symname = Getattr(n, "sym:name");
- if (nspace) {
- if (namespce)
- proxyname = NewStringf("%s.%s.%s", namespce, nspace, symname);
- else
- proxyname = NewStringf("%s.%s", nspace, symname);
- } else {
- proxyname = Copy(symname);
- }
- Setattr(n, "proxyname", proxyname);
- Delete(proxyname);
- }
- }
- }
- return proxyname;
- }
- /* -----------------------------------------------------------------------------
- * directorClassName()
- * ----------------------------------------------------------------------------- */
- String *directorClassName(Node *n) {
- String *dirclassname;
- const char *attrib = "director:classname";
- if (!(dirclassname = Getattr(n, attrib))) {
- String *classname = Getattr(n, "sym:name");
- dirclassname = NewStringf("SwigDirector_%s", classname);
- Setattr(n, attrib, dirclassname);
- }
- return dirclassname;
- }
- /* ------------------------------------------------------------
- * main()
- * ------------------------------------------------------------ */
- virtual void main(int argc, char *argv[]) {
- SWIG_library_directory("csharp");
- // Look for certain command line options
- for (int i = 1; i < argc; i++) {
- if (argv[i]) {
- if (strcmp(argv[i], "-dllimport") == 0) {
- if (argv[i + 1]) {
- dllimport = NewString("");
- Printf(dllimport, argv[i + 1]);
- Swig_mark_arg(i);
- Swig_mark_arg(i + 1);
- i++;
- } else {
- Swig_arg_error();
- }
- } else if (strcmp(argv[i], "-namespace") == 0) {
- if (argv[i + 1]) {
- namespce = NewString("");
- Printf(namespce, argv[i + 1]);
- if (Len(namespce) == 0) {
- Delete(namespce);
- namespce = 0;
- }
- Swig_mark_arg(i);
- Swig_mark_arg(i + 1);
- i++;
- } else {
- Swig_arg_error();
- }
- } else if ((strcmp(argv[i], "-noproxy") == 0)) {
- Swig_mark_arg(i);
- proxy_flag = false;
- } else if (strcmp(argv[i], "-oldvarnames") == 0) {
- Swig_mark_arg(i);
- old_variable_names = true;
- } else if (strcmp(argv[i], "-help") == 0) {
- Printf(stdout, "%s\n", usage);
- }
- }
- }
- // Add a symbol to the parser for conditional compilation
- Preprocessor_define("SWIGCSHARP 1", 0);
- // Add typemap definitions
- SWIG_typemap_lang("csharp");
- SWIG_config_file("csharp.swg");
- allow_overloading();
- }
- /* ---------------------------------------------------------------------
- * top()
- * --------------------------------------------------------------------- */
- virtual int top(Node *n) {
- // Get any options set in the module directive
- Node *optionsnode = Getattr(Getattr(n, "module"), "options");
- if (optionsnode) {
- if (Getattr(optionsnode, "imclassname"))
- imclass_name = Copy(Getattr(optionsnode, "imclassname"));
- /* check if directors are enabled for this module. note: this
- * is a "master" switch, without which no director code will be
- * emitted. %feature("director") statements are also required
- * to enable directors for individual classes or methods.
- *
- * use %module(directors="1") modulename at the start of the
- * interface file to enable director generation.
- */
- if (Getattr(optionsnode, "directors")) {
- allow_directors();
- }
- if (Getattr(optionsnode, "dirprot")) {
- allow_dirprot();
- }
- allow_allprotected(GetFlag(optionsnode, "allprotected"));
- }
- /* Initialize all of the output files */
- String *outfile = Getattr(n, "outfile");
- String *outfile_h = Getattr(n, "outfile_h");
- if (!outfile) {
- Printf(stderr, "Unable to determine outfile\n");
- SWIG_exit(EXIT_FAILURE);
- }
- f_begin = NewFile(outfile, "w", SWIG_output_files());
- if (!f_begin) {
- FileErrorDisplay(outfile);
- SWIG_exit(EXIT_FAILURE);
- }
- if (directorsEnabled()) {
- if (!outfile_h) {
- Printf(stderr, "Unable to determine outfile_h\n");
- SWIG_exit(EXIT_FAILURE);
- }
- f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files());
- if (!f_runtime_h) {
- FileErrorDisplay(outfile_h);
- SWIG_exit(EXIT_FAILURE);
- }
- }
- f_runtime = NewString("");
- f_init = NewString("");
- f_header = NewString("");
- f_wrappers = NewString("");
- f_directors_h = NewString("");
- f_directors = NewString("");
- /* Register file targets with the SWIG file handler */
- Swig_register_filebyname("header", f_header);
- Swig_register_filebyname("wrapper", f_wrappers);
- Swig_register_filebyname("begin", f_begin);
- Swig_register_filebyname("runtime", f_runtime);
- Swig_register_filebyname("init", f_init);
- Swig_register_filebyname("director", f_directors);
- Swig_register_filebyname("director_h", f_directors_h);
- swig_types_hash = NewHash();
- filenames_list = NewList();
- // Make the intermediary class and module class names. The intermediary class name can be set in the module directive.
- if (!imclass_name) {
- imclass_name = NewStringf("%sPINVOKE", Getattr(n, "name"));
- module_class_name = Copy(Getattr(n, "name"));
- } else {
- // Rename the module name if it is the same as intermediary class name - a backwards compatibility solution
- if (Cmp(imclass_name, Getattr(n, "name")) == 0)
- module_class_name = NewStringf("%sModule", Getattr(n, "name"));
- else
- module_class_name = Copy(Getattr(n, "name"));
- }
- // module class and intermediary classes are always created
- addSymbol(imclass_name, n);
- addSymbol(module_class_name, n);
- imclass_class_code = NewString("");
- proxy_class_def = NewString("");
- proxy_class_code = NewString("");
- module_class_constants_code = NewString("");
- imclass_baseclass = NewString("");
- imclass_interfaces = NewString("");
- imclass_class_modifiers = NewString("");
- module_class_code = NewString("");
- module_baseclass = NewString("");
- module_interfaces = NewString("");
- module_imports = NewString("");
- module_class_modifiers = NewString("");
- imclass_imports = NewString("");
- imclass_cppcasts_code = NewString("");
- director_connect_parms = NewString("");
- upcasts_code = NewString("");
- dmethods_seq = NewList();
- dmethods_table = NewHash();
- n_dmethods = 0;
- n_directors = 0;
- if (!dllimport)
- dllimport = Copy(module_class_name);
- Swig_banner(f_begin);
- Printf(f_runtime, "\n");
- Printf(f_runtime, "#define SWIGCSHARP\n");
- if (directorsEnabled()) {
- Printf(f_runtime, "#define SWIG_DIRECTORS\n");
- /* Emit initial director header and director code: */
- Swig_banner(f_directors_h);
- Printf(f_directors_h, "\n");
- Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", module_class_name);
- Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", module_class_name);
- Printf(f_directors, "\n\n");
- Printf(f_directors, "/* ---------------------------------------------------\n");
- Printf(f_directors, " * C++ director class methods\n");
- Printf(f_directors, " * --------------------------------------------------- */\n\n");
- if (outfile_h)
- Printf(f_directors, "#include \"%s\"\n\n", Swig_file_filename(outfile_h));
- }
- Printf(f_runtime, "\n");
- Swig_name_register("wrapper", "CSharp_%f");
- if (old_variable_names) {
- Swig_name_register("set", "set_%n%v");
- Swig_name_register("get", "get_%n%v");
- }
- Printf(f_wrappers, "\n#ifdef __cplusplus\n");
- Printf(f_wrappers, "extern \"C\" {\n");
- Printf(f_wrappers, "#endif\n\n");
- /* Emit code */
- Language::top(n);
- if (directorsEnabled()) {
- // Insert director runtime into the f_runtime file (make it occur before %header section)
- Swig_insert_file("director.swg", f_runtime);
- }
- // Generate the intermediary class
- {
- String *filen = NewStringf("%s%s.cs", SWIG_output_directory(), imclass_name);
- File *f_im = NewFile(filen, "w", SWIG_output_files());
- if (!f_im) {
- FileErrorDisplay(filen);
- SWIG_exit(EXIT_FAILURE);
- }
- Append(filenames_list, Copy(filen));
- Delete(filen);
- filen = NULL;
- // Start writing out the intermediary class file
- emitBanner(f_im);
- addOpenNamespace(0, f_im);
- if (imclass_imports)
- Printf(f_im, "%s\n", imclass_imports);
- if (Len(imclass_class_modifiers) > 0)
- Printf(f_im, "%s ", imclass_class_modifiers);
- Printf(f_im, "%s ", imclass_name);
- if (imclass_baseclass && *Char(imclass_baseclass))
- Printf(f_im, ": %s ", imclass_baseclass);
- if (Len(imclass_interfaces) > 0)
- Printv(f_im, "implements ", imclass_interfaces, " ", NIL);
- Printf(f_im, "{\n");
- // Add the intermediary class methods
- Replaceall(imclass_class_code, "$module", module_class_name);
- Replaceall(imclass_class_code, "$imclassname", imclass_name);
- Replaceall(imclass_class_code, "$dllimport", dllimport);
- Printv(f_im, imclass_class_code, NIL);
- Printv(f_im, imclass_cppcasts_code, NIL);
- // Finish off the class
- Printf(f_im, "}\n");
- addCloseNamespace(0, f_im);
- Close(f_im);
- }
- // Generate the C# module class
- {
- String *filen = NewStringf("%s%s.cs", SWIG_output_directory(), module_class_name);
- File *f_module = NewFile(filen, "w", SWIG_output_files());
- if (!f_module) {
- FileErrorDisplay(filen);
- SWIG_exit(EXIT_FAILURE);
- }
- Append(filenames_list, Copy(filen));
- Delete(filen);
- filen = NULL;
- // Start writing out the module class file
- emitBanner(f_module);
- addOpenNamespace(0, f_module);
- if (module_imports)
- Printf(f_module, "%s\n", module_imports);
- if (Len(module_class_modifiers) > 0)
- Printf(f_module, "%s ", module_class_modifiers);
- Printf(f_module, "%s ", module_class_name);
- if (module_baseclass && *Char(module_baseclass))
- Printf(f_module, ": %s ", module_baseclass);
- if (Len(module_interfaces) > 0)
- Printv(f_module, "implements ", module_interfaces, " ", NIL);
- Printf(f_module, "{\n");
- Replaceall(module_class_code, "$module", module_class_name);
- Replaceall(module_class_constants_code, "$module", module_class_name);
- Replaceall(module_class_code, "$imclassname", imclass_name);
- Replaceall(module_class_constants_code, "$imclassname", imclass_name);
- Replaceall(module_class_code, "$dllimport", dllimport);
- Replaceall(module_class_constants_code, "$dllimport", dllimport);
- // Add the wrapper methods
- Printv(f_module, module_class_code, NIL);
- // Write out all the global constants
- Printv(f_module, module_class_constants_code, NIL);
- // Finish off the class
- Printf(f_module, "}\n");
- addCloseNamespace(0, f_module);
- Close(f_module);
- }
- if (upcasts_code)
- Printv(f_wrappers, upcasts_code, NIL);
- Printf(f_wrappers, "#ifdef __cplusplus\n");
- Printf(f_wrappers, "}\n");
- Printf(f_wrappers, "#endif\n");
- // Output a C# type wrapper class for each SWIG type
- for (Iterator swig_type = First(swig_types_hash); swig_type.key; swig_type = Next(swig_type)) {
- emitTypeWrapperClass(swig_type.key, swig_type.item);
- }
- // Check for overwriting file problems on filesystems that are case insensitive
- Iterator it1;
- Iterator it2;
- for (it1 = First(filenames_list); it1.item; it1 = Next(it1)) {
- String *item1_lower = Swig_string_lower(it1.item);
- for (it2 = Next(it1); it2.item; it2 = Next(it2)) {
- String *item2_lower = Swig_string_lower(it2.item);
- if (it1.item && it2.item) {
- if (Strcmp(item1_lower, item2_lower) == 0) {
- Swig_warning(WARN_LANG_PORTABILITY_FILENAME, input_file, line_number,
- "Portability warning: File %s will be overwritten by %s on case insensitive filesystems such as "
- "Windows' FAT32 and NTFS unless the class/module name is renamed\n", it1.item, it2.item);
- }
- }
- Delete(item2_lower);
- }
- Delete(item1_lower);
- }
- Delete(swig_types_hash);
- swig_types_hash = NULL;
- Delete(filenames_list);
- filenames_list = NULL;
- Delete(imclass_name);
- imclass_name = NULL;
- Delete(imclass_class_code);
- imclass_class_code = NULL;
- Delete(proxy_class_def);
- proxy_class_def = NULL;
- Delete(proxy_class_code);
- proxy_class_code = NULL;
- Delete(module_class_constants_code);
- module_class_constants_code = NULL;
- Delete(imclass_baseclass);
- imclass_baseclass = NULL;
- Delete(imclass_interfaces);
- imclass_interfaces = NULL;
- Delete(imclass_class_modifiers);
- imclass_class_modifiers = NULL;
- Delete(module_class_name);
- module_class_name = NULL;
- Delete(module_class_code);
- module_class_code = NULL;
- Delete(module_baseclass);
- module_baseclass = NULL;
- Delete(module_interfaces);
- module_interfaces = NULL;
- Delete(module_imports);
- module_imports = NULL;
- Delete(module_class_modifiers);
- module_class_modifiers = NULL;
- Delete(imclass_imports);
- imclass_imports = NULL;
- Delete(imclass_cppcasts_code);
- imclass_cppcasts_code = NULL;
- Delete(upcasts_code);
- upcasts_code = NULL;
- Delete(dmethods_seq);
- dmethods_seq = NULL;
- Delete(dmethods_table);
- dmethods_table = NULL;
- Delete(namespce);
- namespce = NULL;
- n_dmethods = 0;
- /* Close all of the files */
- Dump(f_runtime, f_begin);
- Dump(f_header, f_begin);
- if (directorsEnabled()) {
- Dump(f_directors, f_begin);
- Dump(f_directors_h, f_runtime_h);
- Printf(f_runtime_h, "\n");
- Printf(f_runtime_h, "#endif\n");
- Close(f_runtime_h);
- Delete(f_runtime_h);
- f_runtime_h = NULL;
- Delete(f_directors);
- f_directors = NULL;
- Delete(f_directors_h);
- f_directors_h = NULL;
- }
- Dump(f_wrappers, f_begin);
- Wrapper_pretty_print(f_init, f_begin);
- Delete(f_header);
- Delete(f_wrappers);
- Delete(f_init);
- Close(f_begin);
- Delete(f_runtime);
- Delete(f_begin);
- return SWIG_OK;
- }
- /* -----------------------------------------------------------------------------
- * emitBanner()
- * ----------------------------------------------------------------------------- */
- void emitBanner(File *f) {
- Printf(f, "/* ----------------------------------------------------------------------------\n");
- Swig_banner_target_lang(f, " *");
- Printf(f, " * ----------------------------------------------------------------------------- */\n\n");
- }
- /*-----------------------------------------------------------------------
- * Add new director upcall signature
- *----------------------------------------------------------------------*/
- UpcallData *addUpcallMethod(String *imclass_method, String *class_method, String *decl, String *overloaded_name) {
- UpcallData *udata;
- String *imclass_methodidx;
- String *class_methodidx;
- Hash *new_udata;
- String *key = NewStringf("%s|%s", imclass_method, decl);
- ++curr_class_dmethod;
- /* Do we know about this director class already? */
- if ((udata = Getattr(dmethods_table, key))) {
- Delete(key);
- return Getattr(udata, "methodoff");
- }
- imclass_methodidx = NewStringf("%d", n_dmethods);
- class_methodidx = NewStringf("%d", n_dmethods - first_class_dmethod);
- n_dmethods++;
- new_udata = NewHash();
- Append(dmethods_seq, new_udata);
- Setattr(dmethods_table, key, new_udata);
- Setattr(new_udata, "method", Copy(class_method));
- // TODO: remove fdesc
- // Setattr(new_udata, "fdesc", Copy(class_desc));
- // Setattr(new_udata, "imclass_method", Copy(imclass_method));
- // Setattr(new_udata, "imclass_methodidx", imclass_methodidx);
- Setattr(new_udata, "class_methodidx", class_methodidx);
- Setattr(new_udata, "decl", Copy(decl));
- Setattr(new_udata, "overname", Copy(overloaded_name));
- Delete(key);
- return new_udata;
- }
- /*-----------------------------------------------------------------------
- * Get director upcall signature
- *----------------------------------------------------------------------*/
- /*
- UpcallData * getUpcallMethodData(String *director_class, String *decl) {
- String *key = NewStringf("%s|%s", director_class, decl);
- UpcallData *udata = Getattr(dmethods_table, key);
- Delete(key);
- return udata;
- }
- */
- /* ----------------------------------------------------------------------
- * nativeWrapper()
- * ---------------------------------------------------------------------- */
- virtual int nativeWrapper(Node *n) {
- String *wrapname = Getattr(n, "wrap:name");
- if (!addSymbol(wrapname, n, imclass_name))
- return SWIG_ERROR;
- if (Getattr(n, "type")) {
- Swig_save("nativeWrapper", n, "name", NIL);
- Setattr(n, "name", wrapname);
- native_function_flag = true;
- functionWrapper(n);
- Swig_restore(n);
- native_function_flag = false;
- } else {
- Swig_error(input_file, line_number, "No return type for %%native method %s.\n", Getattr(n, "wrap:name"));
- }
- return SWIG_OK;
- }
- /* ----------------------------------------------------------------------
- * functionWrapper()
- * ---------------------------------------------------------------------- */
- virtual int functionWrapper(Node *n) {
- String *symname = Getattr(n, "sym:name");
- SwigType *t = Getattr(n, "type");
- ParmList *l = Getattr(n, "parms");
- String *tm;
- Parm *p;
- int i;
- String *c_return_type = NewString("");
- String *im_return_type = NewString("");
- String *cleanup = NewString("");
- String *outarg = NewString("");
- String *body = NewString("");
- String *im_outattributes = 0;
- int num_arguments = 0;
- int num_required = 0;
- bool is_void_return;
- String *overloaded_name = getOverloadedName(n);
- if (!Getattr(n, "sym:overloaded")) {
- if (!addSymbol(Getattr(n, "sym:name"), n, imclass_name))
- return SWIG_ERROR;
- }
- /*
- The rest of this function deals with generating the intermediary class wrapper function (that wraps
- a c/c++ function) and generating the PInvoke c code. Each C# wrapper function has a
- matching PInvoke c function call.
- */
- // A new wrapper function object
- Wrapper *f = NewWrapper();
- // Make a wrapper name for this function
- String *wname = Swig_name_wrapper(overloaded_name);
- /* Attach the non-standard typemaps to the parameter list. */
- Swig_typemap_attach_parms("ctype", l, f);
- Swig_typemap_attach_parms("imtype", l, f);
- /* Get return types */
- if ((tm = Swig_typemap_lookup("ctype", n, "", 0))) {
- String *ctypeout = Getattr(n, "tmap:ctype:out"); // the type in the ctype typemap's out attribute overrides the type in the typemap
- if (ctypeout)
- tm = ctypeout;
- Printf(c_return_type, "%s", tm);
- } else {
- Swig_warning(WARN_CSHARP_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(t, 0));
- }
- if ((tm = Swig_typemap_lookup("imtype", n, "", 0))) {
- String *imtypeout = Getattr(n, "tmap:imtype:out"); // the type in the imtype typemap's out attribute overrides the type in the typemap
- if (imtypeout)
- tm = imtypeout;
- Printf(im_return_type, "%s", tm);
- im_outattributes = Getattr(n, "tmap:imtype:outattributes");
- } else {
- Swig_warning(WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(t, 0));
- }
- is_void_return = (Cmp(c_return_type, "void") == 0);
- if (!is_void_return)
- Wrapper_add_localv(f, "jresult", c_return_type, "jresult", NIL);
- Printv(f->def, " SWIGEXPORT ", c_return_type, " SWIGSTDCALL ", wname, "(", NIL);
- // Emit all of the local variables for holding arguments.
- emit_parameter_variables(l, f);
- /* Attach the standard typemaps */
- emit_attach_parmmaps(l, f);
- // Parameter overloading
- Setattr(n, "wrap:parms", l);
- Setattr(n, "wrap:name", wname);
- // Wrappers not wanted for some methods where the parameters cannot be overloaded in C#
- if (Getattr(n, "sym:overloaded")) {
- // Emit warnings for the few cases that can't be overloaded in C# and give up on generating wrapper
- Swig_overload_check(n);
- if (Getattr(n, "overload:ignore"))
- return SWIG_OK;
- }
- Printv(imclass_class_code, "\n [DllImport(\"", dllimport, "\", EntryPoint=\"", wname, "\")]\n", NIL);
- if (im_outattributes)
- Printf(imclass_class_code, " %s\n", im_outattributes);
- Printf(imclass_class_code, " public static extern %s %s(", im_return_type, overloaded_name);
- /* Get number of required and total arguments */
- num_arguments = emit_num_arguments(l);
- num_required = emit_num_required(l);
- int gencomma = 0;
- // Now walk the function parameter list and generate code to get arguments
- for (i = 0, p = l; i < num_arguments; i++) {
- while (checkAttribute(p, "tmap:in:numinputs", "0")) {
- p = Getattr(p, "tmap:in:next");
- }
- SwigType *pt = Getattr(p, "type");
- String *ln = Getattr(p, "lname");
- String *im_param_type = NewString("");
- String *c_param_type = NewString("");
- String *arg = NewString("");
- Printf(arg, "j%s", ln);
- /* Get the ctype types of the parameter */
- if ((tm = Getattr(p, "tmap:ctype"))) {
- Printv(c_param_type, tm, NIL);
- } else {
- Swig_warning(WARN_CSHARP_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(pt, 0));
- }
- /* Get the intermediary class parameter types of the parameter */
- if ((tm = Getattr(p, "tmap:imtype"))) {
- const String *inattributes = Getattr(p, "tmap:imtype:inattributes");
- Printf(im_param_type, "%s%s", inattributes ? inattributes : empty_string, tm);
- } else {
- Swig_warning(WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(pt, 0));
- }
- /* Add parameter to intermediary class method */
- if (gencomma)
- Printf(imclass_class_code, ", ");
- Printf(imclass_class_code, "%s %s", im_param_type, arg);
- // Add parameter to C function
- Printv(f->def, gencomma ? ", " : "", c_param_type, " ", arg, NIL);
- gencomma = 1;
- // Get typemap for this argument
- if ((tm = Getattr(p, "tmap:in"))) {
- canThrow(n, "in", p);
- Replaceall(tm, "$source", arg); /* deprecated */
- Replaceall(tm, "$target", ln); /* deprecated */
- Replaceall(tm, "$arg", arg); /* deprecated? */
- Replaceall(tm, "$input", arg);
- Setattr(p, "emit:input", arg);
- Printf(f->code, "%s\n", tm);
- p = Getattr(p, "tmap:in:next");
- } else {
- Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0));
- p = nextSibling(p);
- }
- Delete(im_param_type);
- Delete(c_param_type);
- Delete(arg);
- }
- /* Insert constraint checking code */
- for (p = l; p;) {
- if ((tm = Getattr(p, "tmap:check"))) {
- canThrow(n, "check", p);
- Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */
- Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */
- Replaceall(tm, "$input", Getattr(p, "emit:input"));
- Printv(f->code, tm, "\n", NIL);
- p = Getattr(p, "tmap:check:next");
- } else {
- p = nextSibling(p);
- }
- }
- /* Insert cleanup code */
- for (p = l; p;) {
- if ((tm = Getattr(p, "tmap:freearg"))) {
- canThrow(n, "freearg", p);
- Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */
- Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */
- Replaceall(tm, "$input", Getattr(p, "emit:input"));
- Printv(cleanup, tm, "\n", NIL);
- p = Getattr(p, "tmap:freearg:next");
- } else {
- p = nextSibling(p);
- }
- }
- /* Insert argument output code */
- for (p = l; p;) {
- if ((tm = Getattr(p, "tmap:argout"))) {
- canThrow(n, "argout", p);
- Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */
- Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */
- Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */
- Replaceall(tm, "$result", "jresult");
- Replaceall(tm, "$input", Getattr(p, "emit:input"));
- Printv(outarg, tm, "\n", NIL);
- p = Getattr(p, "tmap:argout:next");
- } else {
- p = nextSibling(p);
- }
- }
- // Look for usage of throws typemap and the canthrow flag
- ParmList *throw_parm_list = NULL;
- if ((throw_parm_list = Getattr(n, "catchlist"))) {
- Swig_typemap_attach_parms("throws", throw_parm_list, f);
- for (p = throw_parm_list; p; p = nextSibling(p)) {
- if ((tm = Getattr(p, "tmap:throws"))) {
- canThrow(n, "throws", p);
- }
- }
- }
- String *null_attribute = 0;
- // Now write code to make the function call
- if (!native_function_flag) {
- if (Cmp(nodeType(n), "constant") == 0) {
- // Wrapping a constant hack
- Swig_save("functionWrapper", n, "wrap:action", NIL);
- // below based on Swig_VargetToFunction()
- SwigType *ty = Swig_wrapped_var_type(Getattr(n, "type"), use_naturalvar_mode(n));
- Setattr(n, "wrap:action", NewStringf("result = (%s)(%s);", SwigType_lstr(ty, 0), Getattr(n, "value")));
- }
- Swig_director_emit_dynamic_cast(n, f);
- String *actioncode = emit_action(n);
- if (Cmp(nodeType(n), "constant") == 0)
- Swig_restore(n);
- /* Return value if necessary */
- if ((tm = Swig_typemap_lookup_out("out", n, "result", f, actioncode))) {
- canThrow(n, "out", n);
- Replaceall(tm, "$source", "result"); /* deprecated */
- Replaceall(tm, "$target", "jresult"); /* deprecated */
- Replaceall(tm, "$result", "jresult");
- if (GetFlag(n, "feature:new"))
- Replaceall(tm, "$owner", "1");
- else
- Replaceall(tm, "$owner", "0");
- Printf(f->code, "%s", tm);
- null_attribute = Getattr(n, "tmap:out:null");
- if (Len(tm))
- Printf(f->code, "\n");
- } else {
- Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), Getattr(n, "name"));
- }
- emit_return_variable(n, t, f);
- }
- /* Output argument output code */
- Printv(f->code, outarg, NIL);
- /* Output cleanup code */
- Printv(f->code, cleanup, NIL);
- /* Look to see if there is any newfree cleanup code */
- if (GetFlag(n, "feature:new")) {
- if ((tm = Swig_typemap_lookup("newfree", n, "result", 0))) {
- canThrow(n, "newfree", n);
- Replaceall(tm, "$source", "result"); /* deprecated */
- Printf(f->code, "%s\n", tm);
- }
- }
- /* See if there is any return cleanup code */
- if (!native_function_flag) {
- if ((tm = Swig_typemap_lookup("ret", n, "result", 0))) {
- canThrow(n, "ret", n);
- Replaceall(tm, "$source", "result"); /* deprecated */
- Printf(f->code, "%s\n", tm);
- }
- }
- /* Finish C function and intermediary class function definitions */
- Printf(imclass_class_code, ")");
- Printf(imclass_class_code, ";\n");
- Printf(f->def, ") {");
- if (!is_void_return)
- Printv(f->code, " return jresult;\n", NIL);
- Printf(f->code, "}\n");
- /* Substitute the cleanup code */
- Replaceall(f->code, "$cleanup", cleanup);
- /* Substitute the function name */
- Replaceall(f->code, "$symname", symname);
- /* Contract macro modification */
- if (Replaceall(f->code, "SWIG_contract_assert(", "SWIG_contract_assert($null, ") > 0) {
- Setattr(n, "csharp:canthrow", "1");
- }
- if (!null_attribute)
- Replaceall(f->code, "$null", "0");
- else
- Replaceall(f->code, "$null", null_attribute);
- /* Dump the function out */
- if (!native_function_flag) {
- Wrapper_print(f, f_wrappers);
- // Handle %csexception which sets the canthrow attribute
- if (Getattr(n, "feature:except:canthrow"))
- Setattr(n, "csharp:canthrow", "1");
- // A very simple check (it is not foolproof) to help typemap/feature writers for
- // throwing C# exceptions from unmanaged code. It checks for the common methods which
- // set a pending C# exception... the 'canthrow' typemap/feature attribute must be set
- // so that code which checks for pending exceptions is added in the C# proxy method.
- if (!Getattr(n, "csharp:canthrow")) {
- if (Strstr(f->code, "SWIG_exception")) {
- Swig_warning(WARN_CSHARP_CANTHROW, input_file, line_number,
- "Unmanaged code contains a call to SWIG_exception and C# code does not handle pending exceptions via the canthrow attribute.\n");
- } else if (Strstr(f->code, "SWIG_CSharpSetPendingException")) {
- Swig_warning(WARN_CSHARP_CANTHROW, input_file, line_number,
- "Unmanaged code contains a call to a SWIG_CSharpSetPendingException method and C# code does not handle pending exceptions via the canthrow attribute.\n");
- }
- }
- }
- if (!(proxy_flag && is_wrapping_class()) && !enum_constant_flag) {
- moduleClassFunctionHandler(n);
- }
- /*
- * Generate the proxy class properties for public member variables.
- * Not for enums and constants.
- */
- if (proxy_flag && wrapping_member_flag && !enum_constant_flag) {
- // Capitalize the first letter in the variable in the getter/setter function name
- bool getter_flag = Cmp(symname, Swig_name_set(getNSpace(), Swig_name_member(0, proxy_class_name, variable_name))) != 0;
- String *getter_setter_name = NewString("");
- if (!getter_flag)
- Printf(getter_setter_name, "set");
- else
- Printf(getter_setter_name, "get");
- Putc(toupper((int) *Char(variable_name)), getter_setter_name);
- Printf(getter_setter_name, "%s", Char(variable_name) + 1);
- Setattr(n, "proxyfuncname", getter_setter_name);
- Setattr(n, "imfuncname", symname);
- proxyClassFunctionHandler(n);
- Delete(getter_setter_name);
- }
- Delete(c_return_type);
- Delete(im_return_type);
- Delete(cleanup);
- Delete(outarg);
- Delete(body);
- Delete(overloaded_name);
- DelWrapper(f);
- return SWIG_OK;
- }
- /* -----------------------------------------------------------------------
- * variableWrapper()
- * ----------------------------------------------------------------------- */
- virtual int variableWrapper(Node *n) {
- Language::variableWrapper(n);
- return SWIG_OK;
- }
- /* -----------------------------------------------------------------------
- * globalvariableHandler()
- * ------------------------------------------------------------------------ */
- virtual int globalvariableHandler(Node *n) {
- generate_property_declaration_flag = true;
- variable_name = Getattr(n, "sym:name");
- global_variable_flag = true;
- int ret = Language::globalvariableHandler(n);
- global_variable_flag = false;
- generate_property_declaration_flag = false;
- if (proxy_flag) {
- Printf(module_class_code, "\n }\n\n");
- }
- return ret;
- }
- /* ----------------------------------------------------------------------
- * enumDeclaration()
- *
- * C/C++ enums can be mapped in one of 4 ways, depending on the cs:enum feature specified:
- * 1) Simple enums - simple constant within the proxy class or module class
- * 2) Typeunsafe enums - simple constant in a C# class (class named after the c++ enum name)
- * 3) Typesafe enum - typesafe enum pattern (class named after the c++ enum name)
- * 4) Proper enums - proper C# enum
- * Anonymous enums always default to 1)
- * ---------------------------------------------------------------------- */
- virtual int enumDeclaration(Node *n) {
- if (!ImportMode) {
- if (getCurrentClass() && (cplus_mode != PUBLIC))
- return SWIG_NOWRAP;
- String *nspace = Getattr(n, "sym:nspace"); // NSpace/getNSpace() only works during Language::enumDeclaration call
- if (proxy_flag && !is_wrapping_class()) {
- // Global enums / enums in a namespace
- assert(!full_imclass_name);
- if (!nspace) {
- full_imclass_name = NewStringf("%s", imclass_name);
- } else {
- if (namespce) {
- full_imclass_name = NewStringf("%s.%s", namespce, imclass_name);
- } else {
- full_imclass_name = NewStringf("%s", imclass_name);
- }
- }
- }
- enum_code = NewString("");
- String *symname = Getattr(n, "sym:name");
- String *constants_code = (proxy_flag && is_wrapping_class())? proxy_class_constants_code : module_class_constants_code;
- EnumFeature enum_feature = decodeEnumFeature(n);
- String *typemap_lookup_type = Getattr(n, "name");
- if ((enum_feature != SimpleEnum) && symname && typemap_lookup_type) {
- // Wrap (non-anonymous) C/C++ enum within a typesafe, typeunsafe or proper C# enum
- String *scope = 0;
- if (nspace || proxy_class_name) {
- scope = NewString("");
- if (nspace)
- Printf(scope, "%s", nspace);
- if (proxy_class_name)
- Printv(scope, nspace ? "." : "", proxy_class_name, NIL);
- }
- if (!addSymbol(symname, n, scope))
- return SWIG_ERROR;
- // Pure C# baseclass and interfaces
- const String *pure_baseclass = typemapLookup(n, "csbase", typemap_lookup_type, WARN_NONE);
- const String *pure_interfaces = typemapLookup(n, "csinterfaces", typemap_lookup_type, WARN_NONE);
- // Class attributes
- const String *csattributes = typemapLookup(n, "csattributes", typemap_lookup_type, WARN_NONE);
- if (csattributes && *Char(csattributes))
- Printf(enum_code, "%s\n", csattributes);
- // Emit the enum
- Printv(enum_code, typemapLookup(n, "csclassmodifiers", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers (enum modifiers really)
- " ", symname, (*Char(pure_baseclass) || *Char(pure_interfaces)) ? " : " : "", pure_baseclass, ((*Char(pure_baseclass)) && *Char(pure_interfaces)) ? // Interfaces
- ", " : "", pure_interfaces, " {\n", NIL);
- Delete(scope);
- } else {
- // Wrap C++ enum with integers - just indicate start of enum with a comment, no comment for anonymous enums of any sort
- if (symname && !Getattr(n, "unnamedinstance"))
- Printf(constants_code, " // %s \n", symname);
- }
- // Emit each enum item
- Language::enumDeclaration(n);
- if ((enum_feature != SimpleEnum) && symname && typemap_lookup_type) {
- // Wrap (non-anonymous) C/C++ enum within a typesafe, typeunsafe or proper C# enum
- // Finish the enum declaration
- // Typemaps are used to generate the enum definition in a similar manner to proxy classes.
- Printv(enum_code, (enum_feature == ProperEnum) ? "\n" : typemapLookup(n, "csbody", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CSBODY_UNDEF), // main body of class
- typemapLookup(n, "cscode", typemap_lookup_type, WARN_NONE), // extra C# code
- "}", NIL);
- Replaceall(enum_code, "$csclassname", symname);
- // Substitute $enumvalues - intended usage is for typesafe enums
- if (Getattr(n, "enumvalues"))
- Replaceall(enum_code, "$enumvalues", Getattr(n, "enumvalues"));
- else
- Replaceall(enum_code, "$enumvalues", "");
- if (proxy_flag && is_wrapping_class()) {
- // Enums defined within the C++ class are defined within the proxy class
- // Add extra indentation
- Replaceall(enum_code, "\n", "\n ");
- Replaceall(enum_code, " \n", "\n");
- Printv(proxy_class_constants_code, " ", enum_code, "\n\n", NIL);
- } else {
- // Global enums are defined in their own file
- String *output_directory = outputDirectory(nspace);
- String *filen = NewStringf("%s%s.cs", output_directory, symname);
- File *f_enum = NewFile(filen, "w", SWIG_output_files());
- if (!f_enum) {
- FileErrorDisplay(filen);
- SWIG_exit(EXIT_FAILURE);
- }
- Append(filenames_list, Copy(filen));
- Delete(filen);
- filen = NULL;
- // Start writing out the enum file
- emitBanner(f_enum);
- addOpenNamespace(nspace, f_enum);
- Printv(f_enum, typemapLookup(n, "csimports", typemap_lookup_type, WARN_NONE), // Import statements
- "\n", enum_code, "\n", NIL);
- addCloseNamespace(nspace, f_enum);
- Close(f_enum);
- Delete(output_directory);
- }
- } else {
- // Wrap C++ enum with simple constant
- Printf(enum_code, "\n");
- if (proxy_flag && is_wrapping_class())
- Printv(proxy_class_constants_code, enum_code, NIL);
- else
- Printv(module_class_constants_code, enum_code, NIL);
- }
- Delete(enum_code);
- enum_code = NULL;
- if (proxy_flag && !is_wrapping_class()) {
- Delete(full_imclass_name);
- full_imclass_name = 0;
- }
- }
- return SWIG_OK;
- }
- /* ----------------------------------------------------------------------
- * enumvalueDeclaration()
- * ---------------------------------------------------------------------- */
- virtual int enumvalueDeclaration(Node *n) {
- if (getCurrentClass() && (cplus_mode != PUBLIC))
- return SWIG_NOWRAP;
- Swig_require("enumvalueDeclaration", n, "*name", "?value", NIL);
- String *symname = Getattr(n, "sym:name");
- String *value = Getattr(n, "value");
- String *name = Getattr(n, "name");
- Node *parent = parentNode(n);
- int unnamedinstance = GetFlag(parent, "unnamedinstance");
- String *parent_name = Getattr(parent, "name");
- String *nspace = getNSpace();
- String *tmpValue;
- // Strange hack from parent method
- if (value)
- tmpValue = NewString(value);
- else
- tmpValue = NewString(name);
- // Note that this is used in enumValue() amongst other places
- Setattr(n, "value", tmpValue);
- // Deal with enum values that are bools
- if (SwigType_type(Getattr(n, "type")) == T_BOOL) {
- String *boolValue = NewStringf("%s ? 1 : 0", Getattr(n, "enumvalue"));
- Setattr(n, "enumvalue", boolValue);
- Delete(boolValue);
- }
- {
- EnumFeature enum_feature = decodeEnumFeature(parent);
- // Add to language symbol table
- String *scope = 0;
- if (unnamedinstance || !parent_name || enum_feature == SimpleEnum) {
- if (proxy_class_name) {
- scope = NewString("");
- if (nspace)
- Printf(scope, "%s.", nspace);
- Printf(scope, "%s", proxy_class_name);
- } else {
- scope = Copy(module_class_name);
- }
- } else {
- scope = NewString("");
- if (nspace)
- Printf(scope, "%s.", nspace);
- if (proxy_class_name)
- Printf(scope, "%s.", proxy_class_name);
- Printf(scope, "%s",Getattr(parent, "sym:name"));
- }
- if (!addSymbol(name, n, scope))
- return SWIG_ERROR;
- const String *csattributes = Getattr(n, "feature:cs:attributes");
- if ((enum_feature == ProperEnum) && parent_name && !unnamedinstance) {
- // Wrap (non-anonymous) C/C++ enum with a proper C# enum
- // Emit the enum item.
- if (!GetFlag(n, "firstenumitem"))
- Printf(enum_code, ",\n");
- if (csattributes)
- Printf(enum_code, " %s\n", csattributes);
- Printf(enum_code, " %s", symname);
- // Check for the %csconstvalue feature
- String *value = Getattr(n, "feature:cs:constvalue");
- // Note that the enum value must be a true constant and cannot be set from a PINVOKE call, thus no support for %csconst(0)
- value = value ? value : Getattr(n, "enumvalue");
- if (value) {
- Printf(enum_code, " = %s", value);
- }
- } else {
- // Wrap C/C++ enums with constant integers or use the typesafe enum pattern
- String *type = Getattr(n, "type"); /* should be int unless explicitly specified in a C++0x enum class */
- SwigType *typemap_lookup_type = parent_name ? parent_name : type;
- const String *tm = typemapLookup(n, "cstype", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF);
- String *return_type = Copy(tm);
- const String *methodmods = Getattr(n, "feature:cs:methodmodifiers");
- methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string);
- if (csattributes)
- Printf(enum_code, " %s\n", csattributes);
- if ((enum_feature == TypesafeEnum) && parent_name && !unnamedinstance) {
- // Wrap (non-anonymous) enum using the typesafe enum pattern
- if (Getattr(n, "enumvalue")) {
- String *value = enumValue(n);
- Printf(enum_code, " %s static readonly %s %s = new %s(\"%s\", %s);\n", methodmods, return_type, symname, return_type, symname, value);
- Delete(value);
- } else {
- Printf(enum_code, " %s static readonly %s %s = new %s(\"%s\");\n", methodmods, return_type, symname, return_type, symname);
- }
- } else {
- // Simple integer constants
- // Note these are always generated for anonymous enums, no matter what enum_feature is specified
- // Code generated is the same for SimpleEnum and TypeunsafeEnum -> the class it is generated into is determined later
- // The %csconst feature determines how the constant value is obtained
- int const_feature_flag = GetFlag(n, "feature:cs:const");
- const char *const_readonly = const_feature_flag ? "const" : "static readonly";
- String *value = enumValue(n);
- Printf(enum_code, " %s %s %s %s = %s;\n", methodmods, const_readonly, return_type, symname, value);
- Delete(value);
- }
- }
- // Add the enum value to the comma separated list being constructed in the enum declaration.
- String *enumvalues = Getattr(parent, "enumvalues");
- if (!enumvalues)
- Setattr(parent, "enumvalues", Copy(symname));
- else
- Printv(enumvalues, ", ", symname, NIL);
- Delete(scope);
- }
- Delete(tmpValue);
- Swig_restore(n);
- return SWIG_OK;
- }
- /* -----------------------------------------------------------------------
- * constantWrapper()
- * Used for wrapping constants - #define or %constant.
- * Also for inline initialised const static primitive type member variables (short, int, double, enums etc).
- * C# static const variables are generated for these.
- * If the %csconst(1) feature is used then the C constant value is used to initialise the C# const variable.
- * If not, a PINVOKE method is generated to get the C constant value for initialisation of the C# const variable.
- * However, if the %csconstvalue feature is used, it overrides all other ways to generate the initialisation.
- * Also note that this method might be called for wrapping enum items (when the enum is using %csconst(0)).
- * ------------------------------------------------------------------------ */
- virtual int constantWrapper(Node *n) {
- String *symname = Getattr(n, "sym:name");
- SwigType *t = Getattr(n, "type");
- ParmList *l = Getattr(n, "parms");
- String *tm;
- String *return_type = NewString("");
- String *constants_code = NewString("");
- bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0);
- const String *itemname = (proxy_flag && wrapping_member_flag) ? variable_name : symname;
- if (!is_enum_item) {
- String *scope = 0;
- if (proxy_class_name) {
- String *nspace = getNSpace();
- scope = NewString("");
- if (nspace)
- Printf(scope, "%s.", nspace);
- Printf(scope, "%s", proxy_class_name);
- } else {
- scope = Copy(module_class_name);
- }
- if (!addSymbol(itemname, n, scope))
- return SWIG_E…