Add a higher-level API for parsing attributes - #155696

Merged
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
scrabsha:push-kxqstpltlwzn
Apr 26, 2026
Merged

Add a higher-level API for parsing attributes#155696
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
scrabsha:push-kxqstpltlwzn

Conversation

@scrabsha

@scrabshascrabsha commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

I got quite frustrated that a lot of the attribute parsing API repeats the same pattern over and over:

letSome(list) = args.list()else{
cx.expected_list(args, span);returnNone;}

(Example uses list, but this happens to most of the methods in rustc_attr_parsing::parser actually)

Besides the repetitions, here's why I don't like it:

  • It separates the checks on the attribute arguments with the error emission
  • Early returns are explicit and take a lot of space
  • It is quite easy to accidentally generate an error message that has little to do with the check that has just been done (I already fixed things in 1, 2)
  • I am convinced that APIs that require too much boilerplate and repetitions give people an incentive to use Automated Code Generation Tools ™️ and I would like to avoid giving this incentive.

This PR adds an AcceptContext::expect_list method, allowing to replace the code in the previous snippet with:

let list = cx.expect_list(args, span)?;

which I believe solves the concerns I wrote earlier.

I already introduced an AcceptContext::expect_single_element_list method 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_list and friends push custom suggestions to the diagnostics and hopefully stop relying on the attribute template in future.

The first commit introduces AcceptContext::expect_list and AcceptContext::expect_single and 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 to Combine::finalize

@rustbotrustbot added A-attributes Area: Attributes (`#[…]`, `#![…]`) S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 23, 2026
@JonathanBrouwerJonathanBrouwer self-assigned this Apr 23, 2026
@rust-log-analyzer

This comment has been minimized.

Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
Comment threadcompiler/rustc_attr_parsing/src/context.rs
Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Apr 24, 2026
@scrabsha
scrabsha marked this pull request as ready for review April 24, 2026 15:56
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in compiler/rustc_attr_parsing

cc @jdonszelmann, @JonathanBrouwer

Some changes occurred to diagnostic attributes.

cc @mejrs

Comment on lines +258 to 271
// 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>

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@scrabsha

scrabsha commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

@JonathanBrouwer so this PR renames list -> as_list and single -> as_single. should I immediately rename every method in parser.rs or is it ok if I only rename the other methods as I implement their replacement?

(I don't really have an opinion on what is better, it's up to you ^^)

@JonathanBrouwerJonathanBrouwer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rust-bors

rust-borsBot commented Apr 25, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 067ef3d has been approved by JonathanBrouwer

It is now in the queue for this repository.

@rust-borsrust-borsBot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Apr 25, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Apr 25, 2026
…thanBrouwer
Add a higher-level API for parsing attributes
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Apr 25, 2026
…thanBrouwer
Add a higher-level API for parsing attributes
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
@rust-bors
rust-borsBot merged commit 97dd613 into rust-lang:mainApr 26, 2026
11 checks passed
@rustbotrustbot added this to the 1.97.0 milestone Apr 26, 2026
rust-timer added a commit that referenced this pull request Apr 26, 2026
Rollup merge of #155696 - scrabsha:push-kxqstpltlwzn, r=JonathanBrouwer
Add a higher-level API for parsing attributes
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
rust-timer added a commit that referenced this pull request Jul 13, 2026
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.
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jul 16, 2026
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.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-attributesArea: Attributes (`#[…]`, `#![…]`)S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@scrabsha@rust-log-analyzer@rustbot@JonathanBrouwer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add a higher-level API for parsing attributes - #155696

Merged
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
scrabsha:push-kxqstpltlwzn
Apr 26, 2026
Merged

Add a higher-level API for parsing attributes#155696
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
scrabsha:push-kxqstpltlwzn

Conversation

@scrabsha

@scrabshascrabsha commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

I got quite frustrated that a lot of the attribute parsing API repeats the same pattern over and over:

letSome(list) = args.list()else{
cx.expected_list(args, span);returnNone;}

(Example uses list, but this happens to most of the methods in rustc_attr_parsing::parser actually)

