Skip to content

Commit 6c4670f

Browse files
committed
Eliminate tag registry in favour of S3 method
1 parent 8c82a07 commit 6c4670f

23 files changed

+359
-304
lines changed

NAMESPACE

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,62 @@ S3method(roclet_preprocess,roclet_namespace)
7474
S3method(roclet_process,roclet_namespace)
7575
S3method(roclet_process,roclet_rd)
7676
S3method(roclet_process,roclet_vignette)
77-
S3method(roclet_tags,roclet_namespace)
78-
S3method(roclet_tags,roclet_rd)
79-
S3method(roclet_tags,roclet_vignette)
77+
S3method(roxy_tag_parse,default)
78+
S3method(roxy_tag_parse,roxy_tag_aliases)
79+
S3method(roxy_tag_parse,roxy_tag_author)
80+
S3method(roxy_tag_parse,roxy_tag_backref)
81+
S3method(roxy_tag_parse,roxy_tag_concept)
82+
S3method(roxy_tag_parse,roxy_tag_describeIn)
83+
S3method(roxy_tag_parse,roxy_tag_description)
84+
S3method(roxy_tag_parse,roxy_tag_details)
85+
S3method(roxy_tag_parse,roxy_tag_docType)
86+
S3method(roxy_tag_parse,roxy_tag_encoding)
87+
S3method(roxy_tag_parse,roxy_tag_eval)
88+
S3method(roxy_tag_parse,roxy_tag_evalNamespace)
89+
S3method(roxy_tag_parse,roxy_tag_evalRd)
90+
S3method(roxy_tag_parse,roxy_tag_example)
91+
S3method(roxy_tag_parse,roxy_tag_examples)
92+
S3method(roxy_tag_parse,roxy_tag_export)
93+
S3method(roxy_tag_parse,roxy_tag_exportClass)
94+
S3method(roxy_tag_parse,roxy_tag_exportMethod)
95+
S3method(roxy_tag_parse,roxy_tag_exportPattern)
96+
S3method(roxy_tag_parse,roxy_tag_exportS3Method)
97+
S3method(roxy_tag_parse,roxy_tag_family)
98+
S3method(roxy_tag_parse,roxy_tag_field)
99+
S3method(roxy_tag_parse,roxy_tag_format)
100+
S3method(roxy_tag_parse,roxy_tag_import)
101+
S3method(roxy_tag_parse,roxy_tag_importClassesFrom)
102+
S3method(roxy_tag_parse,roxy_tag_importFrom)
103+
S3method(roxy_tag_parse,roxy_tag_importMethodsFrom)
104+
S3method(roxy_tag_parse,roxy_tag_include)
105+
S3method(roxy_tag_parse,roxy_tag_includeRmd)
106+
S3method(roxy_tag_parse,roxy_tag_inherit)
107+
S3method(roxy_tag_parse,roxy_tag_inheritDotParams)
108+
S3method(roxy_tag_parse,roxy_tag_inheritParams)
109+
S3method(roxy_tag_parse,roxy_tag_inheritSection)
110+
S3method(roxy_tag_parse,roxy_tag_keywords)
111+
S3method(roxy_tag_parse,roxy_tag_md)
112+
S3method(roxy_tag_parse,roxy_tag_method)
113+
S3method(roxy_tag_parse,roxy_tag_name)
114+
S3method(roxy_tag_parse,roxy_tag_noMd)
115+
S3method(roxy_tag_parse,roxy_tag_noRd)
116+
S3method(roxy_tag_parse,roxy_tag_note)
117+
S3method(roxy_tag_parse,roxy_tag_order)
118+
S3method(roxy_tag_parse,roxy_tag_param)
119+
S3method(roxy_tag_parse,roxy_tag_rawNamespace)
120+
S3method(roxy_tag_parse,roxy_tag_rawRd)
121+
S3method(roxy_tag_parse,roxy_tag_rdname)
122+
S3method(roxy_tag_parse,roxy_tag_references)
123+
S3method(roxy_tag_parse,roxy_tag_return)
124+
S3method(roxy_tag_parse,roxy_tag_section)
125+
S3method(roxy_tag_parse,roxy_tag_seealso)
126+
S3method(roxy_tag_parse,roxy_tag_slot)
127+
S3method(roxy_tag_parse,roxy_tag_source)
128+
S3method(roxy_tag_parse,roxy_tag_template)
129+
S3method(roxy_tag_parse,roxy_tag_templateVar)
130+
S3method(roxy_tag_parse,roxy_tag_title)
131+
S3method(roxy_tag_parse,roxy_tag_usage)
132+
S3method(roxy_tag_parse,roxy_tag_useDynLib)
80133
export(block_get_tag)
81134
export(block_get_tag_value)
82135
export(block_get_tags)
@@ -106,6 +159,7 @@ export(roclet_process)
106159
export(roclet_tags)
107160
export(roxy_block)
108161
export(roxy_tag)
162+
export(roxy_tag_parse)
109163
export(roxy_tag_warning)
110164
export(roxygenise)
111165
export(roxygenize)

NEWS.md

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
# roxygen2 (development version)
22

