Index: generic/predefined.h =================================================================== diff -u -red15b5be7e88cbbcdf6121f3869722dbc354d76f -r89fec6ccb2d935530a2ab141440ca343deda3338 --- generic/predefined.h (.../predefined.h) (revision ed15b5be7e88cbbcdf6121f3869722dbc354d76f) +++ generic/predefined.h (.../predefined.h) (revision 89fec6ccb2d935530a2ab141440ca343deda3338) @@ -161,8 +161,8 @@ "if {[$slot exists type]} {\n" "set type [$slot type]\n" "if {[string match ::* $type]} {\n" -"lappend objopts type=$type\n" -"lappend methodopts type=$type} else {\n" +"lappend objopts object type=$type\n" +"lappend methodopts object type=$type} else {\n" "lappend objopts $type\n" "lappend methodopts $type}}\n" "if {[$slot exists multivalued] && [$slot multivalued]} {\n" @@ -458,10 +458,15 @@ "foreach property [split $properties ,] {\n" "if {$property eq \"required\"} {\n" "lappend opts -required 1} elseif {$property eq \"multivalued\"} {\n" -"lappend opts -multivalued 1} elseif {[string match arg=* $property]} {\n" +"lappend opts -multivalued 1} elseif {[string match type=* $property]} {\n" +"set type [string range $property 5 end]\n" +"if {![string match ::* $type]} {set type ::$type}} elseif {[string match arg=* $property]} {\n" "set argument [string range $property 4 end]\n" "lappend opts -arg $argument} else {\n" -"lappend opts -type $property}}}\n" +"set type $property}}}\n" +"if {[info exists type]} {\n" +"lappend opts -type $type\n" +"unset type}\n" "set cmd [list ::xotcl::Attribute create [::xotcl::self]::slot::$name {*}$opts]\n" "if {$l == 1} {\n" "eval $cmd} elseif {$l == 2} {\n" Index: generic/predefined.xotcl =================================================================== diff -u -red15b5be7e88cbbcdf6121f3869722dbc354d76f -r89fec6ccb2d935530a2ab141440ca343deda3338 --- generic/predefined.xotcl (.../predefined.xotcl) (revision ed15b5be7e88cbbcdf6121f3869722dbc354d76f) +++ generic/predefined.xotcl (.../predefined.xotcl) (revision 89fec6ccb2d935530a2ab141440ca343deda3338) @@ -329,8 +329,8 @@ if {[$slot exists type]} { set type [$slot type] if {[string match ::* $type]} { - lappend objopts type=$type - lappend methodopts type=$type + lappend objopts object type=$type + lappend methodopts object type=$type } else { lappend objopts $type lappend methodopts $type @@ -856,14 +856,22 @@ lappend opts -required 1 } elseif {$property eq "multivalued"} { lappend opts -multivalued 1 + } elseif {[string match type=* $property]} { + set type [string range $property 5 end] + if {![string match ::* $type]} {set type ::$type} } elseif {[string match arg=* $property]} { set argument [string range $property 4 end] lappend opts -arg $argument } else { - lappend opts -type $property + set type $property } } } + if {[info exists type]} { + lappend opts -type $type + unset type + } + set cmd [list ::xotcl::Attribute create [::xotcl::self]::slot::$name {*}$opts] #puts stderr cmd=$cmd Index: generic/xotcl.c =================================================================== diff -u -r127bec56f327ac269b4dc22f61f9254d0bd8f9b5 -r89fec6ccb2d935530a2ab141440ca343deda3338 --- generic/xotcl.c (.../xotcl.c) (revision 127bec56f327ac269b4dc22f61f9254d0bd8f9b5) +++ generic/xotcl.c (.../xotcl.c) (revision 89fec6ccb2d935530a2ab141440ca343deda3338) @@ -6361,8 +6361,11 @@ paramPtr->flags |= XOTCL_ARG_RELATION; /*paramPtr->type = "tclobj";*/ } else if (length >= 6 && strncmp(option, "type=", 5) == 0) { - if (paramPtr->converterArg) - return XOTclVarErrMsg(interp, "Converter arg specified twice", (char *) NULL); + if (paramPtr->converter != NULL && + paramPtr->converter != convertToObject && + paramPtr->converter != convertToClass) + return XOTclVarErrMsg(interp, "option type= only allowed for object or class", (char *) NULL); + paramPtr->converter = NULL; result = ParamOptionSetConverter(interp, paramPtr, option, convertToObjectOfType); paramPtr->converterArg = Tcl_NewStringObj(option+5, length-5); INCR_REF_COUNT(paramPtr->converterArg); Index: tests/parameters.xotcl =================================================================== diff -u -red15b5be7e88cbbcdf6121f3869722dbc354d76f -r89fec6ccb2d935530a2ab141440ca343deda3338 --- tests/parameters.xotcl (.../parameters.xotcl) (revision ed15b5be7e88cbbcdf6121f3869722dbc354d76f) +++ tests/parameters.xotcl (.../parameters.xotcl) (revision 89fec6ccb2d935530a2ab141440ca343deda3338) @@ -27,10 +27,10 @@ ? {::xotcl::valuecheck integer,multivalued [list 1 2 3]} 1 ? {::xotcl::valuecheck integer,multivalued [list 1 2 3 a]} 0 ? {::xotcl::valuecheck in1 aaa} {invalid value constraints "in1"} -? {::xotcl::valuecheck type=::C c1} 1 -? {::xotcl::valuecheck type=::C o} 0 "object, but different type" -? {::xotcl::valuecheck type=::C c} 0 "no object" -? {::xotcl::valuecheck type=::xotcl2::Object c1} 1 "general type" +? {::xotcl::valuecheck object,type=::C c1} 1 +? {::xotcl::valuecheck object,type=::C o} 0 "object, but different type" +? {::xotcl::valuecheck object,type=::C c} 0 "no object" +? {::xotcl::valuecheck object,type=::xotcl2::Object c1} 1 "general type" # # parameter options @@ -392,7 +392,7 @@ ? {d1 foo 10} \ "Value '10' of parameter a is not between 1 and 3" \ - "invalid value" + "value not between 1 and 3" D method foo {a:unknowntype} { puts stderr a=$a @@ -507,11 +507,11 @@ D method foo-object {x:object} {return $x} D method foo-meta {x:metaclass} {return $x} D method foo-mixin {x:mixin,arg=::M} {return $x} -D method foo-type {x:type=::C} {return $x} +D method foo-type {x:object,type=::C} {return $x} ? {D info method parameter foo-base} "x:baseclass" ? {D info method parameter foo-mixin} "x:mixin,arg=::M" -? {D info method parameter foo-type} "x:type=::C" +? {D info method parameter foo-type} "x:object,type=::C" ? {d1 foo-base ::xotcl2::Object} "::xotcl2::Object" ? {d1 foo-base C} \ @@ -560,8 +560,8 @@ Class create ParamTest -parameter { o:object c:class - d:type=::C - d1:type=C + d:object,type=::C + d1:object,type=C m:metaclass mix:mixin,arg=M b:baseclass @@ -576,8 +576,8 @@ } ? {parameterFromSlot ParamTest o} "o:object" -? {parameterFromSlot ParamTest d} "d:type=::C" -? {parameterFromSlot ParamTest d1} "d1:type=C" +? {parameterFromSlot ParamTest d} "d:object,type=::C" +? {parameterFromSlot ParamTest d1} "d1:object,type=::C" ? {parameterFromSlot ParamTest mix} "mix:mixin,arg=M" ? {parameterFromSlot ParamTest x} "x:object,multivalued o"