1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
pub struct HiddenVariable;
/// ```
/// use std::any::TypeId;
/// fn check<T: 'static>(_x: T) {
///   assert_eq!(TypeId::of::<kmacros_shim::HiddenVariable>(), TypeId::of::<T>());
/// }
/// let x = 1;
/// kmacros_shim::rename!(let a = x);
/// assert_eq!(a, 1);
/// check(x);
/// kmacros_shim::rename!(let b = a;);
/// assert_eq!(b, 1);
/// check(a);
/// let y = 2;
/// kmacros_shim::rename! {
///   let b = y;
///   let a = b;
/// }
/// assert_eq!(a, 2);
/// check(b);
/// check(y);
/// let x = 1;
/// let y = 2;
/// kmacros_shim::rename! {
///   let a = x;
///   let b = y;
/// }
/// assert_eq!(a, 1);
/// assert_eq!(b, 2);
/// check(x);
/// check(y);
/// kmacros_shim::rename!(let a = a;);
/// check(a);
/// ```
/// ```compile_fail
/// let x = 1;
/// kmacros_shim::rename!(let a = x);
/// assert_eq!(x, 1);
/// ```
#[macro_export]
macro_rules! rename {
    ($(let $p:pat_param = $from:ident);+$(;)?) => {
        $(
            let $p = $from;
            #[allow(unused_variables)]
            let $from = $crate::HiddenVariable;
        )+
    };
}

/// Unwrap the Option value or break.
#[macro_export]
macro_rules! or_continue {
    ( $wrapper:expr ) => {
        match $wrapper {
            Some(v) => v,
            None => continue,
        }
    };
}

/// ```
/// use std::any::TypeId;
/// fn check<T: 'static>(_x: T) {
///   assert_eq!(TypeId::of::<kmacros_shim::HiddenVariable>(), TypeId::of::<T>());
/// }
/// let x = 1;
/// kmacros_shim::hide!(x);
/// check(x);
/// ```
#[macro_export]
macro_rules! hide {
    ($x:ident) => {
        #[allow(unused_variables)]
        let $x = $crate::HiddenVariable;
    };
}

#[cfg(test)]
mod tests {}