Rust: Diagnostik tidak membantu saat menggunakan makro proc 2.0 tanpa #![fitur(use_extern_macros)]

Dibuat pada 17 Apr 2017  ·  3Komentar  ·  Sumber: rust-lang/rust

Misalkan saya memiliki dua file ini:

// 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!();
}

Ketika saya mencoba mengkompilasi file-file ini dengan rustc foo.rs && rustc bar.rs -L. , saya mendapatkan kesalahan berikut:

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

Sekarang, jika saya mengikuti saran kompiler dan mencoba #[macro_use] sebagai gantinya, saya disajikan dengan kesalahan ini:

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

Tapi itulah yang saya miliki di tempat pertama!

Solusi nyata untuk masalah ini adalah menambahkan #![feature(use_extern_macros)] ke bar.rs . Kompiler harus menyarankan ini sebagai gantinya ketika menemukan makro proc seperti fungsi.

A-diagnostics A-macros-2.0 C-enhancement

Komentar yang paling membantu

Sekarang dengan nightly saya bahkan mendapatkan: warning: this feature has been stable since 1.29.0. Attribute no longer needed untuk #![feature(proc_macro)] .

Tapi saya masih memiliki masalah yang sama dengan @lfairy. Dan sekarang jika saya ingin menggunakan makro saya, saya mendapatkan error: cannot find macro 'my_macro!' in this scope . Tetapi jika saya menambahkan use my_crate::my_macro; saya mendapatkan error[E0432]: unresolved import 'my_crate::my_macro' .

Tampaknya sekarang perlu mengganti fitur proc_macro dengan use_extern_macros . Itu akan menjadi petunjuk yang berguna dalam pesan Attribute is no longer needed .. ;)

Semua 3 komentar

Mungkin perbaikan mudah untuk setidaknya mengubah pesan diagnostik untuk juga menyarankan menambahkan #![feature(proc_macro)] ke bar.rs untuk jangka pendek. (Atau minta pemeriksaan diagnostik terlebih dahulu apakah fitur itu diaktifkan sebelum membuat saran.) Saya tidak keberatan memiliki bagian saran yang berlebihan selama itu mencakup masalah sebenarnya juga.

Sekarang dengan nightly saya bahkan mendapatkan: warning: this feature has been stable since 1.29.0. Attribute no longer needed untuk #![feature(proc_macro)] .

Tapi saya masih memiliki masalah yang sama dengan @lfairy. Dan sekarang jika saya ingin menggunakan makro saya, saya mendapatkan error: cannot find macro 'my_macro!' in this scope . Tetapi jika saya menambahkan use my_crate::my_macro; saya mendapatkan error[E0432]: unresolved import 'my_crate::my_macro' .

Tampaknya sekarang perlu mengganti fitur proc_macro dengan use_extern_macros . Itu akan menjadi petunjuk yang berguna dalam pesan Attribute is no longer needed .. ;)

Banyak fitur di sini telah distabilkan, jadi ini kemungkinan sudah basi, jadi tutup.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat