diff --git a/Examples/test-suite/autodoc.i b/Examples/test-suite/autodoc.i index 97c05d791..ec7307a35 100644 --- a/Examples/test-suite/autodoc.i +++ b/Examples/test-suite/autodoc.i @@ -148,3 +148,11 @@ bool is_python_builtin() { return true; } bool is_python_builtin() { return false; } #endif %} + +// Autodoc Python keywords +%warnfilter(SWIGWARN_PARSE_KEYWORD) process; +%feature(autodoc,0) process; +%feature("compactdefaultargs") process; +%inline %{ +int process(int from) { return from; } +%} diff --git a/Examples/test-suite/errors/swig_typemap_warn.stderr b/Examples/test-suite/errors/swig_typemap_warn.stderr index 5116dbc91..dde790024 100644 --- a/Examples/test-suite/errors/swig_typemap_warn.stderr +++ b/Examples/test-suite/errors/swig_typemap_warn.stderr @@ -3,5 +3,7 @@ swig_typemap_warn.i:7: Warning 1000: Test warning for 'in' typemap for int arg3 swig_typemap_warn.i:7: Warning 1001: Test warning for 'out' typemap for double mmm (result) - name: mmm symname: mmm &1_ltype: double * descriptor: SWIGTYPE_double swig_typemap_warn.i:7: Warning 1000: Test warning for 'in' typemap for int abc (arg1) - argnum: 1 &1_ltype: int * descriptor: SWIGTYPE_int swig_typemap_warn.i:7: Warning 1000: Test warning for 'in' typemap for int arg3 (arg3) - argnum: 3 &1_ltype: int * descriptor: SWIGTYPE_int +swig_typemap_warn.i:7: Warning 314: 'def' is a python keyword, renaming to '_def' swig_typemap_warn.i:7: Warning 1000: Test warning for 'in' typemap for int abc (arg1) - argnum: 1 &1_ltype: int * descriptor: SWIGTYPE_int swig_typemap_warn.i:7: Warning 1000: Test warning for 'in' typemap for int arg3 (arg3) - argnum: 3 &1_ltype: int * descriptor: SWIGTYPE_int +swig_typemap_warn.i:7: Warning 314: 'def' is a python keyword, renaming to '_def' diff --git a/Examples/test-suite/keyword_rename.i b/Examples/test-suite/keyword_rename.i index 46c3338b3..23c01087d 100644 --- a/Examples/test-suite/keyword_rename.i +++ b/Examples/test-suite/keyword_rename.i @@ -4,6 +4,8 @@ %module keyword_rename +%feature("kwargs"); + #pragma SWIG nowarn=SWIGWARN_PARSE_KEYWORD %inline %{ diff --git a/Examples/test-suite/python/autodoc_runme.py b/Examples/test-suite/python/autodoc_runme.py index 1350c6d67..ab963a748 100644 --- a/Examples/test-suite/python/autodoc_runme.py +++ b/Examples/test-suite/python/autodoc_runme.py @@ -202,3 +202,5 @@ check(inspect.getdoc(banana), "banana(S a, S b, int c, Integer d)") check(inspect.getdoc(TInteger), "Proxy of C++ T< int > class.", "::T< int >") check(inspect.getdoc(TInteger.__init__), "__init__(TInteger self) -> TInteger", None, skip) check(inspect.getdoc(TInteger.inout), "inout(TInteger self, TInteger t) -> TInteger") + +check(inspect.getdoc(process), "process(_from) -> int") diff --git a/Examples/test-suite/python/keyword_rename_runme.py b/Examples/test-suite/python/keyword_rename_runme.py index 5646ce7d6..0bdd64b10 100644 --- a/Examples/test-suite/python/keyword_rename_runme.py +++ b/Examples/test-suite/python/keyword_rename_runme.py @@ -1,4 +1,6 @@ #!/usr/bin/env python import keyword_rename keyword_rename._in(1) +keyword_rename._in(_except=1) keyword_rename._except(1) +keyword_rename._except(_in=1) diff --git a/Source/Modules/lang.cxx b/Source/Modules/lang.cxx index 96588dcc3..92445dc3f 100644 --- a/Source/Modules/lang.cxx +++ b/Source/Modules/lang.cxx @@ -3602,7 +3602,7 @@ String *Language::makeParameterName(Node *n, Parm *p, int arg_num, bool setter) String *arg = 0; String *pn = Getattr(p, "name"); - // Use C parameter name unless it is a duplicate or an empty parameter name + // Check if parameter name is a duplicate. int count = 0; ParmList *plist = Getattr(n, "parms"); while (plist) { @@ -3610,8 +3610,14 @@ String *Language::makeParameterName(Node *n, Parm *p, int arg_num, bool setter) count++; plist = nextSibling(plist); } - String *wrn = pn ? Swig_name_warning(p, 0, pn, 0) : 0; - arg = (!pn || (count > 1) || wrn) ? NewStringf("arg%d", arg_num) : Copy(pn); + + // If the parameter has no name at all or has a non-unique name, replace it with "argN". + if (!pn || count > 1) { + arg = NewStringf("arg%d", arg_num); + } else { + // Otherwise, try to use the original C name, but modify it if necessary to avoid conflicting with the language keywords. + arg = Swig_name_make(p, 0, pn, 0, 0); + } if (setter && Cmp(arg, "self") != 0) { // Some languages (C#) insist on calling the input variable "value" while diff --git a/Source/Modules/python.cxx b/Source/Modules/python.cxx index d3d157ddf..d58e21ba7 100755 --- a/Source/Modules/python.cxx +++ b/Source/Modules/python.cxx @@ -1591,21 +1591,6 @@ public: return ds; } - virtual String *makeParameterName(Node *n, Parm *p, int arg_num, bool = false) const { - // For the keyword arguments, we want to preserve the names as much as possible, - // so we only minimally rename them in Swig_name_make(), e.g. replacing "keyword" - // with "_keyword" if they have any name at all. - if (check_kwargs(n)) { - String *name = Getattr(p, "name"); - if (name) - return Swig_name_make(p, 0, name, 0, 0); - } - - // For the other cases use the general function which replaces arguments whose - // names clash with keywords with (less useful) "argN". - return Language::makeParameterName(n, p, arg_num); - } - /* ----------------------------------------------------------------------------- * addMissingParameterNames() *