Uh oh!
There was an error while loading. Please reload this page.
Add a higher-level API for parsing attributes - #155696
Conversation
This comment has been minimized.
This comment has been minimized.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
rustbot
commented
Apr 23, 2026
Reminder, once the PR becomes ready for a review, use |
5c92c1e to
067ef3dComparerustbot
commented
Apr 24, 2026
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)
Uh oh!
There was an error while loading. Please reload this page.
Rollup merge of #155696 - scrabsha:push-kxqstpltlwzn, r=JonathanBrouwer Add a higher-level API for parsing attributes
doc: clarify attr parser APIs Follow up on rust-lang#155696 by documenting the higher-level `AcceptContext` helpers for common argument shapes. `MetaItemParser` remains the lower-level tool for attributes with custom restricted syntax. Remove the stale FIXME now that the helpers are available.
doc: clarify attr parser APIs Follow up on rust-lang#155696 by documenting the higher-level `AcceptContext` helpers for common argument shapes. `MetaItemParser` remains the lower-level tool for attributes with custom restricted syntax. Remove the stale FIXME now that the helpers are available.
doc: clarify attr parser APIs Follow up on rust-lang#155696 by documenting the higher-level `AcceptContext` helpers for common argument shapes. `MetaItemParser` remains the lower-level tool for attributes with custom restricted syntax. Remove the stale FIXME now that the helpers are available.
doc: clarify attr parser APIs Follow up on rust-lang#155696 by documenting the higher-level `AcceptContext` helpers for common argument shapes. `MetaItemParser` remains the lower-level tool for attributes with custom restricted syntax. Remove the stale FIXME now that the helpers are available.
Rollup merge of #159123 - kn1g78:doc/attr-parser-api, r=mejrs doc: clarify attr parser APIs Follow up on #155696 by documenting the higher-level `AcceptContext` helpers for common argument shapes. `MetaItemParser` remains the lower-level tool for attributes with custom restricted syntax. Remove the stale FIXME now that the helpers are available.
doc: clarify attr parser APIs Follow up on rust-lang/rust#155696 by documenting the higher-level `AcceptContext` helpers for common argument shapes. `MetaItemParser` remains the lower-level tool for attributes with custom restricted syntax. Remove the stale FIXME now that the helpers are available.
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