Index: TODO =================================================================== diff -u -r87c6a11296ada89c007cc2ed33df6887ac53c740 -rb0d97485503d32672dd3691131ce51bdf3923881 --- TODO (.../TODO) (revision 87c6a11296ada89c007cc2ed33df6887ac53c740) +++ TODO (.../TODO) (revision b0d97485503d32672dd3691131ce51bdf3923881) @@ -2052,6 +2052,11 @@ - streamlined error messages - removed NsfErrBadVal() and replaced it with a generalized version of NsfObjErrType() +- "/obj/ info method parametersyntax /method/": return results of + ::nsf::parametersyntax in case, the parametersyntax cannot obtained + from a parameter definition (e.g. the method is a forwarder to a tcl + cmd). + TODO: - check performance implications of value conflict checker Index: generic/nsf.c =================================================================== diff -u -r87c6a11296ada89c007cc2ed33df6887ac53c740 -rb0d97485503d32672dd3691131ce51bdf3923881 --- generic/nsf.c (.../nsf.c) (revision 87c6a11296ada89c007cc2ed33df6887ac53c740) +++ generic/nsf.c (.../nsf.c) (revision b0d97485503d32672dd3691131ce51bdf3923881) @@ -12157,6 +12157,25 @@ return listObj; } + +/* + *---------------------------------------------------------------------- + * ListCmdParams -- + * + * Obtains a cmd and a method name and sets as side effect the Tcl + * result to either the list of the parameters (withVarnames == 0), + * to the args (withVarnames == 1) or to the parametersyntax + * (withVarnames == 2). + * + * Results: + * Tcl result code. + * + * Side effects: + * Sets interp result + * + *---------------------------------------------------------------------- + */ + static int ListCmdParams(Tcl_Interp *interp, Tcl_Command cmd, CONST char *methodName, int withVarnames) { Proc *procPtr = GetTclProcFromCommand(cmd); @@ -12239,7 +12258,39 @@ Tcl_SetObjResult(interp, Tcl_NewStringObj(methodName, -1)); return TCL_OK; } - } else if (((Command *)cmd)->objProc == NsfForwardMethod) { + } + + /* + * In case, we failed so far to obtain a result, try to use the + * object-system implementors definitions in the gobal array + * ::nsf::parametersyntax. Note that we can only obtain the + * parametersyntax this way. + */ + if (withVarnames == 2) { + Command *cmdPtr = (Command *)cmd; + Tcl_DString ds, *dsPtr = &ds; + Tcl_Obj *parameterSyntaxObj; + + Tcl_DStringInit(dsPtr); + if (strcmp("::", cmdPtr->nsPtr->fullName) != 0) { + Tcl_DStringAppend(dsPtr, cmdPtr->nsPtr->fullName, -1); + } + Tcl_DStringAppend(dsPtr, "::", 2); + Tcl_DStringAppend(dsPtr, methodName, -1); + parameterSyntaxObj = Tcl_GetVar2Ex(interp, "::nsf::parametersyntax", + Tcl_DStringValue(dsPtr), TCL_GLOBAL_ONLY); + + /*fprintf(stderr, "No parametersyntax so far methodname %s cmd name %s ns %s\n", + methodName, Tcl_GetCommandName(interp,cmd), Tcl_DStringValue(dsPtr));*/ + + Tcl_DStringFree(dsPtr); + if (parameterSyntaxObj) { + Tcl_SetObjResult(interp, parameterSyntaxObj); + return TCL_OK; + } + } + + if (((Command *)cmd)->objProc == NsfForwardMethod) { return NsfPrintError(interp, "info params: could not obtain parameter definition for forwarder '%s'", methodName); } else if (((Command *)cmd)->objProc != NsfObjDispatch) { Index: library/nx/nx.tcl =================================================================== diff -u -r141d870c2d53aa159ac1c6101103a75092ff93ad -rb0d97485503d32672dd3691131ce51bdf3923881 --- library/nx/nx.tcl (.../nx.tcl) (revision 141d870c2d53aa159ac1c6101103a75092ff93ad) +++ library/nx/nx.tcl (.../nx.tcl) (revision b0d97485503d32672dd3691131ce51bdf3923881) @@ -1585,12 +1585,12 @@ #interp alias {} ::nx::self {} ::nsf::self - set value "?add class?|?classes?|?delete class?" + set value "?classes?|?add class?|?delete class?" set ::nsf::parametersyntax(::nsf::classes::nx::Object::mixin) $value set ::nsf::parametersyntax(::nsf::classes::nx::Class::mixin) $value set ::nsf::parametersyntax(::nsf::classes::nx::Class::superclass) $value set ::nsf::parametersyntax(::nsf::classes::nx::Object::class) "?class?" - set value "?add filter?|?filters?|?delete filter?" + set value "?filters?|?add filter?|?delete filter?" set ::nsf::parametersyntax(::nsf::classes::nx::Object::filter) $value set ::nsf::parametersyntax(::nsf::classes::nx::Class::filter) $value set ::nsf::parametersyntax(::nsf::classes::nx::Object::eval) "arg ?arg ...?" Index: library/xotcl/library/xotcl2.tcl =================================================================== diff -u -rcc94b154709f9bd3393fbbdb9af982a30b57dee0 -rb0d97485503d32672dd3691131ce51bdf3923881 --- library/xotcl/library/xotcl2.tcl (.../xotcl2.tcl) (revision cc94b154709f9bd3393fbbdb9af982a30b57dee0) +++ library/xotcl/library/xotcl2.tcl (.../xotcl2.tcl) (revision b0d97485503d32672dd3691131ce51bdf3923881) @@ -1062,23 +1062,17 @@ # Provide parametersyntax for methods, which do not have a spec # # Tcl commands - set ::nsf::parametersyntax(::nsf::classes::xotcl::Object::append) "varName ?value value value ...?" - set ::nsf::parametersyntax(::nsf::classes::xotcl::Object::array) "option arrayName ?arg arg ...?" - set ::nsf::parametersyntax(::nsf::classes::xotcl::Object::eval) "arg ?arg ...?" - set ::nsf::parametersyntax(::nsf::classes::xotcl::Object::incr) "varName ?increment?" - set ::nsf::parametersyntax(::nsf::classes::xotcl::Object::lappend) "varName ?value value value ...?" - set ::nsf::parametersyntax(::nsf::classes::xotcl::Object::set) "varName ?value?" - set ::nsf::parametersyntax(::nsf::classes::xotcl::Object::set) "varName ?value?" - set ::nsf::parametersyntax(::nsf::classes::xotcl::Object::subst) \ - "?-nobackslashes? ?-nocommands? ?-novariables? string" - set ::nsf::parametersyntax(::nsf::classes::xotcl::Object::trace) "option ?arg arg ...?" - set ::nsf::parametersyntax(::nsf::classes::xotcl::Object::unset) "?-nocomplain? ?--? ?name name name ...?" + set ::nsf::parametersyntax(::append) "varName ?value value value ...?" + set ::nsf::parametersyntax(::array) "option arrayName ?arg arg ...?" + set ::nsf::parametersyntax(::eval) "arg ?arg ...?" + set ::nsf::parametersyntax(::incr) "varName ?increment?" + set ::nsf::parametersyntax(::lappend) "varName ?value value value ...?" + set ::nsf::parametersyntax(::set) "varName ?value?" + set ::nsf::parametersyntax(::set) "varName ?value?" + set ::nsf::parametersyntax(::subst) "?-nobackslashes? ?-nocommands? ?-novariables? string" + set ::nsf::parametersyntax(::trace) "option ?arg arg ...?" + set ::nsf::parametersyntax(::unset) "?-nocomplain? ?--? ?name name name ...?" - # forwarders - set ::nsf::parametersyntax(::nsf::classes::xotcl::Object::forward) \ - "name ?-default value? ?-methodprefix value? ?-objscope? ?-onerror value? ?-verbose? ?target? ?arg ...?" - set ::nsf::parametersyntax(::nsf::classes::xotcl::Class::instforward) \ - "name ?-default value? ?-methodprefix value? ?-objscope? ?-onerror value? ?-verbose? ?target? ?arg ...?" set ::nsf::parametersyntax(::nsf::classes::xotcl::Object::invar) "?expr?" set ::nsf::parametersyntax(::nsf::classes::xotcl::Class::instinvar) "?expr?" set ::nsf::parametersyntax(::nsf::classes::xotcl::Object::parametercmd) "name" @@ -1088,12 +1082,12 @@ # slots set ::nsf::parametersyntax(::nsf::classes::xotcl::Object::class) "?class?" - set value "?add class?|?classes?|?delete class?" + set value "?classes?|?add class?|?delete class?" set ::nsf::parametersyntax(::nsf::classes::xotcl::Object::mixin) $value set ::nsf::parametersyntax(::nsf::classes::xotcl::Class::instmixin) $value set ::nsf::parametersyntax(::nsf::classes::xotcl::Class::superclass) $value - set value "?add filter?|?filters?|?delete filter?" + set value "?filters?|?add filter?|?delete filter?" set ::nsf::parametersyntax(::nsf::classes::xotcl::Object::filter) $value set ::nsf::parametersyntax(::nsf::classes::xotcl::Class::instfilter) $value unset value Index: tests/info-method.test =================================================================== diff -u -rcc94b154709f9bd3393fbbdb9af982a30b57dee0 -rb0d97485503d32672dd3691131ce51bdf3923881 --- tests/info-method.test (.../info-method.test) (revision cc94b154709f9bd3393fbbdb9af982a30b57dee0) +++ tests/info-method.test (.../info-method.test) (revision b0d97485503d32672dd3691131ce51bdf3923881) @@ -399,4 +399,11 @@ ? {lsort [d1 info lookup method "string length"]} "::nsf::classes::D::string length" ? {lsort [d1 info lookup method "string reverse"]} "::nsf::classes::C::string reverse" +} + +Test case parametersyntax { + # a true method + ? {::nx::Object info method parametersyntax method} "name arguments ?-returns value? body ?-precondition value? ?-postcondition value?" + # a forwarder to ::nsf::relation; definition comes via ::nsf::parametersyntax + ? {::nx::Object info method parametersyntax mixin} "?classes?|?add class?|?delete class?" } \ No newline at end of file