Suponha que eu tenha esses dois arquivos:
// foo.rs
#![crate_type = "proc-macro"]
extern crate proc_macro;
use proc_macro::TokenStream;
#[proc_macro]
pub fn foo(x: TokenStream) -> TokenStream {
x
}
// bar.rs
extern crate foo;
use foo::foo;
fn main() {
foo!();
}
Quando tento compilar esses arquivos com rustc foo.rs && rustc bar.rs -L.
, recebo os seguintes erros:
warning: proc macro crates and `#[no_link]` crates have no effect without `#[macro_use]`
--> bar.rs:1:1
|
1 | extern crate foo;
| ^^^^^^^^^^^^^^^^^
error[E0432]: unresolved import `foo::foo`
--> bar.rs:2:5
|
2 | use foo::foo;
| ^^^^^^^^ no `foo` in the root
error: cannot find macro `foo!` in this scope
--> bar.rs:5:5
|
5 | foo!();
| ^^^
error: aborting due to 2 previous errors
Agora, se eu seguir o conselho do compilador e tentar #[macro_use]
, recebo este erro:
error: procedural macros cannot be imported with `#[macro_use]`
--> bar.rs:5:5
|
5 | foo!();
| ^^^
|
= help: instead, import the procedural macro like any other item: `use foo::foo;`
error: aborting due to previous error
Mas isso é o que eu tinha em primeiro lugar!
A solução real para este problema é adicionar #![feature(use_extern_macros)]
a bar.rs
. O compilador deve sugerir isso quando encontrar uma macro proc do tipo função.
Pode ser uma solução fácil, pelo menos, alterar a mensagem de diagnóstico para sugerir também a adição de #![feature(proc_macro)]
a bar.rs
para o curto prazo. (Ou faça o diagnóstico primeiro verificar se esse recurso está habilitado antes de fazer a sugestão.) Não me importo de ter uma parte redundante da sugestão, desde que ela cubra o problema real também.
Agora com todas as noites eu até recebo: warning: this feature has been stable since 1.29.0. Attribute no longer needed
por #![feature(proc_macro)]
.
Mas ainda tenho os mesmos problemas que @lfary. E agora, se eu quiser usar minha macro, recebo error: cannot find macro 'my_macro!' in this scope
. Mas se eu adicionar use my_crate::my_macro;
eu recebo error[E0432]: unresolved import 'my_crate::my_macro'
.
Parece que agora é necessário substituir o recurso proc_macro
por use_extern_macros
. Isso seria uma dica útil na mensagem Attribute is no longer needed
.. ;)
Muitos recursos aqui foram estabilizados, então isso provavelmente está obsoleto, então fechando.
Comentários muito úteis
Agora com todas as noites eu até recebo:
warning: this feature has been stable since 1.29.0. Attribute no longer needed
por#![feature(proc_macro)]
.Mas ainda tenho os mesmos problemas que @lfary. E agora, se eu quiser usar minha macro, recebo
error: cannot find macro 'my_macro!' in this scope
. Mas se eu adicionaruse my_crate::my_macro;
eu receboerror[E0432]: unresolved import 'my_crate::my_macro'
.Parece que agora é necessário substituir o recurso
proc_macro
poruse_extern_macros
. Isso seria uma dica útil na mensagemAttribute is no longer needed
.. ;)