Besides the repetitions, here's why I don't like it:

  • It separates the checks on the attribute arguments with the error emission
  • Early returns are explicit and take a lot of space
  • It is quite easy to accidentally generate an error message that has little to do with the check that has just been done (I already fixed things in 1, 2)
  • I am convinced that APIs that require too much boilerplate and repetitions give people an incentive to use Automated Code Generation Tools ™️ and I would like to avoid giving this incentive.

This PR adds an AcceptContext::expect_list method, allowing to replace the code in the previous snippet with:

let list = cx.expect_list(args, span)?;

which I believe solves the concerns I wrote earlier.

I already introduced an AcceptContext::expect_single_element_list method 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_list and friends push custom suggestions to the diagnostics and hopefully stop relying on the attribute template in future.

The first commit introduces AcceptContext::expect_list and AcceptContext::expect_single and 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 to Combine::finalize

@rustbotrustbot added A-attributes Area: Attributes (`#[…]`, `#![…]`) S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 23, 2026
@JonathanBrouwerJonathanBrouwer self-assigned this Apr 23, 2026
@rust-log-analyzer

This comment has been minimized.

Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
Comment threadcompiler/rustc_attr_parsing/src/context.rs
Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Apr 24, 2026
@scrabsha
scrabsha marked this pull request as ready for review April 24, 2026 15:56
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in compiler/rustc_attr_parsing

cc @jdonszelmann, @JonathanBrouwer

Some changes occurred to diagnostic attributes.

cc @mejrs

Comment on lines +258 to 271
// 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>

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@scrabsha

scrabsha commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

@JonathanBrouwer so this PR renames list -> as_list and single -> as_single. should I immediately rename every method in parser.rs or is it ok if I only rename the other methods as I implement their replacement?

(I don't really have an opinion on what is better, it's up to you ^^)

@JonathanBrouwerJonathanBrouwer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rust-bors

rust-borsBot commented Apr 25, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 067ef3d has been approved by JonathanBrouwer

It is now in the queue for this repository.

@rust-borsrust-borsBot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Apr 25, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Apr 25, 2026
…thanBrouwer
Add a higher-level API for parsing attributes
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Apr 25, 2026
…thanBrouwer
Add a higher-level API for parsing attributes
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
@rust-bors
rust-borsBot merged commit 97dd613 into rust-lang:mainApr 26, 2026
11 checks passed
@rustbotrustbot added this to the 1.97.0 milestone Apr 26, 2026
rust-timer added a commit that referenced this pull request Apr 26, 2026
Rollup merge of #155696 - scrabsha:push-kxqstpltlwzn, r=JonathanBrouwer
Add a higher-level API for parsing attributes
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
rust-timer added a commit that referenced this pull request Jul 13, 2026
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.
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jul 16, 2026
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.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-attributesArea: Attributes (`#[…]`, `#![…]`)S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@scrabsha@rust-log-analyzer@rustbot@JonathanBrouwer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add a higher-level API for parsing attributes - #155696

Merged
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
scrabsha:push-kxqstpltlwzn
Apr 26, 2026
Merged

Add a higher-level API for parsing attributes#155696
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
scrabsha:push-kxqstpltlwzn

Conversation

@scrabsha

@scrabshascrabsha commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

I got quite frustrated that a lot of the attribute parsing API repeats the same pattern over and over:

letSome(list) = args.list()else{
cx.expected_list(args, span);returnNone;}

(Example uses list, but this happens to most of the methods in rustc_attr_parsing::parser actually)

Besides the repetitions, here's why I don't like it:

  • It separates the checks on the attribute arguments with the error emission
  • Early returns are explicit and take a lot of space
  • It is quite easy to accidentally generate an error message that has little to do with the check that has just been done (I already fixed things in 1, 2)
  • I am convinced that APIs that require too much boilerplate and repetitions give people an incentive to use Automated Code Generation Tools ™️ and I would like to avoid giving this incentive.

This PR adds an AcceptContext::expect_list method, allowing to replace the code in the previous snippet with:

