rust-lang / rust-lang/rust-analyzer

Macro expansion involving identifiers in parentheses preceded by visibility is broken

Open
#15,537 3 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

A-macro A-parser C-bug
Dominant language
Rust
Stars
16.9k
Forks
2.2k
Avg merge
1d 12h
Merged PRs (30d)
72

Description

The following snippet does not expand the macro foo! correctly:

fn main() {}

macro_rules! foo {
    ($a:vis ($b:ident)) => {
        pub const X: &str = stringify!($b);
    };
}

foo!(
    pub (bar)
);

Instead of expanding to

pub const X: &str = "bar"

it expands to

pub const X: &str = "$ b"

It seems that rust-analyzer puts a space between the $ and the b before substituting the macro variables, resulting in a wrong expansion. rustc handles this expansion correctly.

rust-analyzer version: rust-analyzer version: 0.3.1641-standalone (144526c90 2023-08-28) [I have also tried rust-analyzer version: 0.4.1644-standalone (321334429 2023-08-30)]
rustc version: rustc 1.74.0-nightly (84a9f4c6e 2023-08-29)

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the supplied macro_rules! example in rust-analyzer and compare its expansion with rustc. Trace the macro expansion path involved in visibility followed by a parenthesized identifier; done means foo!(pub (bar)) expands to a constant whose string value is "bar", without the inserted space.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
compilers
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.