Add a higher-level API for parsing attributes#155696
Add a higher-level API for parsing attributes#155696rust-bors[bot] merged 2 commits intorust-lang:mainfrom
Conversation
This comment has been minimized.
This comment has been minimized.
|
Reminder, once the PR becomes ready for a review, use |
5c92c1e to
067ef3d
Compare
|
Some changes occurred in compiler/rustc_attr_parsing cc @jdonszelmann, @JonathanBrouwer Some changes occurred to diagnostic attributes. cc @mejrs |
| // FIXME(scrabsha): once #155696 is merged, update this and mention the higher-level APIs. | ||
| /// Utility that deconstructs a MetaItem into usable parts. | ||
| /// | ||
| /// MetaItems are syntactically extremely flexible, but specific attributes want to parse | ||
| /// them in custom, more restricted ways. This can be done using this struct. | ||
| /// | ||
| /// MetaItems consist of some path, and some args. The args could be empty. In other words: | ||
| /// | ||
| /// - `name` -> args are empty | ||
| /// - `name(...)` -> args are a [`list`](ArgParser::list), which is the bit between the parentheses | ||
| /// - `name(...)` -> args are a [`list`](ArgParser::as_list), which is the bit between the parentheses | ||
| /// - `name = value`-> arg is [`name_value`](ArgParser::name_value), where the argument is the | ||
| /// `= value` part | ||
| /// | ||
| /// The syntax of MetaItems can be found at <https://doc.rust-lang.org/reference/attributes.html> |
There was a problem hiding this comment.
It felt wrong to mention AcceptContext::expect_list/AcceptContext::expect_single here given that the other functions don't exist yet. If that's good for you, I'll update this doc comment once all the AcceptContext::expect_* functions are implemented.
|
@JonathanBrouwer so this PR renames (I don't really have an opinion on what is better, it's up to you ^^) |
…thanBrouwer Add a higher-level API for parsing attributes
…uwer Rollup of 6 pull requests Successful merges: - #154803 (Fix ICE from cfg_attr_trace ) - #155485 (Add an edge-case test for `--remap-path-prefix` for `rustc` & `rustdoc`) - #155659 (cleanup, restructure and merge `tests/ui/deriving` into `tests/ui/derives`) - #155696 (Add a higher-level API for parsing attributes) - #155734 (Lint doc comments in cfg_select branches) - #155769 (triagebot.toml: Ping Enselic when tests/debuginfo/basic-stepping.rs changes)
…thanBrouwer Add a higher-level API for parsing attributes
…uwer Rollup of 5 pull requests Successful merges: - #154803 (Fix ICE from cfg_attr_trace ) - #155485 (Add an edge-case test for `--remap-path-prefix` for `rustc` & `rustdoc`) - #155659 (cleanup, restructure and merge `tests/ui/deriving` into `tests/ui/derives`) - #155696 (Add a higher-level API for parsing attributes) - #155769 (triagebot.toml: Ping Enselic when tests/debuginfo/basic-stepping.rs changes)
…uwer Rollup of 9 pull requests Successful merges: - #146181 (Add intrinsic for launch-sized workgroup memory on GPUs) - #154803 (Fix ICE from cfg_attr_trace ) - #155065 (Error on invalid macho section specifier) - #155485 (Add an edge-case test for `--remap-path-prefix` for `rustc` & `rustdoc`) - #155659 (cleanup, restructure and merge `tests/ui/deriving` into `tests/ui/derives`) - #155676 ( Reject implementing const Drop for types that are not const `Destruct` already) - #155696 (Add a higher-level API for parsing attributes) - #155769 (triagebot.toml: Ping Enselic when tests/debuginfo/basic-stepping.rs changes) - #155783 (Do not suggest internal cfg trace attributes)
Rollup merge of #155696 - scrabsha:push-kxqstpltlwzn, r=JonathanBrouwer Add a higher-level API for parsing attributes
I got quite frustrated that a lot of the attribute parsing API repeats the same pattern over and over:
(Example uses
list, but this happens to most of the methods inrustc_attr_parsing::parseractually)Besides the repetitions, here's why I don't like it:
This PR adds an
AcceptContext::expect_listmethod, allowing to replace the code in the previous snippet with:which I believe solves the concerns I wrote earlier.
I already introduced an
AcceptContext::expect_single_element_listmethod that follows similar style in #154827, and ideally I would like this PR to generalize this idea.I do not expect this higher-level API to replace the methods in
rustc_attr_parsing::parser, but rather to provide a higher-level version that can be used in most simple situations. This is explained both in the documentation added in this PR and in #154827 (comment).In the long term, I also hope we could make
AcceptContext::expect_listand friends push custom suggestions to the diagnostics and hopefully stop relying on the attributetemplatein future.The first commit introduces
AcceptContext::expect_listandAcceptContext::expect_singleand uses it where it makes sense to. I added only these two because I figured it would be a nice way to ask for feedback without investing too much time. The second commit adds documentation for the newly added methods.@JonathanBrouwer I think you're the best person to ask feedback from, let me know what you think!
I also tried to make the parsing functions return a
Result<Self, ErrorGuaranteed>, but I don't think it is possible due toCombine::finalize