Index: generic/gentclAPI.decls =================================================================== diff -u -rbedcf64642123d38ace4f5117e2b4b99fe9a0e06 -rbfa35f91317151147869ce0f97f6c89f1ffc7fbe --- generic/gentclAPI.decls (.../gentclAPI.decls) (revision bedcf64642123d38ace4f5117e2b4b99fe9a0e06) +++ generic/gentclAPI.decls (.../gentclAPI.decls) (revision bfa35f91317151147869ce0f97f6c89f1ffc7fbe) @@ -324,6 +324,11 @@ infoObjectMethod parent XOTclObjInfoParentMethod { {-argName "object" -required 1 -type object} } +infoObjectMethod params XOTclObjInfoParamsMethod { + {-argName "object" -required 1 -type object} + {-argName "methodName" -required 1} + {-argName "-varNames"} +} infoObjectMethod parametercmd XOTclObjInfoParametercmdMethod { {-argName "object" -required 1 -type object} {-argName "pattern"} @@ -425,6 +430,11 @@ {-argName "class" -required 1 -type class} {-argName "pattern"} } +infoClassMethod instparams XOTclClassInfoInstparamsMethod { + {-argName "class" -required 1 -type class} + {-argName "methodName" -required 1} + {-argName "-varNames"} +} infoClassMethod instpost XOTclClassInfoInstpostMethod { {-argName "class" -required 1 -type class} {-argName "methodName" -required 1} Index: generic/tclAPI.h =================================================================== diff -u -r9f1d59741223795c836a0e8230a891781ecfc09e -rbfa35f91317151147869ce0f97f6c89f1ffc7fbe --- generic/tclAPI.h (.../tclAPI.h) (revision 9f1d59741223795c836a0e8230a891781ecfc09e) +++ generic/tclAPI.h (.../tclAPI.h) (revision bfa35f91317151147869ce0f97f6c89f1ffc7fbe) @@ -73,6 +73,7 @@ static int XOTclClassInfoInstmixinofMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstnonposargsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstparametercmdMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); +static int XOTclClassInfoInstparamsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstpostMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstpreMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstprocsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); @@ -98,6 +99,7 @@ static int XOTclObjInfoMixinguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclObjInfoNonposargsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclObjInfoParametercmdMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); +static int XOTclObjInfoParamsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclObjInfoParentMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclObjInfoPostMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclObjInfoPreMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); @@ -176,6 +178,7 @@ static int XOTclClassInfoInstmixinofMethod(Tcl_Interp *interp, XOTclClass *class, int withClosure, char *patternString, XOTclObject *patternObj); static int XOTclClassInfoInstnonposargsMethod(Tcl_Interp *interp, XOTclClass *class, char *methodName); static int XOTclClassInfoInstparametercmdMethod(Tcl_Interp *interp, XOTclClass *class, char *pattern); +static int XOTclClassInfoInstparamsMethod(Tcl_Interp *interp, XOTclClass *class, char *methodName, int withVarnames); static int XOTclClassInfoInstpostMethod(Tcl_Interp *interp, XOTclClass *class, char *methodName); static int XOTclClassInfoInstpreMethod(Tcl_Interp *interp, XOTclClass *class, char *methodName); static int XOTclClassInfoInstprocsMethod(Tcl_Interp *interp, XOTclClass *class, char *pattern); @@ -201,6 +204,7 @@ static int XOTclObjInfoMixinguardMethod(Tcl_Interp *interp, XOTclObject *object, char *mixin); static int XOTclObjInfoNonposargsMethod(Tcl_Interp *interp, XOTclObject *object, char *methodName); static int XOTclObjInfoParametercmdMethod(Tcl_Interp *interp, XOTclObject *object, char *pattern); +static int XOTclObjInfoParamsMethod(Tcl_Interp *interp, XOTclObject *object, char *methodName, int withVarnames); static int XOTclObjInfoParentMethod(Tcl_Interp *interp, XOTclObject *object); static int XOTclObjInfoPostMethod(Tcl_Interp *interp, XOTclObject *object, char *methodName); static int XOTclObjInfoPreMethod(Tcl_Interp *interp, XOTclObject *object, char *methodName); @@ -280,6 +284,7 @@ XOTclClassInfoInstmixinofMethodIdx, XOTclClassInfoInstnonposargsMethodIdx, XOTclClassInfoInstparametercmdMethodIdx, + XOTclClassInfoInstparamsMethodIdx, XOTclClassInfoInstpostMethodIdx, XOTclClassInfoInstpreMethodIdx, XOTclClassInfoInstprocsMethodIdx, @@ -305,6 +310,7 @@ XOTclObjInfoMixinguardMethodIdx, XOTclObjInfoNonposargsMethodIdx, XOTclObjInfoParametercmdMethodIdx, + XOTclObjInfoParamsMethodIdx, XOTclObjInfoParentMethodIdx, XOTclObjInfoPostMethodIdx, XOTclObjInfoPreMethodIdx, @@ -1010,6 +1016,26 @@ } static int +XOTclClassInfoInstparamsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + parseContext pc; + + if (ArgumentParse(interp, objc, objv, NULL, objv[0], + method_definitions[XOTclClassInfoInstparamsMethodIdx].paramDefs, + method_definitions[XOTclClassInfoInstparamsMethodIdx].nrParameters, + &pc) != TCL_OK) { + return TCL_ERROR; + } else { + XOTclClass *class = (XOTclClass *)pc.clientData[0]; + char *methodName = (char *)pc.clientData[1]; + int withVarnames = (int )pc.clientData[2]; + + parseContextRelease(&pc); + return XOTclClassInfoInstparamsMethod(interp, class, methodName, withVarnames); + + } +} + +static int XOTclClassInfoInstpostMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; @@ -1535,6 +1561,26 @@ } static int +XOTclObjInfoParamsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + parseContext pc; + + if (ArgumentParse(interp, objc, objv, NULL, objv[0], + method_definitions[XOTclObjInfoParamsMethodIdx].paramDefs, + method_definitions[XOTclObjInfoParamsMethodIdx].nrParameters, + &pc) != TCL_OK) { + return TCL_ERROR; + } else { + XOTclObject *object = (XOTclObject *)pc.clientData[0]; + char *methodName = (char *)pc.clientData[1]; + int withVarnames = (int )pc.clientData[2]; + + parseContextRelease(&pc); + return XOTclObjInfoParamsMethod(interp, object, methodName, withVarnames); + + } +} + +static int XOTclObjInfoParentMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; @@ -2508,6 +2554,11 @@ {"class", 1, 0, convertToClass}, {"pattern", 0, 0, convertToString}} }, +{"::xotcl::cmd::ClassInfo::instparams", XOTclClassInfoInstparamsMethodStub, 3, { + {"class", 1, 0, convertToClass}, + {"methodName", 1, 0, convertToString}, + {"-varNames", 0, 0, convertToString}} +}, {"::xotcl::cmd::ClassInfo::instpost", XOTclClassInfoInstpostMethodStub, 2, { {"class", 1, 0, convertToClass}, {"methodName", 1, 0, convertToString}} @@ -2616,6 +2667,11 @@ {"object", 1, 0, convertToObject}, {"pattern", 0, 0, convertToString}} }, +{"::xotcl::cmd::ObjectInfo::params", XOTclObjInfoParamsMethodStub, 3, { + {"object", 1, 0, convertToObject}, + {"methodName", 1, 0, convertToString}, + {"-varNames", 0, 0, convertToString}} +}, {"::xotcl::cmd::ObjectInfo::parent", XOTclObjInfoParentMethodStub, 1, { {"object", 1, 0, convertToObject}} }, Index: generic/xotcl.c =================================================================== diff -u -r6915324f4c3e871b459e7ff46943bbb6ad251c75 -rbfa35f91317151147869ce0f97f6c89f1ffc7fbe --- generic/xotcl.c (.../xotcl.c) (revision 6915324f4c3e871b459e7ff46943bbb6ad251c75) +++ generic/xotcl.c (.../xotcl.c) (revision bfa35f91317151147869ce0f97f6c89f1ffc7fbe) @@ -4940,31 +4940,56 @@ XOTclParam CONST *pPtr; for (pPtr = paramDefs->paramsPtr; pPtr->name; pPtr++) { - if (*pPtr->name == '-') { - first = 1; - nameStringObj = Tcl_NewStringObj(pPtr->name, -1); - if ((pPtr->flags & XOTCL_ARG_REQUIRED) || pPtr->type) { - Tcl_AppendToObj(nameStringObj,":", 1); - if (pPtr->flags & XOTCL_ARG_REQUIRED) { - first = 0; - Tcl_AppendToObj(nameStringObj,"required", 8); + int isNonpos = *pPtr->name == '-'; + int outputRequired = (isNonpos && (pPtr->flags & XOTCL_ARG_REQUIRED)); + /* + char *argName = paramPtr->name; + if (*argName == '-') argName++; + + if (*pPtr->name == '-') {..} + */ + first = 1; + nameStringObj = Tcl_NewStringObj(pPtr->name, -1); + if (outputRequired + || pPtr->type || + (pPtr->flags & (XOTCL_ARG_SUBST_DEFAULT|XOTCL_ARG_INITCMD))) { + Tcl_AppendToObj(nameStringObj,":", 1); + if (pPtr->type) { + first = 0; + Tcl_AppendToObj(nameStringObj,pPtr->type, -1); + } + + if (outputRequired) { + if (first) first = 0; else { + Tcl_AppendToObj(nameStringObj,",", 1); } - if (pPtr->type) { - if (!first) - Tcl_AppendToObj(nameStringObj,",", 1); - Tcl_AppendToObj(nameStringObj,pPtr->type, -1); - } + Tcl_AppendToObj(nameStringObj,"required", 8); } - innerlist = Tcl_NewListObj(0, NULL); - Tcl_ListObjAppendElement(interp, innerlist, nameStringObj); - if (pPtr->defaultValue) { - Tcl_ListObjAppendElement(interp, innerlist, pPtr->defaultValue); + if ((pPtr->flags & XOTCL_ARG_SUBST_DEFAULT)) { + if (first) first = 0; else { + Tcl_AppendToObj(nameStringObj,",", 1); + } + Tcl_AppendToObj(nameStringObj,"substdefault", -1); } - Tcl_ListObjAppendElement(interp, list, innerlist); + if ((pPtr->flags & XOTCL_ARG_INITCMD)) { + if (first) first = 0; else { + Tcl_AppendToObj(nameStringObj,",", 1); + } + Tcl_AppendToObj(nameStringObj,"initcmd", -1); + } } + + innerlist = Tcl_NewListObj(0, NULL); + Tcl_ListObjAppendElement(interp, innerlist, nameStringObj); + if (pPtr->defaultValue) { + Tcl_ListObjAppendElement(interp, innerlist, pPtr->defaultValue); + } + + Tcl_ListObjAppendElement(interp, list, innerlist); } + return list; } @@ -9203,6 +9228,9 @@ * "-"; arguments must be always in same order */ + /* reset dashdash, if needed */ + if (dashdash) {dashdash = 0;} + if (pPtr->flags & XOTCL_ARG_REQUIRED) nrReq++; else nrOpt++; /*fprintf(stderr,"... arg %s req %d converter %p try to set on %d: '%s'\n", pPtr->name,pPtr->flags & XOTCL_ARG_REQUIRED,pPtr->converter,i, ObjStr(objv[o]));*/ @@ -9590,32 +9618,17 @@ return XOTclErrBadVal(interp, "info args", "a tcl method name", name); } -/* static int */ -/* ListObjPtrHashTable(Tcl_Interp *interp, Tcl_HashTable *table, char *pattern) { */ -/* Tcl_HashEntry *hPtr; */ -/* if (pattern && noMetaChars(pattern)) { */ -/* XOTclObject *childobj = XOTclpGetObject(interp, pattern); */ -/* hPtr = XOTcl_FindHashEntry(table, (char *)childobj); */ -/* if (hPtr) { */ -/* Tcl_SetObjResult(interp, childobj->cmdName); */ -/* } else { */ -/* Tcl_SetObjResult(interp, XOTclGlobalObjects[XOTE_EMPTY]); */ -/* } */ -/* } else { */ -/* Tcl_Obj *list = Tcl_NewListObj(0, NULL); */ -/* Tcl_HashSearch hSrch; */ -/* hPtr = table ? Tcl_FirstHashEntry(table, &hSrch) : 0; */ -/* for (; hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { */ -/* XOTclObject *obj = (XOTclObject*)Tcl_GetHashKey(table, hPtr); */ -/* if (!pattern || Tcl_StringMatch(objectName(obj), pattern)) { */ -/* Tcl_ListObjAppendElement(interp, list, obj->cmdName); */ -/* } */ -/* } */ -/* Tcl_SetObjResult(interp, list); */ -/* } */ -/* return TCL_OK; */ -/* } */ +static int +ListParameter(Tcl_Interp *interp, Proc *procPtr, char *methodName, int withVarnames) { + XOTclParamDefs *paramDefs = procPtr ? ParamDefsGet((Tcl_Command)procPtr->cmdPtr) : NULL; + if (paramDefs) { + Tcl_Obj *arglistObj = ParamDefsFormat(interp, paramDefs); + Tcl_SetObjResult(interp, arglistObj); + return TCL_OK; + } + return ListProcArgs(interp, procPtr, methodName); +} /******************************** * End result setting commands ********************************/ @@ -11324,6 +11337,10 @@ return TCL_OK; } +static int XOTclObjInfoParamsMethod(Tcl_Interp *interp, XOTclObject *object, char *methodName, int withVarnames) { + return ListParameter(interp, getObjectProc(interp, object, methodName), methodName, withVarnames); +} + static int XOTclObjInfoParametercmdMethod(Tcl_Interp *interp, XOTclObject *object, char *pattern) { if (object->nsPtr) { return ListMethodKeys(interp, Tcl_Namespace_cmdTable(object->nsPtr), pattern, 1, 0, 0, 0, 1); @@ -11596,6 +11613,10 @@ return ListMethodKeys(interp, Tcl_Namespace_cmdTable(class->nsPtr), pattern, 1, 0, 0, 0, 1); } +static int XOTclClassInfoInstparamsMethod(Tcl_Interp *interp, XOTclClass *class, char *methodName, int withVarnames) { + return ListParameter(interp, getClassProc(interp, class, methodName), methodName, withVarnames); +} + static int XOTclClassInfoInstpostMethod(Tcl_Interp *interp, XOTclClass * class, char * methodName) { if (class->opt) { XOTclProcAssertion *procs = AssertionFindProcs(class->opt->assertions, methodName); Index: tests/objparametertest.xotcl =================================================================== diff -u -r6915324f4c3e871b459e7ff46943bbb6ad251c75 -rbfa35f91317151147869ce0f97f6c89f1ffc7fbe --- tests/objparametertest.xotcl (.../objparametertest.xotcl) (revision 6915324f4c3e871b459e7ff46943bbb6ad251c75) +++ tests/objparametertest.xotcl (.../objparametertest.xotcl) (revision bfa35f91317151147869ce0f97f6c89f1ffc7fbe) @@ -181,12 +181,32 @@ # 2) substdefault for '$' in -parameter defaults does not make much sense. # deactivated for now; otherwise we would need "\\" -puts stderr [D info info] +D instproc bar { + {-s:substdefault "[self]"} + {-literal "[self]"} + {-c:substdefault "[my c]"} + {-d:integer,substdefault "$d"} + {-switch:switch} + {-optflag} + x + y:integer + {z 1} +} { + return $s-$literal-$c-$d +} -? {D info instargs bar} {::d1-[self]-1-1} "query arguments" +? {D info instargs bar} {x y z} "query old instargs" +? {D info instparams bar} \ + {{-s:substdefault {[self]}} {-literal {[self]}} {-c:substdefault {[my c]}} {-d:integer,substdefault {$d}} {-switch:switch 0} -optflag x y:integer {z 1}} \ + "query instparams" +D instproc foo {a b {-c 1} {-d} x {-end 100}} { + foreach v [list a b c d x end] { + puts stderr $v?[info exists $v] + } +} +d1 foo 1 2 3 - ## TODO regression test for type checking, parameter options (initcmd, ## substdefault, combinations with defaults, ...), etc.