summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoroehhar <harald.oehlmann@elmicron.de>2018-01-16 14:13:14 (GMT)
committeroehhar <harald.oehlmann@elmicron.de>2018-01-16 14:13:14 (GMT)
commite89d1e331e09f13b01ad0436d00bf199214d4d46 (patch)
tree686496e6b69066ee61507a9220129e31c0428ab0
parente841295386a779136b49e7ca3843a43279a8c185 (diff)
downloadtcl-e89d1e331e09f13b01ad0436d00bf199214d4d46.zip
tcl-e89d1e331e09f13b01ad0436d00bf199214d4d46.tar.gz
tcl-e89d1e331e09f13b01ad0436d00bf199214d4d46.tar.bz2
Solve case where msgcat is called within a class definition script (works only for 8.7)
-rw-r--r--library/msgcat/msgcat.tcl29
-rw-r--r--tests/msgcat.test50
2 files changed, 60 insertions, 19 deletions
diff --git a/library/msgcat/msgcat.tcl b/library/msgcat/msgcat.tcl
index 4233005..0b1079b 100644
--- a/library/msgcat/msgcat.tcl
+++ b/library/msgcat/msgcat.tcl
@@ -1151,17 +1151,26 @@ proc msgcat::ConvertLocale {value} {
proc ::msgcat::PackageNamespaceGet {} {
uplevel 2 {
# Check for no object
- # (undocumented test proposed by dkf 2018-01-12)
- if { [namespace which self] ne "::oo::Helpers::self"} {
- return [namespace current]
- }
- set Class [info object class [self]]
- # Check for classless defined object
- if {$Class eq {::oo::object}} {
- return [namespace qualifiers [self]]
+ switch -exact -- [namespace which self] {
+ {::oo::define::self} {
+ # We are within a class definition
+ return [namespace qualifiers [self]]
+ }
+ {::oo::Helpers::self} {
+ # We are within an object
+ set Class [info object class [self]]
+ # Check for classless defined object
+ if {$Class eq {::oo::object}} {
+ return [namespace qualifiers [self]]
+ }
+ # Class defined object
+ return [namespace qualifiers $Class]
+ }
+ default {
+ # Not in object environment
+ return [namespace current]
+ }
}
- # Class defined object
- return [namespace qualifiers $Class]
}
}
diff --git a/tests/msgcat.test b/tests/msgcat.test
index a71ee3f..7f872ed 100644
--- a/tests/msgcat.test
+++ b/tests/msgcat.test
@@ -1098,10 +1098,26 @@ namespace eval ::msgcat::test {
# Tests msgcat-15.*: tcloo coverage
- # There are 3 use-cases, where 2 must be tested now:
- # - namespace defined, class defined oo, classless
+ # There are 4 use-cases, where 3 must be tested now:
+ # - namespace defined, in class definition, class defined oo, classless
- test msgcat-15.1 {mc in class} -setup {
+ test msgcat-15.1 {mc in class setup} -setup {
+ # full namespace is ::msgcat::test:bar
+ namespace eval bar {
+ ::msgcat::mcset foo_BAR con2 con2bar
+ oo::class create ClassCur
+ }
+ variable locale [mclocale]
+ mclocale foo_BAR
+ } -cleanup {
+ mclocale $locale
+ namespace eval bar {::msgcat::mcforgetpackage}
+ namespace delete bar
+ } -body {
+ oo::define bar::ClassCur msgcat::mc con2
+ } -result con2bar
+
+ test msgcat-15.2 {mc in class} -setup {
# full namespace is ::msgcat::test:bar
namespace eval bar {
::msgcat::mcset foo_BAR con2 con2bar
@@ -1122,7 +1138,7 @@ namespace eval ::msgcat::test {
$baz::ObjCur method1
} -result con2bar
- test msgcat-15.2 {mc in classless object} -setup {
+ test msgcat-15.3 {mc in classless object} -setup {
# full namespace is ::msgcat::test:bar
namespace eval bar {
::msgcat::mcset foo_BAR con2 con2bar
@@ -1139,7 +1155,7 @@ namespace eval ::msgcat::test {
bar::ObjCur method1
} -result con2bar
- test msgcat-15.3 {mc in classless object with explicite namespace eval}\
+ test msgcat-15.4 {mc in classless object with explicite namespace eval}\
-setup {
# full namespace is ::msgcat::test:bar
namespace eval bar {
@@ -1171,7 +1187,18 @@ namespace eval ::msgcat::test {
namespace eval baz {msgcat::mcpackagenamespaceget}
} -result ::msgcat::test::baz
- test msgcat-16.2 {mcpackagenamespaceget in class} -setup {
+ test msgcat-16.2 {mcpackagenamespaceget in class setup} -setup {
+ namespace eval bar {
+ oo::class create ClassCur
+ oo::define ClassCur variable a
+ }
+ } -cleanup {
+ namespace delete bar
+ } -body {
+ oo::define bar::ClassCur msgcat::mcpackagenamespaceget
+ } -result ::msgcat::test::bar
+
+ test msgcat-16.3 {mcpackagenamespaceget in class} -setup {
namespace eval bar {
oo::class create ClassCur
oo::define ClassCur method method1 {} {msgcat::mcpackagenamespaceget}
@@ -1185,7 +1212,7 @@ namespace eval ::msgcat::test {
$baz::ObjCur method1
} -result ::msgcat::test::bar
- test msgcat-16.3 {mcpackagenamespaceget in classless object} -setup {
+ test msgcat-16.4 {mcpackagenamespaceget in classless object} -setup {
namespace eval bar {
oo::object create ObjCur
oo::objdefine ObjCur method method1 {} {msgcat::mcpackagenamespaceget}
@@ -1196,7 +1223,7 @@ namespace eval ::msgcat::test {
bar::ObjCur method1
} -result ::msgcat::test::bar
- test msgcat-16.4\
+ test msgcat-16.5\
{mcpackagenamespaceget in classless object with explicite namespace eval}\
-setup {
namespace eval bar {
@@ -1216,7 +1243,12 @@ namespace eval ::msgcat::test {
# Test msgcat-17.*: mcn command
- test msgcat-17.1 {mcn} -setup {
+ test msgcat-17.1 {mcn no parameters} -body {
+ mcn
+ } -returnCodes 1\
+ -result {wrong # args: should be "mcn ns src ?arg ...?"}
+
+ test msgcat-17.2 {mcn} -setup {
namespace eval bar {::msgcat::mcset foo_BAR con1 con1bar}
variable locale [mclocale]
mclocale foo_BAR