Index: TODO =================================================================== diff -u -r65f8883a4596ea98365b7de1652700e3ac7394cc -rf0d274241d978847f40deb439e17172d7d8716d9 --- TODO (.../TODO) (revision 65f8883a4596ea98365b7de1652700e3ac7394cc) +++ TODO (.../TODO) (revision f0d274241d978847f40deb439e17172d7d8716d9) @@ -2456,15 +2456,12 @@ ::nsf::importvar => ::nsf::var::import ::nsf::setvar => ::nsf::var::set +- improved misleading error message for method modifiers "public" and + "protected", as well as for "class-object" +- extended regression test TODO: -- fix misleading error message: - nx::Class create C { - :public method foo {x} {return $x} - :public object method bar {x} {return $x} - :create c1 - } - serializer: check, why catch is needed for object-level alias (search for ns_cache_flush) Index: library/nx/nx.tcl =================================================================== diff -u -r65f8883a4596ea98365b7de1652700e3ac7394cc -rf0d274241d978847f40deb439e17172d7d8716d9 --- library/nx/nx.tcl (.../nx.tcl) (revision 65f8883a4596ea98365b7de1652700e3ac7394cc) +++ library/nx/nx.tcl (.../nx.tcl) (revision f0d274241d978847f40deb439e17172d7d8716d9) @@ -217,6 +217,7 @@ if {$what in [list "filterguard" "mixinguard"]} { return [::nsf::dispatch [::nsf::self] ::nsf::methods::object::$what {*}$args] } + error "'$what' not allowed to be modified by 'class-object'" } # define unknown handler for class :method unknown {m args} { @@ -227,22 +228,26 @@ ::nsf::method::property [::nsf::self] unknown call-protected true } + # Well, class-object is not a method defining method either, but a modifier + array set ::nsf::methodDefiningMethod {method 1 alias 1 attribute 1 forward 1 class-object 1} Object eval { # method modifier "public" :method public {args} { - set p [lsearch -regexp $args {^(method|alias|attribute|forward)$}] - if {$p == -1} {error "$args is not a method defining method"} + if {![info exists ::nsf::methodDefiningMethod([lindex $args 0])]} { + error "'[lindex $args 0]' is not a method defining method" + } set r [::nsf::dispatch [::nsf::current object] {*}$args] if {$r ne ""} {::nsf::method::property [::nsf::self] $r call-protected false} return $r } # method modifier "protected" :method protected {args} { - set p [lsearch -regexp $args {^(method|alias|attribute|forward)$}] - if {$p == -1} {error "$args is not a method defining command"} + if {![info exists ::nsf::methodDefiningMethod([lindex $args 0])]} { + error "'[lindex $args 0]' is not a method defining method" + } set r [{*}:$args] if {$r ne ""} {::nsf::method::property [::nsf::self] $r call-protected true} return $r Index: tests/method-modifiers.test =================================================================== diff -u -re3a84e351aaf79c02a63cc0741dde7b9bd550849 -rf0d274241d978847f40deb439e17172d7d8716d9 --- tests/method-modifiers.test (.../method-modifiers.test) (revision e3a84e351aaf79c02a63cc0741dde7b9bd550849) +++ tests/method-modifiers.test (.../method-modifiers.test) (revision f0d274241d978847f40deb439e17172d7d8716d9) @@ -380,4 +380,22 @@ ? {::nsf::method::delete C bar} "Object C: method bar is not defined" ? {::nsf::method::delete C -per-object bar} "" ? {::nsf::method::delete C -per-object bar} "Object C: method bar is not defined" -} \ No newline at end of file +} + +# +# Test error message of method modifier +# +Test parameter count 1 + +Test case errormessage { + nx::Class create C + ? {C public method foo {x} {return $x}} "::nsf::classes::C::foo" + ? {C public object method bar {x} {return $x}} \ + "'object' is not a method defining method" + ? {C protected object method bar {x} {return $x}} \ + "'object' is not a method defining method" + ? {C object method bar {x} {return $x}} \ + {Method 'object' unknown for ::C. Consider '::C create object method bar x {return $x}' instead of '::C object method bar x {return $x}'} + ? {C public class-object object method bar {x} {return $x}} \ + "'object' not allowed to be modified by 'class-object'" +}