ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅:
// src/lib.rs
#![feature(decl_macro)]
pub macro use_fmt {
() => {
use std::fmt;
}
}
// examples/test.rs
#![feature(use_extern_macros)]
extern crate macro_test;
use macro_test::use_fmt;
use_fmt!();
fn main() {}
The error:
$ cargo build --example test
Compiling macro-test v0.1.0 (file:///.../macro-test)
error[E0432]: unresolved import `std::fmt`
--> examples/test.rs:7:1
|
7 | use_fmt!();
| ^^^^^^^^^^^ Could not find `std` in `{{root}}`
|
= note: this error originates in a macro outside of the current crate
error: aborting due to previous error(s)
error: Could not compile `macro-test`.
ΠΡΠ·ΠΎΠ² ΠΌΠ°ΠΊΡΠΎΡΠ° Π² ΡΠΎΠΌ ΠΆΠ΅ ΡΡΠΈΠΊΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ½ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½, ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄ΠΎΠ»ΠΆΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
cc @jseyfried
ΠΡΠΈΠ½ΠΎΡΠΈΠΌ ΠΈΠ·Π²ΠΈΠ½Π΅Π½ΠΈΡ Π·Π° Π·Π°Π΄Π΅ΡΠΆΠΊΡ Ρ ΡΡΠΈΠΌ. ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΎ Π² # 46419.
Π― Π½Π΅ Π·Π½Π°Ρ, ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° (ΠΈ ΠΈΡΠΏΡΠ°Π²ΠΈΠ» Π»ΠΈ Π΅Π΅ PR), Π½ΠΎ Ρ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΡ ΠΆΠ΅ ΠΎΡΠΈΠ±ΠΊΡ Ρ proc_macro
.
ΠΠΎΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
ΠΡΠΎ ΡΠ° ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°?
ΠΠΎΠ³Π΄Π° Ρ Π·Π°ΠΏΡΡΠΊΠ°Ρ cargo build
, Ρ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ:
error[E0433]: failed to resolve. Could not find `postgres` in `{{root}}`
--> src/lib.rs:9:17
|
9 | #[derive(Debug, SqlTable)]
| ^^^^^^^^ Could not find `postgres` in `{{root}}`
error[E0433]: failed to resolve. Could not find `std` in `{{root}}`
--> src/lib.rs:9:17
|
9 | #[derive(Debug, SqlTable)]
| ^^^^^^^^ Could not find `std` in `{{root}}`
error[E0412]: cannot find type `Table` in this scope
--> src/lib.rs:9:17
|
9 | #[derive(Debug, SqlTable)]
| ^^^^^^^^ not found in this scope
help: possible candidate is found in another module, you can import it into scope
|
3 | use Table;
|
ΠΡΡΡ Π»ΠΈ ΡΠΏΠΎΡΠΎΠ± ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ?
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ.
@antoyo ΠΡΠΎ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ Π³ΠΈΠ³ΠΈΠ΅Π½Ρ.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ::postgres::types::Type
Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΌΠ°ΠΊΡΠΎΡΠ° proc, ΠΎΠ½ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ Π² ΠΎΠ±Π»Π°ΡΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΌΠ°ΠΊΡΠΎΡΠ°. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΠΎΠ½ ΡΠ°Π·ΡΠ΅ΡΠΈΡ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, Π³Π΄Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΌΠ°ΠΊΡΠΎΡ.
Π ΠΊΠΎΡΠ½Π΅ ΡΡΠΈΠΊΠ° proc-macro Π½Π΅Ρ extern crate postgres;
, ΠΏΠΎΡΡΠΎΠΌΡ Π²Ρ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΎΡΠΈΠ±ΠΊΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ extern crate postgres;
Π² ΠΊΠΎΡΠ΅Π½Ρ ΡΡΠΈΠΊΠ° proc-macro ΡΠ°ΠΊΠΆΠ΅ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ proc-macro ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΡΡΡΡ Π΄Π»Ρ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ Ρ
ΠΎΡΡΠ° (ΡΡΠ°ΠΏ 0), Π° Π½Π΅ Π΄Π»Ρ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ (ΡΡΠ°ΠΏ 1), ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡ
Π²ΠΈΠ΄Π΅ΡΡ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π·Π΄Π΅ΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅Π»Π΅Π²ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π² ΠΊΡΠ΅ΠΉΡΡ proc-macro, ΠΊΠ°ΠΊ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² https://github.com/rust-lang/rust/issues/45934#issuecomment -344497531.
ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ extern crate postgres;
Π² ΡΠ°ΡΠΊΡΡΡΠΈΠ΅ ΠΌΠ°ΠΊΡΠΎΡΠ°. ΠΠ·-Π·Π° Π³ΠΈΠ³ΠΈΠ΅Π½Ρ ΡΡΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ²Π°ΡΡ Ρ ΡΠ΅ΠΌ-Π»ΠΈΠ±ΠΎ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ postgres
Π½Π° ΡΠ°ΠΉΡΠ΅ Π²ΡΠ·ΠΎΠ²Π°, Π½Π΅ ΠΏΠΎΠ²Π»ΠΈΡΠ΅Ρ Π½Π° ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΌΠ°ΠΊΡΠΎΡΠ° ΠΈ Ρ. Π. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
quote! {
extern crate std;
extern crate postgres;
use std::io::Write;
use postgres::types::{IsNull, ToSql, Type};
impl ToSql for #table_ident {
fn to_sql<W: Write + ?Sized>(&self, ty: &Type, out: &mut W) -> postgres::Result<IsNull> {
self.#primary_key_ident.to_sql(ty, out)
}
fn accepts(ty: &Type) -> bool {
match *ty {
Type::Int4 => true,
_ => false,
}
}
fn to_sql_checked(&self, ty: &Type, out: &mut Write) -> postgres::Result<IsNull> {
if !<Self as ToSql>::accepts(ty) {
return Err(postgres::error::Error::WrongType(ty.clone()));
}
self.to_sql(ty, out)
}
}
}
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Ρ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ::postgres::types::Type
Π½Π° ΠΌΠ΅ΡΡΠ΅ Π²ΡΠ·ΠΎΠ²Π° (Π½Π΅Π³ΠΈΠ³ΠΈΠ΅Π½ΠΈΡΠ½ΠΎ), ΡΠΊΠ°Π·Π°Π² Π΅ΠΌΡ Span::call_site()
(ΡΠΎΠΊΠ΅Π½Ρ ΠΈΠ· quote!
Span::def_site()
ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΠΌΠ΅ΡΡ spanned_quote!(span, tokens...)
ΡΠΏΡΠΎΡΡΠΈΡ ΡΡΡ Π·Π°Π΄Π°ΡΡ.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
ΠΡΠΈΠ½ΠΎΡΠΈΠΌ ΠΈΠ·Π²ΠΈΠ½Π΅Π½ΠΈΡ Π·Π° Π·Π°Π΄Π΅ΡΠΆΠΊΡ Ρ ΡΡΠΈΠΌ. ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΎ Π² # 46419.