ブログ名

競技プログラミングやお歌のお話をする高菜です。

rust-analyzer さんに auto-import をしていただくためには、$($e:expr,)* をしてはいけません。

rust-analyzer さん、マクロの中で auto-import をしていただけたり、しなかったりしますよね。

問題

↓のパターンで、NAME と入力したら、use module::NAME; の挿入がサジェストされていただきたいですよね。できません。

fn main() {
    expr_macro! {
        NAME
    }
}

mod module {
    #[macro_export]
    macro_rules! expr_macro {
        ($($e:expr,)*) => {
            $(println!("{}", $e);)*
        };
    }
    pub const NAME: u32 = 42;
}

原因?と解決法

どうも、$($e:expr,)* のパターンでは auto-import 出来ないみたいです。パースの一意性とかの問題なのでしょうか。わからずです。

解決策ですが、次のものは全て auto-import に対応していますから、そちらを使いましょう。

  • $($e:expr),*
  • $($e:expr),* $(,)?
  • $($e:expr)*

違いわかりませんという方は、フッ、私の勝ちです。なんで負けたか明日までに、明日…… もう明日ですね。