let list = cx.expect_list(args, span)?;

which I believe solves the concerns I wrote earlier.

I already introduced an AcceptContext::expect_single_element_list method 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_list and friends push custom suggestions to the diagnostics and hopefully stop relying on the attribute template in future.

The first commit introduces AcceptContext::expect_list and AcceptContext::expect_single and 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 to Combine::finalize

@rustbotrustbot added A-attributes Area: Attributes (`#[…]`, `#![…]`) S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 23, 2026
@JonathanBrouwerJonathanBrouwer self-assigned this Apr 23, 2026
@rust-log-analyzer

This comment has been minimized.

Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
Comment threadcompiler/rustc_attr_parsing/src/context.rs
Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Apr 24, 2026
@scrabsha
scrabsha marked this pull request as ready for review April 24, 2026 15:56
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in compiler/rustc_attr_parsing

cc @jdonszelmann, @JonathanBrouwer

Some changes occurred to diagnostic attributes.

cc @mejrs

Comment on lines +258 to 271
// 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>

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@scrabsha

scrabsha commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

@JonathanBrouwer so this PR renames list -> as_list and single -> as_single. should I immediately rename every method in parser.rs or is it ok if I only rename the other methods as I implement their replacement?

(I don't really have an opinion on what is better, it's up to you ^^)

@JonathanBrouwerJonathanBrouwer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rust-bors

rust-borsBot commented Apr 25, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 067ef3d has been approved by JonathanBrouwer

It is now in the queue for this repository.

@rust-borsrust-borsBot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Apr 25, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Apr 25, 2026
…thanBrouwer
Add a higher-level API for parsing attributes
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Apr 25, 2026
…thanBrouwer
Add a higher-level API for parsing attributes
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
@rust-bors
rust-borsBot merged commit 97dd613 into rust-lang:mainApr 26, 2026
11 checks passed
@rustbotrustbot added this to the 1.97.0 milestone Apr 26, 2026
rust-timer added a commit that referenced this pull request Apr 26, 2026
Rollup merge of #155696 - scrabsha:push-kxqstpltlwzn, r=JonathanBrouwer
Add a higher-level API for parsing attributes
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
rust-timer added a commit that referenced this pull request Jul 13, 2026
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.
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jul 16, 2026
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.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-attributesArea: Attributes (`#[…]`, `#![…]`)S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@scrabsha@rust-log-analyzer@rustbot@JonathanBrouwer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add a higher-level API for parsing attributes - #155696

Merged
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
scrabsha:push-kxqstpltlwzn
Apr 26, 2026
Merged

Add a higher-level API for parsing attributes#155696
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
scrabsha:push-kxqstpltlwzn

Conversation

@scrabsha

@scrabshascrabsha commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

I got quite frustrated that a lot of the attribute parsing API repeats the same pattern over and over:

letSome(list) = args.list()else{
cx.expected_list(args, span);returnNone;}

(Example uses list, but this happens to most of the methods in rustc_attr_parsing::parser actually)

Besides the repetitions, here's why I don't like it:

  • It separates the checks on the attribute arguments with the error emission
  • Early returns are explicit and take a lot of space
  • It is quite easy to accidentally generate an error message that has little to do with the check that has just been done (I already fixed things in 1, 2)
  • I am convinced that APIs that require too much boilerplate and repetitions give people an incentive to use Automated Code Generation Tools ™️ and I would like to avoid giving this incentive.

This PR adds an AcceptContext::expect_list method, allowing to replace the code in the previous snippet with:

let list = cx.expect_list(args, span)?;

which I believe solves the concerns I wrote earlier.

I already introduced an AcceptContext::expect_single_element_list method 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_list and friends push custom suggestions to the diagnostics and hopefully stop relying on the attribute template in future.

The first commit introduces AcceptContext::expect_list and AcceptContext::expect_single and 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 to Combine::finalize

@rustbotrustbot added A-attributes Area: Attributes (`#[…]`, `#![…]`) S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 23, 2026
@JonathanBrouwerJonathanBrouwer self-assigned this Apr 23, 2026
@rust-log-analyzer

