Skip to content

Commit e45a1fe

Browse files
committed
Pass visitor to visit_number! macro
In Rust, variable identifiers in a `macro_rules!` body are resolved in the scope of tht body - they cannot see through to the caller's body. For example, the following code errors: ```rust macro_rules! weird_ident { () => { my_ident; } } fn main() { let my_ident = 1; weird_ident!(); } ``` However, due to a compiler bug (rust-lang/rust#43081), this kind of code current compiles when a procedural macro is invoked by a `macro_rules!` macro. Eventually, this will cause a compilation error. In the `visit_number!` macro, you're currently writing an expression involving `visitor`, and passing it to a procedural macro (`paste!`). However, `visitor` comes from the body of the caller of `visit_number!`, so this code will stop compiling once the compiler bug is fixed. Fortunately, the identifier of `visitor` can be passed into `visit_number!`. This modified code will with the current version of Rust, as well as future version that causes the old code into an error. Feel free to ask me about any questions you may have. For more details, see rust-lang/rust#72622
1 parent c0f5622 commit e45a1fe

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

src/de/mod.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ mod macros {
2222
}
2323

2424
macro_rules! visit_number {
25-
($l: expr, $to: ident, $ty: ident) => {
25+
($l: expr, $to: ident, $ty: ident, $visitor:ident) => {
2626
if $l.token == Token::$to {
2727
paste::expr! {
2828
let result = $l.slice().parse().unwrap();
2929
$l.advance();
30-
visitor.[<visit_$ty>](result)
30+
$visitor.[<visit_$ty>](result)
3131
}
3232
} else {
3333
unexpected_token!($l, "<number>")
@@ -191,70 +191,70 @@ impl<'de: 'a, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
191191
where
192192
V: Visitor<'de>,
193193
{
194-
visit_number!(self.lexer, Integer, i8)
194+
visit_number!(self.lexer, Integer, i8, visitor)
195195
}
196196

197197
fn deserialize_i16<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
198198
where
199199
V: Visitor<'de>,
200200
{
201-
visit_number!(self.lexer, Integer, i16)
201+
visit_number!(self.lexer, Integer, i16, visitor)
202202
}
203203

204204
fn deserialize_i32<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
205205
where
206206
V: Visitor<'de>,
207207
{
208-
visit_number!(self.lexer, Integer, i32)
208+
visit_number!(self.lexer, Integer, i32, visitor)
209209
}
210210

211211
fn deserialize_i64<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
212212
where
213213
V: Visitor<'de>,
214214
{
215-
visit_number!(self.lexer, Integer, i64)
215+
visit_number!(self.lexer, Integer, i64, visitor)
216216
}
217217

218218
fn deserialize_u8<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
219219
where
220220
V: Visitor<'de>,
221221
{
222-
visit_number!(self.lexer, Integer, u8)
222+
visit_number!(self.lexer, Integer, u8, visitor)
223223
}
224224

225225
fn deserialize_u16<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
226226
where
227227
V: Visitor<'de>,
228228
{
229-
visit_number!(self.lexer, Integer, u16)
229+
visit_number!(self.lexer, Integer, u16, visitor)
230230
}
231231

232232
fn deserialize_u32<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
233233
where
234234
V: Visitor<'de>,
235235
{
236-
visit_number!(self.lexer, Integer, u32)
236+
visit_number!(self.lexer, Integer, u32, visitor)
237237
}
238238

239239
fn deserialize_u64<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
240240
where
241241
V: Visitor<'de>,
242242
{
243-
visit_number!(self.lexer, Integer, u64)
243+
visit_number!(self.lexer, Integer, u64, visitor)
244244
}
245245

246246
fn deserialize_f32<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
247247
where
248248
V: Visitor<'de>,
249249
{
250-
visit_number!(self.lexer, Float, f32)
250+
visit_number!(self.lexer, Float, f32, visitor)
251251
}
252252

253253
fn deserialize_f64<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>
254254
where
255255
V: Visitor<'de>,
256256
{
257-
visit_number!(self.lexer, Float, f64)
257+
visit_number!(self.lexer, Float, f64, visitor)
258258
}
259259

260260
fn deserialize_char<V>(self, visitor: V) -> Result<<V as Visitor<'de>>::Value>

0 commit comments

Comments
 (0)