summaryrefslogtreecommitdiffstats
path: root/library/msgcat
diff options
context:
space:
mode:
authoroehhar <harald.oehlmann@elmicron.de>2018-01-10 23:17:43 (GMT)
committeroehhar <harald.oehlmann@elmicron.de>2018-01-10 23:17:43 (GMT)
commit3b5858bcd23542b0ff0249a128808ef20922beb6 (patch)
tree80a6011cd3e4ca43b94d8815ea05215761511ab6 /library/msgcat
parent48d6a20861f95be856bef0e780c054757c9c3803 (diff)
downloadtcl-3b5858bcd23542b0ff0249a128808ef20922beb6.zip
tcl-3b5858bcd23542b0ff0249a128808ef20922beb6.tar.gz
tcl-3b5858bcd23542b0ff0249a128808ef20922beb6.tar.bz2
TIP490: oo for msgcal: new solution enable any command for oo, new command mcpackagenamespacege
Diffstat (limited to 'library/msgcat')
-rw-r--r--library/msgcat/msgcat.tcl49
-rw-r--r--library/msgcat/pkgIndex.tcl2
2 files changed, 38 insertions, 13 deletions
diff --git a/library/msgcat/msgcat.tcl b/library/msgcat/msgcat.tcl
index 646bc17..849adc6 100644
--- a/library/msgcat/msgcat.tcl
+++ b/library/msgcat/msgcat.tcl
@@ -14,12 +14,12 @@
package require Tcl 8.5-
# When the version number changes, be sure to update the pkgIndex.tcl file,
# and the installation directory in the Makefiles.
-package provide msgcat 1.6.1
+package provide msgcat 1.6.2
namespace eval msgcat {
namespace export mc mcexists mcload mclocale mcmax mcmset mcpreferences mcset\
mcunknown mcflset mcflmset mcloadedlocales mcforgetpackage\
- mcpackageconfig mcpackagelocale
+ mcpackagenamespaceget mcpackageconfig mcpackagelocale
# Records the list of locales to search
variable Loclist {}
@@ -193,9 +193,6 @@ namespace eval msgcat {
# format command.
proc msgcat::mc {src args} {
- # this may be replaced by:
- # return [mcget -namespace [uplevel 1 [list ::namespace current]] --\
- # $src {*}$args]
# Check for the src in each namespace starting from the local and
# ending in the global.
@@ -203,7 +200,7 @@ proc msgcat::mc {src args} {
variable Msgs
variable Loclist
- set ns [uplevel 1 [list ::namespace current]]
+ set ns [PackageNamespaceGet]
set loclist [PackagePreferences $ns]
set nscur $ns
@@ -245,7 +242,7 @@ proc msgcat::mcexists {args} {
variable Loclist
variable PackageConfig
- set ns [uplevel 1 [list ::namespace current]]
+ set ns [PackageNamespaceGet]
set loclist [PackagePreferences $ns]
while {[llength $args] != 1} {
@@ -462,7 +459,7 @@ proc msgcat::mcpackagelocale {subcommand {locale ""}} {
}
set locale [string tolower $locale]
}
- set ns [uplevel 1 {::namespace current}]
+ set ns [PackageNamespaceGet]
switch -exact -- $subcommand {
get { return [lindex [PackagePreferences $ns] 0] }
@@ -551,7 +548,7 @@ proc msgcat::mcforgetpackage {} {
# todo: this may be implemented using an ensemble
variable PackageConfig
variable Msgs
- set ns [uplevel 1 {::namespace current}]
+ set ns [PackageNamespaceGet]
# Remove MC items
dict unset Msgs $ns
# Remove config items
@@ -561,6 +558,15 @@ proc msgcat::mcforgetpackage {} {
return
}
+# msgcat::mcgetmynamespace --
+#
+# Return the package namespace of the caller
+# This consideres to be called from a class or object.
+
+proc msgcat::mcpackagenamespaceget {} {
+ return [PackageNamespaceGet]
+}
+
# msgcat::mcpackageconfig --
#
# Get or modify the per caller namespace (e.g. packages) config options.
@@ -616,7 +622,7 @@ proc msgcat::mcforgetpackage {} {
proc msgcat::mcpackageconfig {subcommand option {value ""}} {
variable PackageConfig
# get namespace
- set ns [uplevel 1 {::namespace current}]
+ set ns [PackageNamespaceGet]
if {$option ni {"mcfolder" "loadcmd" "changecmd" "unknowncmd"}} {
return -code error "bad option \"$option\": must be mcfolder, loadcmd,\
@@ -923,7 +929,7 @@ proc msgcat::mcset {locale src {dest ""}} {
set dest $src
}
- set ns [uplevel 1 [list ::namespace current]]
+ set ns [PackageNamespaceGet]
set locale [string tolower $locale]
@@ -975,7 +981,7 @@ proc msgcat::mcmset {locale pairs} {
}
set locale [string tolower $locale]
- set ns [uplevel 1 [list ::namespace current]]
+ set ns [PackageNamespaceGet]
foreach {src dest} $pairs {
dict set Msgs $ns $locale $src $dest
@@ -1106,6 +1112,25 @@ proc msgcat::ConvertLocale {value} {
return $ret
}
+# helper function to find package namespace of stack-frame -2
+# There are 3 possibilities:
+# - called from a proc
+# - called from a oo class
+# - called from a classless oo object
+proc ::msgcat::PackageNamespaceGet {} {
+ uplevel 2 {
+ # Check for no object
+ if {0 == [llength [info commands self]]} {return [namespace current]}
+ 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]
+ }
+}
+
# Initialize the default locale
proc msgcat::Init {} {
global env
diff --git a/library/msgcat/pkgIndex.tcl b/library/msgcat/pkgIndex.tcl
index 72c5dc0..bc58cbe 100644
--- a/library/msgcat/pkgIndex.tcl
+++ b/library/msgcat/pkgIndex.tcl
@@ -1,2 +1,2 @@
if {![package vsatisfies [package provide Tcl] 8.5-]} {return}
-package ifneeded msgcat 1.6.1 [list source [file join $dir msgcat.tcl]]
+package ifneeded msgcat 1.6.2 [list source [file join $dir msgcat.tcl]]