Я хотел бы создать пользовательский макрос для производного, который использует новый синтаксис пространства имен: example::attr
.Я смог заставить это работать с атрибутами в типе (например, в структурном поле или варианте enum), но не при применении к самому типу.
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
является допустимым атрибутом.
repro-производный / 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
Cargo.toml
$ cat Cargo.toml
[package]
name = "repro"
version = "0.1.0"
authors = ["Author"]
edition = "2018"
[dependencies]
repro-derive = { path = "repro-derive" }
repro-производное / Cargo.toml
[package]
name = "repro-derive"
version = "0.1.0"
authors = ["Author"]
edition = "2018"
[lib]
proc-macro = true
[dependencies]