Skip to content

Commit 02af0da

Browse files
committed
fix(derive-encode): expand prelude symbols to absolute paths
According to [1]: > Generally all macros (procedural as well as macro_rules) designed to be used > by other people should refer to every single thing in their expanded code > through an absolute path, such as std::result::Result. [1]: https://github.com/dtolnay/proc-macro-workshop/blob/3b6bcd2c3ad1c1946e6fbcc9be25d3890876087d/builder/tests/09-redefined-prelude-types.rs#L13C1-L15C58 Signed-off-by: ADD-SP <[email protected]>
1 parent 60e44ad commit 02af0da

File tree

4 files changed

+54
-11
lines changed

4 files changed

+54
-11
lines changed

derive-encode/Cargo.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ syn = "2"
1818

1919
[dev-dependencies]
2020
prometheus-client = { path = "../", features = ["protobuf"] }
21+
trybuild = "1"
2122

2223
[lib]
23-
proc-macro = true
24+
proc-macro = true

derive-encode/src/lib.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,15 @@ pub fn derive_encode_label_set(input: TokenStream) -> TokenStream {
7171
};
7272

7373
let gen = quote! {
74-
impl prometheus_client::encoding::EncodeLabelSet for #name {
75-
fn encode(&self, encoder: &mut prometheus_client::encoding::LabelSetEncoder) -> std::result::Result<(), std::fmt::Error> {
76-
use prometheus_client::encoding::EncodeLabel;
77-
use prometheus_client::encoding::EncodeLabelKey;
78-
use prometheus_client::encoding::EncodeLabelValue;
74+
impl ::prometheus_client::encoding::EncodeLabelSet for #name {
75+
fn encode(&self, encoder: &mut ::prometheus_client::encoding::LabelSetEncoder) -> ::core::result::Result<(), ::core::fmt::Error> {
76+
use ::prometheus_client::encoding::EncodeLabel;
77+
use ::prometheus_client::encoding::EncodeLabelKey;
78+
use ::prometheus_client::encoding::EncodeLabelValue;
7979

8080
#body
8181

82-
Ok(())
82+
::core::result::Result::Ok(())
8383
}
8484
}
8585
};
@@ -118,13 +118,13 @@ pub fn derive_encode_label_value(input: TokenStream) -> TokenStream {
118118
};
119119

120120
let gen = quote! {
121-
impl prometheus_client::encoding::EncodeLabelValue for #name {
122-
fn encode(&self, encoder: &mut prometheus_client::encoding::LabelValueEncoder) -> std::result::Result<(), std::fmt::Error> {
123-
use std::fmt::Write;
121+
impl ::prometheus_client::encoding::EncodeLabelValue for #name {
122+
fn encode(&self, encoder: &mut ::prometheus_client::encoding::LabelValueEncoder) -> ::core::result::Result<(), ::core::fmt::Error> {
123+
use ::core::fmt::Write;
124124

125125
#body
126126

127-
Ok(())
127+
::core::result::Result::Ok(())
128128
}
129129
}
130130
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#![allow(unused_imports)]
2+
3+
// empty module has nothing and be used to redefine symbols
4+
mod empty {}
5+
6+
// redefine the prelude `::std`
7+
use empty as std;
8+
9+
// redefine the dependency `::prometheus_client`
10+
use empty as prometheus_client;
11+
12+
// redefine the prelude `::core::result::Result`.
13+
type Result = ();
14+
15+
enum TResult {
16+
Ok,
17+
Err,
18+
}
19+
20+
// redefine the prelude `::core::result::Result::Ok/Err`.
21+
use TResult::Ok;
22+
use TResult::Err;
23+
24+
#[derive(Debug, Clone, PartialEq, Eq, Hash, ::prometheus_client::encoding::EncodeLabelSet)]
25+
struct LableSet {
26+
a: String,
27+
b: LabelEnum,
28+
}
29+
30+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, ::prometheus_client::encoding::EncodeLabelValue)]
31+
enum LabelEnum {
32+
A,
33+
B,
34+
}
35+
36+
fn main() {}

derive-encode/tests/lib.rs

+6
Original file line numberDiff line numberDiff line change
@@ -205,3 +205,9 @@ fn flatten() {
205205
+ "# EOF\n";
206206
assert_eq!(expected, buffer);
207207
}
208+
209+
#[test]
210+
fn build() {
211+
let t = trybuild::TestCases::new();
212+
t.pass("tests/build/redefine-prelude-symbols.rs")
213+
}

0 commit comments

Comments
 (0)