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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
#[macro_export]
macro_rules! diagnostic {
    
    ($err:expr) => { $crate::Diagnostic::from($err) };
    
    ($span:expr, $level:expr, $fmt:expr, $($args:expr),+ ; $($rest:tt)+) => {{
        #[allow(unused_imports)]
        use $crate::__export::{
            ToTokensAsSpanRange,
            Span2AsSpanRange,
            SpanAsSpanRange,
            SpanRangeAsSpanRange
        };
        use $crate::DiagnosticExt;
        let span_range = (&$span).FIRST_ARG_MUST_EITHER_BE_Span_OR_IMPLEMENT_ToTokens_OR_BE_SpanRange();
        let diag = $crate::Diagnostic::spanned_range(
            span_range,
            $level,
            format!($fmt, $($args),*)
        );
        $crate::__pme__suggestions!(diag $($rest)*);
        diag
    }};
    ($span:expr, $level:expr, $msg:expr ; $($rest:tt)+) => {{
        #[allow(unused_imports)]
        use $crate::__export::{
            ToTokensAsSpanRange,
            Span2AsSpanRange,
            SpanAsSpanRange,
            SpanRangeAsSpanRange
        };
        use $crate::DiagnosticExt;
        let span_range = (&$span).FIRST_ARG_MUST_EITHER_BE_Span_OR_IMPLEMENT_ToTokens_OR_BE_SpanRange();
        let diag = $crate::Diagnostic::spanned_range(span_range, $level, $msg.to_string());
        $crate::__pme__suggestions!(diag $($rest)*);
        diag
    }};
    
    ($span:expr, $level:expr, $fmt:expr, $($args:expr),+) => {{
        #[allow(unused_imports)]
        use $crate::__export::{
            ToTokensAsSpanRange,
            Span2AsSpanRange,
            SpanAsSpanRange,
            SpanRangeAsSpanRange
        };
        use $crate::DiagnosticExt;
        let span_range = (&$span).FIRST_ARG_MUST_EITHER_BE_Span_OR_IMPLEMENT_ToTokens_OR_BE_SpanRange();
        $crate::Diagnostic::spanned_range(
            span_range,
            $level,
            format!($fmt, $($args),*)
        )
    }};
    ($span:expr, $level:expr, $msg:expr) => {{
        #[allow(unused_imports)]
        use $crate::__export::{
            ToTokensAsSpanRange,
            Span2AsSpanRange,
            SpanAsSpanRange,
            SpanRangeAsSpanRange
        };
        use $crate::DiagnosticExt;
        let span_range = (&$span).FIRST_ARG_MUST_EITHER_BE_Span_OR_IMPLEMENT_ToTokens_OR_BE_SpanRange();
        $crate::Diagnostic::spanned_range(span_range, $level, $msg.to_string())
    }};
    
    ($span:expr, $level:expr, $fmt:expr, $($args:expr),+, ; $($rest:tt)+) => {
        $crate::diagnostic!($span, $level, $fmt, $($args),* ; $($rest)*)
    };
    ($span:expr, $level:expr, $msg:expr, ; $($rest:tt)+) => {
        $crate::diagnostic!($span, $level, $msg ; $($rest)*)
    };
    ($span:expr, $level:expr, $fmt:expr, $($args:expr),+,) => {
        $crate::diagnostic!($span, $level, $fmt, $($args),*)
    };
    ($span:expr, $level:expr, $msg:expr,) => {
        $crate::diagnostic!($span, $level, $msg)
    };
    
}
#[macro_export]
macro_rules! abort {
    ($err:expr) => {
        $crate::diagnostic!($err).abort()
    };
    ($span:expr, $($tts:tt)*) => {
        $crate::diagnostic!($span, $crate::Level::Error, $($tts)*).abort()
    };
}
#[macro_export]
macro_rules! abort_call_site {
    ($($tts:tt)*) => {
        $crate::abort!($crate::__export::proc_macro2::Span::call_site(), $($tts)*)
    };
}
#[macro_export]
macro_rules! emit_error {
    ($err:expr) => {
        $crate::diagnostic!($err).emit()
    };
    ($span:expr, $($tts:tt)*) => {{
        let level = $crate::Level::Error;
        $crate::diagnostic!($span, level, $($tts)*).emit()
    }};
}
#[macro_export]
macro_rules! emit_call_site_error {
    ($($tts:tt)*) => {
        $crate::emit_error!($crate::__export::proc_macro2::Span::call_site(), $($tts)*)
    };
}
#[macro_export]
macro_rules! emit_warning {
    ($span:expr, $($tts:tt)*) => {
        $crate::diagnostic!($span, $crate::Level::Warning, $($tts)*).emit()
    };
}
#[macro_export]
macro_rules! emit_call_site_warning {
    ($($tts:tt)*) => {{
        $crate::emit_warning!($crate::__export::proc_macro2::Span::call_site(), $($tts)*)
    }};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __pme__suggestions {
    ($var:ident) => ();
    ($var:ident $help:ident =? $msg:expr) => {
        let $var = if let Some(msg) = $msg {
            $var.suggestion(stringify!($help), msg.to_string())
        } else {
            $var
        };
    };
    ($var:ident $help:ident =? $span:expr => $msg:expr) => {
        let $var = if let Some(msg) = $msg {
            $var.span_suggestion($span.into(), stringify!($help), msg.to_string())
        } else {
            $var
        };
    };
    ($var:ident $help:ident =? $msg:expr ; $($rest:tt)*) => {
        $crate::__pme__suggestions!($var $help =? $msg);
        $crate::__pme__suggestions!($var $($rest)*);
    };
    ($var:ident $help:ident =? $span:expr => $msg:expr ; $($rest:tt)*) => {
        $crate::__pme__suggestions!($var $help =? $span => $msg);
        $crate::__pme__suggestions!($var $($rest)*);
    };
    ($var:ident $help:ident = $msg:expr) => {
        let $var = $var.suggestion(stringify!($help), $msg.to_string());
    };
    ($var:ident $help:ident = $fmt:expr, $($args:expr),+) => {
        let $var = $var.suggestion(
            stringify!($help),
            format!($fmt, $($args),*)
        );
    };
    ($var:ident $help:ident = $span:expr => $msg:expr) => {
        let $var = $var.span_suggestion($span.into(), stringify!($help), $msg.to_string());
    };
    ($var:ident $help:ident = $span:expr => $fmt:expr, $($args:expr),+) => {
        let $var = $var.span_suggestion(
            $span.into(),
            stringify!($help),
            format!($fmt, $($args),*)
        );
    };
    ($var:ident $help:ident = $msg:expr ; $($rest:tt)*) => {
        $crate::__pme__suggestions!($var $help = $msg);
        $crate::__pme__suggestions!($var $($rest)*);
    };
    ($var:ident $help:ident = $fmt:expr, $($args:expr),+ ; $($rest:tt)*) => {
        $crate::__pme__suggestions!($var $help = $fmt, $($args),*);
        $crate::__pme__suggestions!($var $($rest)*);
    };
    ($var:ident $help:ident = $span:expr => $msg:expr ; $($rest:tt)*) => {
        $crate::__pme__suggestions!($var $help = $span => $msg);
        $crate::__pme__suggestions!($var $($rest)*);
    };
    ($var:ident $help:ident = $span:expr => $fmt:expr, $($args:expr),+ ; $($rest:tt)*) => {
        $crate::__pme__suggestions!($var $help = $span => $fmt, $($args),*);
        $crate::__pme__suggestions!($var $($rest)*);
    };
    
    ($var:ident $help:ident = $msg:expr,) => {
        $crate::__pme__suggestions!($var $help = $msg)
    };
    ($var:ident $help:ident = $fmt:expr, $($args:expr),+,) => {
        $crate::__pme__suggestions!($var $help = $fmt, $($args)*)
    };
    ($var:ident $help:ident = $span:expr => $msg:expr,) => {
        $crate::__pme__suggestions!($var $help = $span => $msg)
    };
    ($var:ident $help:ident = $span:expr => $fmt:expr, $($args:expr),*,) => {
        $crate::__pme__suggestions!($var $help = $span => $fmt, $($args)*)
    };
    ($var:ident $help:ident = $msg:expr, ; $($rest:tt)*) => {
        $crate::__pme__suggestions!($var $help = $msg; $($rest)*)
    };
    ($var:ident $help:ident = $fmt:expr, $($args:expr),+, ; $($rest:tt)*) => {
        $crate::__pme__suggestions!($var $help = $fmt, $($args),*; $($rest)*)
    };
    ($var:ident $help:ident = $span:expr => $msg:expr, ; $($rest:tt)*) => {
        $crate::__pme__suggestions!($var $help = $span => $msg; $($rest)*)
    };
    ($var:ident $help:ident = $span:expr => $fmt:expr, $($args:expr),+, ; $($rest:tt)*) => {
        $crate::__pme__suggestions!($var $help = $span => $fmt, $($args),*; $($rest)*)
    };
}