“rust-analyzer错误‘无法解析宏 `$crate::format_args`’的含义是什么,如何修复?”

21

我在Visual Studio Code上使用rust-analyzer版本0.2.408。

我正在编写一个命令行应用程序,其中涉及将文本居中显示在终端中。这是我编写的函数:

use console::{Alignment, pad_str};

fn get_padded_row(row: &str, width: u16, symbol: Option<char>) -> String {
    let symbol = symbol.unwrap_or(' ');
    return pad_str(row, width as usize, Alignment::Center, None)
        .to_string()
        .replace(' ', &symbol.to_string());
}

这个函数完全正常,没有出现任何错误。后来我写了一个测试:

#[cfg(test)]
mod tests {
    use crate::get_padded_row;

    #[test]
    fn row_padding_dashes() {
        let padded_row = get_padded_row("hello", 15, Some('-'));
        assert_eq!(
            padded_row, "-----hello-----".to_string(),
            "`get_padded_row` was not correct, got `{}`", padded_row
        );
    }
}
代码仍然能够正常运行,cargo runcargo test 命令均可正常工作,函数经过测试后也是通过的,cargo check 命令也未发现任何问题。但是 rust-analyzer 给出了一个错误提示,将 use 语句中从 tr};return 后面的 p 都标记红色,并显示:"could not resolve macro $crate::format_args rust-analyzer(macro-error)"。搜索此错误并未得到结果。VSCode 提供了一个链接到 rust-analyzer 用户手册 的超链接,但该手册只简单描述了这个诊断信息只用于宏扩展错误。重启 VSCode 和重新安装 rust-analyzer 都没有起到任何作用,错误总是会再次出现,并且标记同一奇怪的区域。唯一找到解决方法的方式是删除测试代码而保留 rust-analyzer 插件。基于错误信息与宏扩展有关,以及删除测试代码可以解决该问题,我想象这是由 #[test] 宏引起的,但很奇怪的是 rustc 在编译代码时却未发现任何异常情况,而 rust-analyzer 却在该错误上卡住。迄今为止,我使用 rust-analyzer 的体验比官方的 Rust VSCode 插件要好,但为了解决这个问题,我正在考虑切换回官方插件。

6
这是rust-analyzer(#6716)中的一个bug。 - vallentin
1
在那上面浪费了大约5个小时;/ - Tomasz Waszczyk
3个回答

29

这是一个与 rust-analyzer 相关的 bug。您可以在 settings.json 中暂时禁用警告:

"rust-analyzer.diagnostics.disabled": [
  "macro-error"
]

已经在夜间版中修复了这个错误,因此您可以从GitHub安装rust-analyzer的夜间二进制文件,或者您可以等待几天,直到该修复在稳定版本中发布。

另外,您也可以将rls版本降级为0.2.400,因为该错误是由版本0.2.408中的提交引起的:

Extensions Icon -> rust-analyzer -> Manage (gear icon) -> Install Another Version

安装夜间版 Rust 分析器可以解决问题,但是您需要在设置中将 procMacro 设置为“True”才能使用 Rust 分析器。 - alexzander

5
三个月后,夜间发布可能存在错误?不确定。
我将unresolved-macro-call添加到了rust-analyzer的诊断:禁用设置中。

4

我已经尝试了很多方法,阅读了标记为已解决的Github开放问题等等,但这个问题依然存在。

对于VSCode用户,请打开设置(json)并通过添加以下内容来禁用:

    "rust-analyzer.procMacro.enable": false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接