This comment has been minimized.

Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
Comment threadcompiler/rustc_attr_parsing/src/context.rs
Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Apr 24, 2026
@scrabsha
scrabsha marked this pull request as ready for review April 24, 2026 15:56
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in compiler/rustc_attr_parsing

cc @jdonszelmann, @JonathanBrouwer

Some changes occurred to diagnostic attributes.

cc @mejrs

Comment on lines +258 to 271
// 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>

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@scrabsha

scrabsha commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

@JonathanBrouwer so this PR renames list -> as_list and single -> as_single. should I immediately rename every method in parser.rs or is it ok if I only rename the other methods as I implement their replacement?

(I don't really have an opinion on what is better, it's up to you ^^)

@JonathanBrouwerJonathanBrouwer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rust-bors

rust-borsBot commented Apr 25, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 067ef3d has been approved by JonathanBrouwer

It is now in the queue for this repository.

@rust-borsrust-borsBot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Apr 25, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Apr 25, 2026
…thanBrouwer
Add a higher-level API for parsing attributes
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Apr 25, 2026
…thanBrouwer
Add a higher-level API for parsing attributes
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
@rust-bors
rust-borsBot merged commit 97dd613 into rust-lang:mainApr 26, 2026
11 checks passed
@rustbotrustbot added this to the 1.97.0 milestone Apr 26, 2026
rust-timer added a commit that referenced this pull request Apr 26, 2026
Rollup merge of #155696 - scrabsha:push-kxqstpltlwzn, r=JonathanBrouwer
Add a higher-level API for parsing attributes
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
rust-timer added a commit that referenced this pull request Jul 13, 2026
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.
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jul 16, 2026
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.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-attributesArea: Attributes (`#[…]`, `#![…]`)S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@scrabsha@rust-log-analyzer@rustbot@JonathanBrouwer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add a higher-level API for parsing attributes - #155696

Merged
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
scrabsha:push-kxqstpltlwzn
Apr 26, 2026
Merged

Add a higher-level API for parsing attributes#155696
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
scrabsha:push-kxqstpltlwzn

Conversation

@scrabsha

@scrabshascrabsha commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

I got quite frustrated that a lot of the attribute parsing API repeats the same pattern over and over:

letSome(list) = args.list()else{
cx.expected_list(args, span);returnNone;}

(Example uses list, but this happens to most of the methods in rustc_attr_parsing::parser actually)

Besides the repetitions, here's why I don't like it:

  • It separates the checks on the attribute arguments with the error emission
  • Early returns are explicit and take a lot of space
  • It is quite easy to accidentally generate an error message that has little to do with the check that has just been done (I already fixed things in 1, 2)
  • I am convinced that APIs that require too much boilerplate and repetitions give people an incentive to use Automated Code Generation Tools ™️ and I would like to avoid giving this incentive.

This PR adds an AcceptContext::expect_list method, allowing to replace the code in the previous snippet with:

let list = cx.expect_list(args, span)?;

which I believe solves the concerns I wrote earlier.

I already introduced an AcceptContext::expect_single_element_list method 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_list and friends push custom suggestions to the diagnostics and hopefully stop relying on the attribute template in future.

The first commit introduces AcceptContext::expect_list and AcceptContext::expect_single and 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 to Combine::finalize

@rustbotrustbot added A-attributes Area: Attributes (`#[…]`, `#![…]`) S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 23, 2026
@JonathanBrouwerJonathanBrouwer self-assigned this Apr 23, 2026
@rust-log-analyzer

This comment has been minimized.

Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
Comment threadcompiler/rustc_attr_parsing/src/context.rs
Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Apr 24, 2026
@scrabsha
scrabsha marked this pull request as ready for review April 24, 2026 15:56
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in compiler/rustc_attr_parsing

cc @jdonszelmann, @JonathanBrouwer

Some changes occurred to diagnostic attributes.

cc @mejrs

Comment on lines +258 to 271
// 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>

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@scrabsha

scrabsha commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

