1 // FIXME: this can be greatly simplified via $()?
2 // as soon as MRSV hits 1.32
4 /// Build [`Diagnostic`](struct.Diagnostic.html) instance from provided arguments.
8 /// See [the guide](index.html#guide).
11 macro_rules
! diagnostic
{
13 ($err
:expr
) => { $crate::Diagnostic::from($err) }
;
15 // span, message, help
16 ($span
:expr
, $level
:expr
, $fmt
:expr
, $
($args
:expr
),+ ; $
($rest
:tt
)+) => {{
17 #[allow(unused_imports)]
18 use $
crate::__export
::{
24 use $
crate::DiagnosticExt
;
25 let span_range
= (&$span
).FIRST_ARG_MUST_EITHER_BE_Span_OR_IMPLEMENT_ToTokens_OR_BE_SpanRange();
27 let diag
= $
crate::Diagnostic
::spanned_range(
30 format
!($fmt
, $
($args
),*)
32 $
crate::__pme__suggestions
!(diag $
($rest
)*);
36 ($span
:expr
, $level
:expr
, $msg
:expr
; $
($rest
:tt
)+) => {{
37 #[allow(unused_imports)]
38 use $
crate::__export
::{
44 use $
crate::DiagnosticExt
;
45 let span_range
= (&$span
).FIRST_ARG_MUST_EITHER_BE_Span_OR_IMPLEMENT_ToTokens_OR_BE_SpanRange();
47 let diag
= $
crate::Diagnostic
::spanned_range(span_range
, $level
, $msg
.to_string());
48 $
crate::__pme__suggestions
!(diag $
($rest
)*);
52 // span, message, no help
53 ($span
:expr
, $level
:expr
, $fmt
:expr
, $
($args
:expr
),+) => {{
54 #[allow(unused_imports)]
55 use $
crate::__export
::{
61 use $
crate::DiagnosticExt
;
62 let span_range
= (&$span
).FIRST_ARG_MUST_EITHER_BE_Span_OR_IMPLEMENT_ToTokens_OR_BE_SpanRange();
64 $
crate::Diagnostic
::spanned_range(
67 format
!($fmt
, $
($args
),*)
71 ($span
:expr
, $level
:expr
, $msg
:expr
) => {{
72 #[allow(unused_imports)]
73 use $
crate::__export
::{
79 use $
crate::DiagnosticExt
;
80 let span_range
= (&$span
).FIRST_ARG_MUST_EITHER_BE_Span_OR_IMPLEMENT_ToTokens_OR_BE_SpanRange();
82 $
crate::Diagnostic
::spanned_range(span_range
, $level
, $msg
.to_string())
88 ($span
:expr
, $level
:expr
, $fmt
:expr
, $
($args
:expr
),+, ; $
($rest
:tt
)+) => {
89 $
crate::diagnostic
!($span
, $level
, $fmt
, $
($args
),* ; $
($rest
)*)
91 ($span
:expr
, $level
:expr
, $msg
:expr
, ; $
($rest
:tt
)+) => {
92 $
crate::diagnostic
!($span
, $level
, $msg
; $
($rest
)*)
94 ($span
:expr
, $level
:expr
, $fmt
:expr
, $
($args
:expr
),+,) => {
95 $
crate::diagnostic
!($span
, $level
, $fmt
, $
($args
),*)
97 ($span
:expr
, $level
:expr
, $msg
:expr
,) => {
98 $
crate::diagnostic
!($span
, $level
, $msg
)
100 // ($err:expr,) => { $crate::diagnostic!($err) };
103 /// Abort proc-macro execution right now and display the error.
107 /// See [the guide](index.html#guide).
111 $
crate::diagnostic
!($err
).abort()
114 ($span
:expr
, $
($tts
:tt
)*) => {
115 $
crate::diagnostic
!($span
, $
crate::Level
::Error
, $
($tts
)*).abort()
119 /// Shortcut for `abort!(Span::call_site(), msg...)`. This macro
120 /// is still preferable over plain panic, panics are not for error reporting.
124 /// See [the guide](index.html#guide).
127 macro_rules
! abort_call_site
{
129 $
crate::abort
!($
crate::__export
::proc_macro2
::Span
::call_site(), $
($tts
)*)
133 /// Emit an error while not aborting the proc-macro right away.
137 /// See [the guide](index.html#guide).
140 macro_rules
! emit_error
{
142 $
crate::diagnostic
!($err
).emit()
145 ($span
:expr
, $
($tts
:tt
)*) => {{
146 let level
= $
crate::Level
::Error
;
147 $
crate::diagnostic
!($span
, level
, $
($tts
)*).emit()
151 /// Shortcut for `emit_error!(Span::call_site(), ...)`. This macro
152 /// is still preferable over plain panic, panics are not for error reporting..
156 /// See [the guide](index.html#guide).
159 macro_rules
! emit_call_site_error
{
161 $
crate::emit_error
!($
crate::__export
::proc_macro2
::Span
::call_site(), $
($tts
)*)
165 /// Emit a warning. Warnings are not errors and compilation won't fail because of them.
167 /// **Does nothing on stable**
171 /// See [the guide](index.html#guide).
174 macro_rules
! emit_warning
{
175 ($span
:expr
, $
($tts
:tt
)*) => {
176 $
crate::diagnostic
!($span
, $
crate::Level
::Warning
, $
($tts
)*).emit()
180 /// Shortcut for `emit_warning!(Span::call_site(), ...)`.
182 /// **Does nothing on stable**
186 /// See [the guide](index.html#guide).
189 macro_rules
! emit_call_site_warning
{
191 $
crate::emit_warning
!($
crate::__export
::proc_macro2
::Span
::call_site(), $
($tts
)*)
197 macro_rules
! __pme__suggestions
{
200 ($var
:ident $help
:ident
=? $msg
:expr
) => {
201 let $var
= if let Some(msg
) = $msg
{
202 $var
.suggestion(stringify
!($help
), msg
.to_string())
207 ($var
:ident $help
:ident
=? $span
:expr
=> $msg
:expr
) => {
208 let $var
= if let Some(msg
) = $msg
{
209 $var
.span_suggestion($span
.into(), stringify
!($help
), msg
.to_string())
215 ($var
:ident $help
:ident
=? $msg
:expr
; $
($rest
:tt
)*) => {
216 $
crate::__pme__suggestions
!($var $help
=? $msg
);
217 $
crate::__pme__suggestions
!($var $
($rest
)*);
219 ($var
:ident $help
:ident
=? $span
:expr
=> $msg
:expr
; $
($rest
:tt
)*) => {
220 $
crate::__pme__suggestions
!($var $help
=? $span
=> $msg
);
221 $
crate::__pme__suggestions
!($var $
($rest
)*);
225 ($var
:ident $help
:ident
= $msg
:expr
) => {
226 let $var
= $var
.suggestion(stringify
!($help
), $msg
.to_string());
228 ($var
:ident $help
:ident
= $fmt
:expr
, $
($args
:expr
),+) => {
229 let $var
= $var
.suggestion(
231 format
!($fmt
, $
($args
),*)
234 ($var
:ident $help
:ident
= $span
:expr
=> $msg
:expr
) => {
235 let $var
= $var
.span_suggestion($span
.into(), stringify
!($help
), $msg
.to_string());
237 ($var
:ident $help
:ident
= $span
:expr
=> $fmt
:expr
, $
($args
:expr
),+) => {
238 let $var
= $var
.span_suggestion(
241 format
!($fmt
, $
($args
),*)
245 ($var
:ident $help
:ident
= $msg
:expr
; $
($rest
:tt
)*) => {
246 $
crate::__pme__suggestions
!($var $help
= $msg
);
247 $
crate::__pme__suggestions
!($var $
($rest
)*);
249 ($var
:ident $help
:ident
= $fmt
:expr
, $
($args
:expr
),+ ; $
($rest
:tt
)*) => {
250 $
crate::__pme__suggestions
!($var $help
= $fmt
, $
($args
),*);
251 $
crate::__pme__suggestions
!($var $
($rest
)*);
253 ($var
:ident $help
:ident
= $span
:expr
=> $msg
:expr
; $
($rest
:tt
)*) => {
254 $
crate::__pme__suggestions
!($var $help
= $span
=> $msg
);
255 $
crate::__pme__suggestions
!($var $
($rest
)*);
257 ($var
:ident $help
:ident
= $span
:expr
=> $fmt
:expr
, $
($args
:expr
),+ ; $
($rest
:tt
)*) => {
258 $
crate::__pme__suggestions
!($var $help
= $span
=> $fmt
, $
($args
),*);
259 $
crate::__pme__suggestions
!($var $
($rest
)*);
264 ($var
:ident $help
:ident
= $msg
:expr
,) => {
265 $
crate::__pme__suggestions
!($var $help
= $msg
)
267 ($var
:ident $help
:ident
= $fmt
:expr
, $
($args
:expr
),+,) => {
268 $
crate::__pme__suggestions
!($var $help
= $fmt
, $
($args
)*)
270 ($var
:ident $help
:ident
= $span
:expr
=> $msg
:expr
,) => {
271 $
crate::__pme__suggestions
!($var $help
= $span
=> $msg
)
273 ($var
:ident $help
:ident
= $span
:expr
=> $fmt
:expr
, $
($args
:expr
),*,) => {
274 $
crate::__pme__suggestions
!($var $help
= $span
=> $fmt
, $
($args
)*)
276 ($var
:ident $help
:ident
= $msg
:expr
, ; $
($rest
:tt
)*) => {
277 $
crate::__pme__suggestions
!($var $help
= $msg
; $
($rest
)*)
279 ($var
:ident $help
:ident
= $fmt
:expr
, $
($args
:expr
),+, ; $
($rest
:tt
)*) => {
280 $
crate::__pme__suggestions
!($var $help
= $fmt
, $
($args
),*; $
($rest
)*)
282 ($var
:ident $help
:ident
= $span
:expr
=> $msg
:expr
, ; $
($rest
:tt
)*) => {
283 $
crate::__pme__suggestions
!($var $help
= $span
=> $msg
; $
($rest
)*)
285 ($var
:ident $help
:ident
= $span
:expr
=> $fmt
:expr
, $
($args
:expr
),+, ; $
($rest
:tt
)*) => {
286 $
crate::__pme__suggestions
!($var $help
= $span
=> $fmt
, $
($args
),*; $
($rest
)*)