假设我有这样的宏观定义:

#[proc_macro_derive(Builder, attributes(builder, group, groups))]
#[proc_macro_error]
pub fn derive_builder(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
    // -- snip --
}

我想弃用group,让用户使用groups.你不能简单地这样做:

#[proc_macro_derive(Builder, attributes(builder, #[deprecated] group, groups))]

而抛出警告目前只有available on nightly

我如何告诉用户逐步停止使用group

推荐答案

就像使用compile_error!()一样,扩展到对不推荐使用的函数的调用.也许,最好的方法是从宏的支持库中创建一个不推荐使用的导出函数:

#[deprecated = "the `group` attribute is deprecated. Use `groups` instead"]
#[doc(hidden)]
pub const fn group() {}

并扩展到类似以下内容:

const _: () = ::my_crate::group();

当然,请确保设置正确的范围,以便错误指向正确的位置.

Rust相关问答推荐

在UdpSocket上使用sendto时的隐式套接字绑定

如何指定不同的类型来常量Rust中的泛型参数?

为什么我们需要std::thread::scope,如果我们可以使用thread.join()在函数的生命周期内删除引用?

如何在不调用Collect()的情况下为新型vec实现IntoIterator?

为什么将易错函数的泛型结果作为泛型参数传递 infer ()?不应该是暧昧的吗?

为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?

如何强制匹配的返回类型为()?

从Rust 的临时文件中创建引用是什么意思?

有什么办法可以追踪泛型的单态化过程吗?

Rust 中 Mutex<> 的深拷贝?

如何从 x86_64 Mac 构建 M1 Mac?

Rust/Serde/HTTP:序列化`Option`

为什么1..=100返回一个范围而不是一个整数?

使用部分键从 Hashmap 中检索值

当我在 struct 中存储异步函数时,为什么它需要生命周期

我如何将特征作为 struct 的拥有字段?

如何在 C++ 和 Rust 之间共享 pthread 同步原语?

深度嵌套枚举的清洁匹配臂

有没有更好的方法来为拥有 DIsplay 事物集合的 struct 实现 Display?

在 Rust 中退出进程