@JonathanBrouwer so this PR renames list -> as_list and single -> as_single. should I immediately rename every method in parser.rs or is it ok if I only rename the other methods as I implement their replacement?

(I don't really have an opinion on what is better, it's up to you ^^)

@JonathanBrouwerJonathanBrouwer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rust-bors

rust-borsBot commented Apr 25, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 067ef3d has been approved by JonathanBrouwer

It is now in the queue for this repository.

@rust-borsrust-borsBot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Apr 25, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Apr 25, 2026
…thanBrouwer
Add a higher-level API for parsing attributes
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Apr 25, 2026
…thanBrouwer
Add a higher-level API for parsing attributes
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
@rust-bors
rust-borsBot merged commit 97dd613 into rust-lang:mainApr 26, 2026
11 checks passed
@rustbotrustbot added this to the 1.97.0 milestone Apr 26, 2026
rust-timer added a commit that referenced this pull request Apr 26, 2026
Rollup merge of #155696 - scrabsha:push-kxqstpltlwzn, r=JonathanBrouwer
Add a higher-level API for parsing attributes
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
rust-timer added a commit that referenced this pull request Jul 13, 2026
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.
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jul 16, 2026
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.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-attributesArea: Attributes (`#[…]`, `#![…]`)S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@scrabsha@rust-log-analyzer@rustbot@JonathanBrouwer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add a higher-level API for parsing attributes - #155696

Merged
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
scrabsha:push-kxqstpltlwzn
Apr 26, 2026
Merged

Add a higher-level API for parsing attributes#155696
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
scrabsha:push-kxqstpltlwzn

Conversation

@scrabsha

@scrabshascrabsha commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

I got quite frustrated that a lot of the attribute parsing API repeats the same pattern over and over:

letSome(list) = args.list()else{
cx.expected_list(args, span);returnNone;}

(Example uses list, but this happens to most of the methods in rustc_attr_parsing::parser actually)

Besides the repetitions, here's why I don't like it:

  • It separates the checks on the attribute arguments with the error emission
  • Early returns are explicit and take a lot of space
  • It is quite easy to accidentally generate an error message that has little to do with the check that has just been done (I already fixed things in 1, 2)
  • I am convinced that APIs that require too much boilerplate and repetitions give people an incentive to use Automated Code Generation Tools ™️ and I would like to avoid giving this incentive.

This PR adds an AcceptContext::expect_list method, allowing to replace the code in the previous snippet with:

let list = cx.expect_list(args, span)?;

which I believe solves the concerns I wrote earlier.

I already introduced an AcceptContext::expect_single_element_list method 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_list and friends push custom suggestions to the diagnostics and hopefully stop relying on the attribute template in future.

The first commit introduces AcceptContext::expect_list and AcceptContext::expect_single and 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 to Combine::finalize

@rustbotrustbot added A-attributes Area: Attributes (`#[…]`, `#![…]`) S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 23, 2026
@JonathanBrouwerJonathanBrouwer self-assigned this Apr 23, 2026
@rust-log-analyzer

This comment has been minimized.

Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
Comment threadcompiler/rustc_attr_parsing/src/context.rs
Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Apr 24, 2026
@scrabsha
scrabsha marked this pull request as ready for review April 24, 2026 15:56
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in compiler/rustc_attr_parsing

cc @jdonszelmann, @JonathanBrouwer

Some changes occurred to diagnostic attributes.

cc @mejrs

Comment on lines +258 to 271
// 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>

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@scrabsha

scrabsha commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

@JonathanBrouwer so this PR renames list -> as_list and single -> as_single. should I immediately rename every method in parser.rs or is it ok if I only rename the other methods as I implement their replacement?

(I don't really have an opinion on what is better, it's up to you ^^)

@JonathanBrouwerJonathanBrouwer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rust-bors

rust-borsBot commented Apr 25, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 067ef3d has been approved by JonathanBrouwer

It is now in the queue for this repository.

