2

我想创建一个使用新命名空间属性语法的自定义派生宏:example::attr. 我已经能够让它与类型内的属性一起工作(例如,在结构字段或枚举变体上),但不适用于类型本身。

src/main.rs

use repro_derive::Example;

#[derive(Example)]
#[example::attr]     // Does not work
struct Demo {
    #[example::attr] // Works
    field: i32,
}

fn main() {}

过程宏本身什么也不做,除了声明它example::attr是一个有效的属性。

复制衍生/src/lib.rs

extern crate proc_macro;

use proc_macro::TokenStream;

#[proc_macro_derive(Example, attributes(example::attr))]
pub fn example_derive(_input: TokenStream) -> TokenStream {
    TokenStream::new()
}

编译产量:

error[E0433]: failed to resolve: use of undeclared type or module `example`
 --> src/main.rs:4:3
  |
4 | #[example::attr]
  |   ^^^^^^^ use of undeclared type or module `example`

切换到属性 ( ) 的非命名空间形式example_attr可以正常工作。


我正在使用 Rust 1.32.0。项目布局为

$ tree
.
├── Cargo.lock
├── Cargo.toml
├── repro-derive
│   ├── Cargo.toml
│   └── src
│       └── lib.rs
└── src
    └── main.rs

货运.toml

$ cat Cargo.toml
[package]
name = "repro"
version = "0.1.0"
authors = ["Author"]
edition = "2018"

[dependencies]
repro-derive = { path = "repro-derive" }

repro-derive/Cargo.toml

[package]
name = "repro-derive"
version = "0.1.0"
authors = ["Author"]
edition = "2018"

[lib]
proc-macro = true

[dependencies]
4

1 回答 1

2

属性中声明的名称空间proc_macro_derive被完全忽略,这是一个已知的错误。由于这个错误,可以编译以下代码,尽管它不应该编译。

#[derive(Example)]
#[attr]             // Works (but shouldn't)
struct Demo {
    #[lolwut::attr] // Works (but shouldn't)
    field: i32,
}

在修复错误之前,您应该继续使用非命名空间形式 ( example_attr)。

此外,根据此错误报告,从 Rust 1.33.0 开始,无法通过 proc-macros 实现 OP 想要的,如何允许#[example::attr]工作仍在设计中。

于 2019-02-27T17:02:50.183 回答