3+
* `roclet_tags()` is no longer used; instead define a `roxy_tag_parse()` method.
4+
If you tag is `@mytag`, then the class name associated with it is
5+
`roxy_tag_mytag` so the method should be call `roxy_tag_parse.roxy_tag_mytag()`.
6+
Note that there is no namespacing so if you're defining multiple new tags
7+
I recommend using your package name as common prefix.
8+
9+
This means that the `registry` argument is no longer needed and has been
10+
removed.
11+
12+
* `tag_two_part()` and `tag_words()` are now regular functions.
13+
314
* The internal `roxy_tag()` gains a new field: `raw`. This now always contains
415
the raw string value parsed from the file. `val` is only set after the tag
516
has been parsed.
@@ -172,11 +183,6 @@
172183
* `tag_markdown_restricted()` has been removed because it did exactly the
173184
same think as `tag_markdown()`.
174185

175-
* Roclets have now aliases to all the tags that they define so that you can
176-
do (e.g.) `?"@export"`. These help files are generally not that useful, but
177-
they do now provide basic examples, and point you towards the vignettes the
178-
provide full details.
179-
180186
* Package documentation now converts ORCIDs into a useful link (#721).
181187

182188
* Empty roxygen2 lines at the start of a block are now silently removed (#710).

R/block.R

Lines changed: 13 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,9 @@ print.roxy_block <- function(x, ...) {
7474
}
7575

7676
block_create <- function(tokens, call, srcref,
77-
registry = list(),
7877
global_options = list()) {
7978

80-
tags <- parse_tags(tokens,
81-
registry = registry,
82-
global_options = global_options
83-
)
79+
tags <- parse_tags(tokens, global_options = global_options)
8480
if (length(tags) == 0) return()
8581

8682
roxy_block(tags,
@@ -91,17 +87,15 @@ block_create <- function(tokens, call, srcref,
9187
}
9288

9389
block_set_env <- function(block, env,
94-
registry = list(),
9590
global_options = list()
9691
) {
9792

98-
block <- block_evaluate(block, env, registry = registry, global_options = global_options)
93+
block <- block_evaluate(block, env, global_options = global_options)
9994
block <- block_find_object(block, env)
10095
block
10196
}
10297

10398
block_evaluate <- function(block, env,
104-
registry = list(),
10599
global_options = list()
106100
) {
107101

@@ -125,10 +119,7 @@ block_evaluate <- function(block, env,
125119
file = block$file,
126120
offset = block$line
127121
)
128-
tags <- lapply(tokens, parse_tags,
129-
registry = registry,
130-
global_options = global_options
131-
)
122+
tags <- lapply(tokens, parse_tags, global_options = global_options)
132123

133124
# Interpolate results back into original locations
134125
block_replace_tags(block, "eval", tags)
@@ -208,27 +199,21 @@ block_replace_tags <- function(block, tags, values) {
208199

209200
# parsing -----------------------------------------------------------------
210201

211-
parse_tags <- function(tokens, registry = list(), global_options = list()) {
202+
parse_tags <- function(tokens, global_options = list()) {
212203
markdown_activate(tokens, global_options = global_options)
213204

214205
tokens <- parse_description(tokens)
215-
compact(lapply(tokens, parse_tag, registry = registry))
206+
compact(lapply(tokens, roxy_tag_parse))
216207
}
217208

218-
parse_tag <- function(x, registry) {
219-
stopifnot(is.roxy_tag(x))
220-
221-
if (identical(x$tag, "eval")) {
222-
tag_code(x)
223-
} else if (identical(x$tag, "include")) {
224-
tag_value(x)
225-
} else if (identical(x$tag, "order")) {
226-
tag_value(x)
227-
} else if (x$tag %in% ls(registry)) {
228-
registry[[x$tag]](x)
229-
} else {
230-
roxy_tag_warning(x, "unknown tag")
231-
}
209+
#' @export
210+
roxy_tag_parse.roxy_tag_eval <- function(x) {
211+
tag_code(x)
212+
}
213+
214+
#' @export
215+
roxy_tag_parse.roxy_tag_include <- function(x) {
216+
tag_value(x)
232217
}
233218

234219
parse_description <- function(tags) {

R/namespace.R

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ ns_tags <- c(
3333
#'
3434
#' @family roclets
3535
#' @export
36-
#' @eval tag_aliases(roclet_tags.roclet_namespace)
3736
#' @examples
3837
#' # The most common namespace tag is @@export, which declares that a function
3938
#' # is part of the external interface of your package
@@ -79,22 +78,29 @@ roclet_process.roclet_namespace <- function(x,
7978
}
8079

8180
#' @export
82-
roclet_tags.roclet_namespace <- function(x) {
83-
list(
84-
evalNamespace = tag_code,
85-
export = tag_words_line,
86-
exportClass = tag_words(1),
87-
exportS3Method = tag_words(min = 0, max = 2),
88-
exportMethod = tag_words(1),
89-
exportPattern = tag_words(1),
90-
import = tag_words(1),
91-
importClassesFrom = tag_words(2),
92-
importFrom = tag_words(2),
93-
importMethodsFrom = tag_words(2),
94-
rawNamespace = tag_code,
95-
useDynLib = tag_words(1)
96-
)
97-
}
81+
roxy_tag_parse.roxy_tag_evalNamespace <- function(x) tag_code(x)
82+
#' @export
83+
roxy_tag_parse.roxy_tag_export <- function(x) tag_words_line(x)
84+
#' @export
85+
roxy_tag_parse.roxy_tag_exportClass <- function(x) tag_words(x, 1)
86+
#' @export
87+
roxy_tag_parse.roxy_tag_exportS3Method <- function(x) tag_words(x, min = 0, max = 2)
88+
#' @export
89+
roxy_tag_parse.roxy_tag_exportMethod <- function(x) tag_words(x, min = 1)
90+
#' @export
91+
roxy_tag_parse.roxy_tag_exportPattern <- function(x) tag_words(x, min = 1)
92+
#' @export
93+
roxy_tag_parse.roxy_tag_import <- function(x) tag_words(x, min = 1)
94+
#' @export
95+
roxy_tag_parse.roxy_tag_importClassesFrom <- function(x) tag_words(x, min = 2)
96+
#' @export
97+
roxy_tag_parse.roxy_tag_importFrom <- function(x) tag_words(x, min = 2)
98+
#' @export
99+
roxy_tag_parse.roxy_tag_importMethodsFrom <- function(x) tag_words(x, min = 2)
100+
#' @export
101+
roxy_tag_parse.roxy_tag_rawNamespace <- function(x) tag_code(x)
102+
#' @export
103+
roxy_tag_parse.roxy_tag_useDynLib <- function(x) tag_words(x, min = 1)
98104

99105
#' @export
100106
roclet_output.roclet_namespace <- function(x, results, base_path, ...) {

R/parse.R

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@
1515
#' You can also set to `NULL` if you only want to get the tokenized code
1616
#' blocks only. This suppresses evaluation of `@eval` tags, and will not
1717
#' find the code object associated with each block.
18-
#' @param registry A roclet tag registry: this is a named list where the
19-
#' name gives the tag and the value gives the parsing code. See the
20-
#' `tag_` functions in [roxy_tag] for built-in options.
2118
#' @param global_options A list of global options:
2219
#'
2320
#' * `wrap` Logical; should roxygen2 output be wrapped? `FALSE` by default.
@@ -27,13 +24,11 @@
2724
#' @keywords internal
2825
parse_package <- function(path = ".",
2926
env = env_package(path),
30-
registry = default_tags(),
3127
global_options = list()
3228
) {
3329

3430
files <- package_files(path)
3531
list_of_blocks <- lapply(files, tokenize_file,
36-
registry = registry,
3732
global_options = global_options
3833
)
3934

@@ -42,7 +37,6 @@ parse_package <- function(path = ".",
4237
if (!is.null(env)) {
4338
blocks <- lapply(blocks, block_set_env,
4439
env = env,
45-
registry = registry,
4640
global_options = global_options
4741
)
4842
}
@@ -55,20 +49,17 @@ parse_package <- function(path = ".",
5549
#' @rdname parse_package
5650
parse_file <- function(file,
5751
env = env_file(file),
58-
registry = default_tags(),
5952
global_options = list(),
6053
srcref_path = NULL) {
6154

6255
blocks <- tokenize_file(file,
63-
registry = registry,
6456
global_options = global_options,
6557
srcref_path = srcref_path
6658
)
6759

6860
if (!is.null(env)) {
6961
blocks <- lapply(blocks, block_set_env,
7062
env = env,
71-
registry = registry,
7263
global_options = global_options
7364
)
7465
}
@@ -81,7 +72,6 @@ parse_file <- function(file,
8172
#' @rdname parse_package
8273
parse_text <- function(text,
8374
env = env_file(file),
84-
registry = default_tags(),
8575
global_options = list()) {
8676

8777
file <- tempfile()
@@ -91,7 +81,6 @@ parse_text <- function(text,
9181
blocks <- parse_file(
9282
file,
9383
env = env,
94-
registry = registry,
9584
global_options = global_options,
9685
srcref_path = "<text>"
9786
)
@@ -130,3 +119,8 @@ order_blocks <- function(blocks) {
130119
ord <- vapply(blocks, block_order, double(1))
131120
blocks[order(ord)]
132121
}
122+
123+
#' @export
124+
roxy_tag_parse.roxy_tag_order <- function(x) {
125+
tag_value(x)
126+
}

R/rd-template.R

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,7 @@ process_templates <- function(block, base_path, global_options = list()) {
3434

3535
results <- lapply(paths, template_eval, vars = list2env(vars))
3636
tokens <- lapply(results, tokenise_block, file = "TEMPLATE", offset = 0L)
37-
tags <- lapply(tokens, parse_tags,
38-
registry = roclet_tags.roclet_rd(list()),
39-
global_options = global_options
40-
)
37+
tags <- lapply(tokens, parse_tags, global_options = global_options)
4138

4239
# Insert templates back in the location where they came from
4340
block_replace_tags(block, "template", tags)

0 commit comments

Comments
 (0)