@rust-borsrust-borsBot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Apr 25, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Apr 25, 2026
…thanBrouwer
Add a higher-level API for parsing attributes
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Apr 25, 2026
…thanBrouwer
Add a higher-level API for parsing attributes
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
@rust-bors
rust-borsBot merged commit 97dd613 into rust-lang:mainApr 26, 2026
11 checks passed
@rustbotrustbot added this to the 1.97.0 milestone Apr 26, 2026
rust-timer added a commit that referenced this pull request Apr 26, 2026
Rollup merge of #155696 - scrabsha:push-kxqstpltlwzn, r=JonathanBrouwer
Add a higher-level API for parsing attributes
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
rust-timer added a commit that referenced this pull request Jul 13, 2026
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.
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jul 16, 2026
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.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-attributesArea: Attributes (`#[…]`, `#![…]`)S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@scrabsha@rust-log-analyzer@rustbot@JonathanBrouwer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add a higher-level API for parsing attributes - #155696

Merged
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
scrabsha:push-kxqstpltlwzn
Apr 26, 2026
Merged

Add a higher-level API for parsing attributes#155696
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
scrabsha:push-kxqstpltlwzn

Conversation

@scrabsha

@scrabshascrabsha commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

I got quite frustrated that a lot of the attribute parsing API repeats the same pattern over and over:

letSome(list) = args.list()else{
cx.expected_list(args, span);returnNone;}

(Example uses list, but this happens to most of the methods in rustc_attr_parsing::parser actually)

Besides the repetitions, here's why I don't like it:

  • It separates the checks on the attribute arguments with the error emission
  • Early returns are explicit and take a lot of space
  • It is quite easy to accidentally generate an error message that has little to do with the check that has just been done (I already fixed things in 1, 2)
  • I am convinced that APIs that require too much boilerplate and repetitions give people an incentive to use Automated Code Generation Tools ™️ and I would like to avoid giving this incentive.

This PR adds an AcceptContext::expect_list method, allowing to replace the code in the previous snippet with:

let list = cx.expect_list(args, span)?;

which I believe solves the concerns I wrote earlier.

I already introduced an AcceptContext::expect_single_element_list method 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_list and friends push custom suggestions to the diagnostics and hopefully stop relying on the attribute template in future.

The first commit introduces AcceptContext::expect_list and AcceptContext::expect_single and 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 to Combine::finalize

@rustbotrustbot added A-attributes Area: Attributes (`#[…]`, `#![…]`) S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 23, 2026
@JonathanBrouwerJonathanBrouwer self-assigned this Apr 23, 2026
@rust-log-analyzer

This comment has been minimized.

Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
Comment threadcompiler/rustc_attr_parsing/src/context.rs
Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Apr 24, 2026
@scrabsha
scrabsha marked this pull request as ready for review April 24, 2026 15:56
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in compiler/rustc_attr_parsing

cc @jdonszelmann, @JonathanBrouwer

Some changes occurred to diagnostic attributes.

cc @mejrs

Comment on lines +258 to 271
// 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>

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@scrabsha

scrabsha commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

@JonathanBrouwer so this PR renames list -> as_list and single -> as_single. should I immediately rename every method in parser.rs or is it ok if I only rename the other methods as I implement their replacement?

(I don't really have an opinion on what is better, it's up to you ^^)

@JonathanBrouwerJonathanBrouwer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rust-bors

rust-borsBot commented Apr 25, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 067ef3d has been approved by JonathanBrouwer

It is now in the queue for this repository.

@rust-borsrust-borsBot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Apr 25, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Apr 25, 2026
…thanBrouwer
Add a higher-level API for parsing attributes
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Apr 25, 2026
…thanBrouwer
Add a higher-level API for parsing attributes
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
@rust-bors
rust-borsBot merged commit 97dd613 into rust-lang:mainApr 26, 2026
11 checks passed
@rustbotrustbot added this to the 1.97.0 milestone Apr 26, 2026
rust-timer added a commit that referenced this pull request Apr 26, 2026
Rollup merge of #155696 - scrabsha:push-kxqstpltlwzn, r=JonathanBrouwer
Add a higher-level API for parsing attributes
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
rust-timer added a commit that referenced this pull request Jul 13, 2026
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.
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jul 16, 2026
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.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-attributesArea: Attributes (`#[…]`, `#![…]`)S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@scrabsha@rust-log-analyzer@rustbot@JonathanBrouwer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add a higher-level API for parsing attributes - #155696

