|
25 | 25 | #' q <- eval_code(q, expression(assert_number(a))) |
26 | 26 | #' |
27 | 27 | #' @aliases eval_code,qenv-method |
| 28 | +#' @aliases eval_code,qenv.error-method |
28 | 29 | #' |
29 | 30 | #' @export |
30 | 31 | setGeneric("eval_code", function(object, code, cache = FALSE, ...) standardGeneric("eval_code")) |
31 | 32 |
|
32 | 33 | setMethod("eval_code", signature = c(object = "qenv"), function(object, code, cache = FALSE, ...) { |
33 | | - code <- .preprocess_code(code) # preprocess code to ensure it is a character vector |
| 34 | + if (!is.language(code) && !is.character(code)) { |
| 35 | + stop("eval_code accepts code being language or character") |
| 36 | + } |
| 37 | + code <- .preprocess_code(code) |
| 38 | + # preprocess code to ensure it is a character vector |
34 | 39 | .eval_code(object = object, code = code, cache = cache, ...) |
35 | 40 | }) |
36 | 41 |
|
37 | 42 | setMethod("eval_code", signature = c(object = "qenv.error"), function(object, code, cache = FALSE, ...) object) |
38 | 43 |
|
39 | 44 | #' @keywords internal |
40 | 45 | .eval_code <- function(object, code, cache = FALSE, ...) { |
| 46 | + if (identical(code, "")) { |
| 47 | + return(object) |
| 48 | + } |
41 | 49 | parsed_code <- parse(text = code, keep.source = TRUE) |
42 | 50 | object@.xData <- rlang::env_clone(object@.xData, parent = parent.env(.GlobalEnv)) |
43 | 51 | if (length(parsed_code) == 0) { |
@@ -100,17 +108,14 @@ setMethod("eval_code", signature = c(object = "qenv.error"), function(object, co |
100 | 108 | } |
101 | 109 |
|
102 | 110 | setGeneric(".preprocess_code", function(code) standardGeneric(".preprocess_code")) |
103 | | -setMethod(".preprocess_code", signature = c("ANY"), function(code) paste(code, collapse = "\n")) |
104 | | -setMethod(".preprocess_code", signature = c("language"), function(code) { |
105 | | - paste( |
106 | | - vapply(lang2calls(code), deparse1, collapse = "\n", character(1L)), |
107 | | - collapse = "\n" |
108 | | - ) |
109 | | -}) |
110 | | -setMethod(".preprocess_code", signature = c("expression"), function(code) { |
111 | | - if (length(attr(code, "wholeSrcref")) == 0L) { |
112 | | - paste(lang2calls(code), collapse = "\n") |
113 | | - } else { |
| 111 | +setMethod(".preprocess_code", signature = c("character"), function(code) paste(code, collapse = "\n")) |
| 112 | +setMethod(".preprocess_code", signature = c("ANY"), function(code) { |
| 113 | + if (is.expression(code) && length(attr(code, "wholeSrcref"))) { |
114 | 114 | paste(attr(code, "wholeSrcref"), collapse = "\n") |
| 115 | + } else { |
| 116 | + paste( |
| 117 | + vapply(lang2calls(code), deparse1, collapse = "\n", character(1L)), |
| 118 | + collapse = "\n" |
| 119 | + ) |
115 | 120 | } |
116 | 121 | }) |
0 commit comments