blob: 053cb842625387acb28e8e58a9b3c8675d4d0cc4 [file] [log] [blame]
# File src/library/methods/R/packageName.R
# Part of the R package, https://www.R-project.org
#
# Copyright (C) 1995-2015 The R Core Team
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# A copy of the GNU General Public License is available at
# https://www.R-project.org/Licenses/
## utilities to manage package names
getPackageName <- function(where = topenv(parent.frame()), create = TRUE) {
env <- as.environment(where)
pkg <- get0(".packageName", env, inherits = FALSE)
saved <- !is.null(pkg)
if (saved) {
return(pkg)
}
else {
pkg <- if(identical(where, 1) || identical(env, topenv(parent.frame())))
Sys.getenv("R_PACKAGE_NAME")
else ""
}
envName <- environmentName(env)
if(nzchar(envName) && regexpr("package:", envName, fixed = TRUE) == 1L)
pkg <- .rmpkg(envName)
if(!nzchar(pkg)) { ## is still ""
if(identical(env, .GlobalEnv))
pkg <- ".GlobalEnv"
else if(identical(env, .BaseNamespaceEnv))
pkg <- "base"
else {
if(is.numeric(where))
pkg <- search()[[where]]
else if(is.environment(where)) {
for(db in search())
if(identical(as.environment(db), where)) {
pkg <- db; break
}
}
else if(nzchar(envName))
pkg <- envName
else
pkg <- as.character(where)
pkg <- .rmpkg(pkg)
}
# Problem: the library() function should now be putting .packageName in package environments
# but namespace makes them invisible from outside.
## save the package name, but .GlobalEnv is not a package name,
## and package base doesn't have a .packageName (yet?)
# if(!(identical(pkg, ".GlobalEnv") || identical(pkg, "base")) ) {
# setPackageName(pkg, env)
# ## packages OUGHT
# ## to be self-identifying
# warning("The package name \"", pkg, "\" was inferred, but not found in that package")
# }
}
if (!nzchar(pkg)) {
top <- topenv(env)
if (!identical(top, env)) {
pkg <- getPackageName(top, create=create)
}
}
if(!nzchar(pkg) && create) {
pkg <- as.character(Sys.time())
warning(gettextf("Created a package name, %s, when none found",
sQuote(pkg)),
domain = NA)
if(!saved && !environmentIsLocked(env))
setPackageName(pkg, env)
}
pkg
}
setPackageName <- function(pkg, env)
assign(".packageName", pkg, envir = env)
##FIXME: rather than an attribute, the className should have a formal class
## (but there may be bootstrap problems)
packageSlot <- function(object)
attr(object, "package")
`packageSlot<-` <- function(object, value) {
attr(object, "package") <- value
object
}