Merged
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
scrabsha:push-kxqstpltlwzn
Apr 26, 2026
Merged

Add a higher-level API for parsing attributes#155696
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
scrabsha:push-kxqstpltlwzn

Conversation

@scrabsha

@scrabshascrabsha commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

I got quite frustrated that a lot of the attribute parsing API repeats the same pattern over and over:

letSome(list) = args.list()else{
cx.expected_list(args, span);returnNone;}

(Example uses list, but this happens to most of the methods in rustc_attr_parsing::parser actually)

Besides the repetitions, here's why I don't like it:

  • It separates the checks on the attribute arguments with the error emission
  • Early returns are explicit and take a lot of space
  • It is quite easy to accidentally generate an error message that has little to do with the check that has just been done (I already fixed things in 1, 2)
  • I am convinced that APIs that require too much boilerplate and repetitions give people an incentive to use Automated Code Generation Tools ™️ and I would like to avoid giving this incentive.

This PR adds an AcceptContext::expect_list method, allowing to replace the code in the previous snippet with:

let list = cx.expect_list(args, span)?;

which I believe solves the concerns I wrote earlier.

I already introduced an AcceptContext::expect_single_element_list method 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_list and friends push custom suggestions to the diagnostics and hopefully stop relying on the attribute template in future.

The first commit introduces AcceptContext::expect_list and AcceptContext::expect_single and 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 to Combine::finalize

@rustbotrustbot added A-attributes Area: Attributes (`#[…]`, `#![…]`) S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 23, 2026
@JonathanBrouwerJonathanBrouwer self-assigned this Apr 23, 2026
@rust-log-analyzer

This comment has been minimized.

Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
Comment threadcompiler/rustc_attr_parsing/src/context.rs
Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
Comment threadcompiler/rustc_attr_parsing/src/context.rs Outdated
@rustbot

Copy link
Copy Markdown
Collaborator

Reminder, once the PR becomes ready for a review, use @rustbot ready.

@rustbotrustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Apr 24, 2026
@scrabsha
scrabsha marked this pull request as ready for review April 24, 2026 15:56
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in compiler/rustc_attr_parsing

cc @jdonszelmann, @JonathanBrouwer

Some changes occurred to diagnostic attributes.

cc @mejrs

Comment on lines +258 to 271
// 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>

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@scrabsha

scrabsha commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

@JonathanBrouwer so this PR renames list -> as_list and single -> as_single. should I immediately rename every method in parser.rs or is it ok if I only rename the other methods as I implement their replacement?

(I don't really have an opinion on what is better, it's up to you ^^)

@JonathanBrouwerJonathanBrouwer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rust-bors

rust-borsBot commented Apr 25, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 067ef3d has been approved by JonathanBrouwer

It is now in the queue for this repository.

@rust-borsrust-borsBot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Apr 25, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Apr 25, 2026
…thanBrouwer
Add a higher-level API for parsing attributes
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Apr 25, 2026
…thanBrouwer
Add a higher-level API for parsing attributes
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
rust-borsBot pushed a commit that referenced this pull request Apr 25, 2026
…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)
@rust-bors
rust-borsBot merged commit 97dd613 into rust-lang:mainApr 26, 2026
11 checks passed
@rustbotrustbot added this to the 1.97.0 milestone Apr 26, 2026
rust-timer added a commit that referenced this pull request Apr 26, 2026
Rollup merge of #155696 - scrabsha:push-kxqstpltlwzn, r=JonathanBrouwer
Add a higher-level API for parsing attributes
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 13, 2026
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.
rust-timer added a commit that referenced this pull request Jul 13, 2026
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.
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jul 16, 2026
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.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-attributesArea: Attributes (`#[…]`, `#![…]`)S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@scrabsha@rust-log-analyzer@rustbot@JonathanBrouwer