1use std::borrow::Cow;
2
3use rustc_ast::ast;
4use rustc_errors::codes::*;
5use rustc_macros::{Diagnostic, Subdiagnostic};
6use rustc_session::Limit;
7use rustc_span::{Ident, MacroRulesNormalizedIdent, Span, Symbol};
8
9#[derive(Diagnostic)]
10#[diag(expand_expr_repeat_no_syntax_vars)]
11pub(crate) struct NoSyntaxVarsExprRepeat {
12 #[primary_span]
13 pub span: Span,
14}
15
16#[derive(Diagnostic)]
17#[diag(expand_must_repeat_once)]
18pub(crate) struct MustRepeatOnce {
19 #[primary_span]
20 pub span: Span,
21}
22
23#[derive(Diagnostic)]
24#[diag(expand_count_repetition_misplaced)]
25pub(crate) struct CountRepetitionMisplaced {
26 #[primary_span]
27 pub span: Span,
28}
29
30#[derive(Diagnostic)]
31#[diag(expand_var_still_repeating)]
32pub(crate) struct VarStillRepeating {
33 #[primary_span]
34 pub span: Span,
35 pub ident: MacroRulesNormalizedIdent,
36}
37
38#[derive(Diagnostic)]
39#[diag(expand_meta_var_dif_seq_matchers)]
40pub(crate) struct MetaVarsDifSeqMatchers {
41 #[primary_span]
42 pub span: Span,
43 pub msg: String,
44}
45
46#[derive(Diagnostic)]
47#[diag(expand_resolve_relative_path)]
48pub(crate) struct ResolveRelativePath {
49 #[primary_span]
50 pub span: Span,
51 pub path: String,
52}
53
54#[derive(Diagnostic)]
55#[diag(expand_collapse_debuginfo_illegal)]
56pub(crate) struct CollapseMacroDebuginfoIllegal {
57 #[primary_span]
58 pub span: Span,
59}
60
61#[derive(Diagnostic)]
62#[diag(expand_macro_const_stability)]
63pub(crate) struct MacroConstStability {
64 #[primary_span]
65 #[label]
66 pub span: Span,
67 #[label(expand_label2)]
68 pub head_span: Span,
69}
70
71#[derive(Diagnostic)]
72#[diag(expand_macro_body_stability)]
73pub(crate) struct MacroBodyStability {
74 #[primary_span]
75 #[label]
76 pub span: Span,
77 #[label(expand_label2)]
78 pub head_span: Span,
79}
80
81#[derive(Diagnostic)]
82#[diag(expand_feature_removed, code = E0557)]
83#[note]
84pub(crate) struct FeatureRemoved<'a> {
85 #[primary_span]
86 #[label]
87 pub span: Span,
88 #[subdiagnostic]
89 pub reason: Option<FeatureRemovedReason<'a>>,
90 pub removed_rustc_version: &'a str,
91 pub pull_note: String,
92}
93
94#[derive(Subdiagnostic)]
95#[note(expand_reason)]
96pub(crate) struct FeatureRemovedReason<'a> {
97 pub reason: &'a str,
98}
99
100#[derive(Diagnostic)]
101#[diag(expand_feature_not_allowed, code = E0725)]
102pub(crate) struct FeatureNotAllowed {
103 #[primary_span]
104 pub span: Span,
105 pub name: Symbol,
106}
107
108#[derive(Diagnostic)]
109#[diag(expand_recursion_limit_reached)]
110#[help]
111pub(crate) struct RecursionLimitReached {
112 #[primary_span]
113 pub span: Span,
114 pub descr: String,
115 pub suggested_limit: Limit,
116 pub crate_name: Symbol,
117}
118
119#[derive(Diagnostic)]
120#[diag(expand_malformed_feature_attribute, code = E0556)]
121pub(crate) struct MalformedFeatureAttribute {
122 #[primary_span]
123 pub span: Span,
124 #[subdiagnostic]
125 pub help: MalformedFeatureAttributeHelp,
126}
127
128#[derive(Subdiagnostic)]
129pub(crate) enum MalformedFeatureAttributeHelp {
130 #[label(expand_expected)]
131 Label {
132 #[primary_span]
133 span: Span,
134 },
135 #[suggestion(expand_expected, code = "{suggestion}", applicability = "maybe-incorrect")]
136 Suggestion {
137 #[primary_span]
138 span: Span,
139 suggestion: Symbol,
140 },
141}
142
143#[derive(Diagnostic)]
144#[diag(expand_remove_expr_not_supported)]
145pub(crate) struct RemoveExprNotSupported {
146 #[primary_span]
147 pub span: Span,
148}
149
150#[derive(Diagnostic)]
151pub(crate) enum InvalidCfg {
152 #[diag(expand_invalid_cfg_no_parens)]
153 NotFollowedByParens {
154 #[primary_span]
155 #[suggestion(
156 expand_invalid_cfg_expected_syntax,
157 code = "cfg(/* predicate */)",
158 applicability = "has-placeholders"
159 )]
160 span: Span,
161 },
162 #[diag(expand_invalid_cfg_no_predicate)]
163 NoPredicate {
164 #[primary_span]
165 #[suggestion(
166 expand_invalid_cfg_expected_syntax,
167 code = "cfg(/* predicate */)",
168 applicability = "has-placeholders"
169 )]
170 span: Span,
171 },
172 #[diag(expand_invalid_cfg_multiple_predicates)]
173 MultiplePredicates {
174 #[primary_span]
175 span: Span,
176 },
177 #[diag(expand_invalid_cfg_predicate_literal)]
178 PredicateLiteral {
179 #[primary_span]
180 span: Span,
181 },
182}
183
184#[derive(Diagnostic)]
185#[diag(expand_wrong_fragment_kind)]
186pub(crate) struct WrongFragmentKind<'a> {
187 #[primary_span]
188 pub span: Span,
189 pub kind: &'a str,
190 pub name: &'a ast::Path,
191}
192
193#[derive(Diagnostic)]
194#[diag(expand_unsupported_key_value)]
195pub(crate) struct UnsupportedKeyValue {
196 #[primary_span]
197 pub span: Span,
198}
199
200#[derive(Diagnostic)]
201#[diag(expand_incomplete_parse)]
202#[note]
203pub(crate) struct IncompleteParse<'a> {
204 #[primary_span]
205 pub span: Span,
206 pub descr: String,
207 #[label]
208 pub label_span: Span,
209 pub macro_path: &'a ast::Path,
210 pub kind_name: &'a str,
211 #[note(expand_macro_expands_to_match_arm)]
212 pub expands_to_match_arm: bool,
213
214 #[suggestion(
215 expand_suggestion_add_semi,
216 style = "verbose",
217 code = ";",
218 applicability = "maybe-incorrect"
219 )]
220 pub add_semicolon: Option<Span>,
221}
222
223#[derive(Diagnostic)]
224#[diag(expand_remove_node_not_supported)]
225pub(crate) struct RemoveNodeNotSupported {
226 #[primary_span]
227 pub span: Span,
228 pub descr: &'static str,
229}
230
231#[derive(Diagnostic)]
232#[diag(expand_module_circular)]
233pub(crate) struct ModuleCircular {
234 #[primary_span]
235 pub span: Span,
236 pub modules: String,
237}
238
239#[derive(Diagnostic)]
240#[diag(expand_module_in_block)]
241pub(crate) struct ModuleInBlock {
242 #[primary_span]
243 pub span: Span,
244 #[subdiagnostic]
245 pub name: Option<ModuleInBlockName>,
246}
247
248#[derive(Subdiagnostic)]
249#[note(expand_note)]
250pub(crate) struct ModuleInBlockName {
251 #[primary_span]
252 pub span: Span,
253 pub name: Ident,
254}
255
256#[derive(Diagnostic)]
257#[diag(expand_module_file_not_found, code = E0583)]
258#[help]
259#[note]
260pub(crate) struct ModuleFileNotFound {
261 #[primary_span]
262 pub span: Span,
263 pub name: Ident,
264 pub default_path: String,
265 pub secondary_path: String,
266}
267
268#[derive(Diagnostic)]
269#[diag(expand_module_multiple_candidates, code = E0761)]
270#[help]
271pub(crate) struct ModuleMultipleCandidates {
272 #[primary_span]
273 pub span: Span,
274 pub name: Ident,
275 pub default_path: String,
276 pub secondary_path: String,
277}
278
279#[derive(Diagnostic)]
280#[diag(expand_trace_macro)]
281pub(crate) struct TraceMacro {
282 #[primary_span]
283 pub span: Span,
284}
285
286#[derive(Diagnostic)]
287#[diag(expand_proc_macro_panicked)]
288pub(crate) struct ProcMacroPanicked {
289 #[primary_span]
290 pub span: Span,
291 #[subdiagnostic]
292 pub message: Option<ProcMacroPanickedHelp>,
293}
294
295#[derive(Subdiagnostic)]
296#[help(expand_help)]
297pub(crate) struct ProcMacroPanickedHelp {
298 pub message: String,
299}
300
301#[derive(Diagnostic)]
302#[diag(expand_proc_macro_derive_panicked)]
303pub(crate) struct ProcMacroDerivePanicked {
304 #[primary_span]
305 pub span: Span,
306 #[subdiagnostic]
307 pub message: Option<ProcMacroDerivePanickedHelp>,
308}
309
310#[derive(Subdiagnostic)]
311#[help(expand_help)]
312pub(crate) struct ProcMacroDerivePanickedHelp {
313 pub message: String,
314}
315
316#[derive(Diagnostic)]
317#[diag(expand_custom_attribute_panicked)]
318pub(crate) struct CustomAttributePanicked {
319 #[primary_span]
320 pub span: Span,
321 #[subdiagnostic]
322 pub message: Option<CustomAttributePanickedHelp>,
323}
324
325#[derive(Subdiagnostic)]
326#[help(expand_help)]
327pub(crate) struct CustomAttributePanickedHelp {
328 pub message: String,
329}
330
331#[derive(Diagnostic)]
332#[diag(expand_proc_macro_derive_tokens)]
333pub(crate) struct ProcMacroDeriveTokens {
334 #[primary_span]
335 pub span: Span,
336}
337
338#[derive(Diagnostic)]
339#[diag(expand_duplicate_matcher_binding)]
340pub(crate) struct DuplicateMatcherBinding {
341 #[primary_span]
342 #[label]
343 pub span: Span,
344 #[label(expand_label2)]
345 pub prev: Span,
346}
347
348#[derive(Diagnostic)]
349#[diag(expand_missing_fragment_specifier)]
350#[note]
351#[help(expand_valid)]
352pub(crate) struct MissingFragmentSpecifier {
353 #[primary_span]
354 pub span: Span,
355 #[suggestion(
356 expand_suggestion_add_fragspec,
357 style = "verbose",
358 code = ":spec",
359 applicability = "maybe-incorrect"
360 )]
361 pub add_span: Span,
362 pub valid: &'static str,
363}
364
365#[derive(Diagnostic)]
366#[diag(expand_invalid_fragment_specifier)]
367#[help]
368pub(crate) struct InvalidFragmentSpecifier {
369 #[primary_span]
370 pub span: Span,
371 pub fragment: Ident,
372 pub help: &'static str,
373}
374
375#[derive(Diagnostic)]
376#[diag(expand_expected_paren_or_brace)]
377pub(crate) struct ExpectedParenOrBrace<'a> {
378 #[primary_span]
379 pub span: Span,
380 pub token: Cow<'a, str>,
381}
382
383#[derive(Diagnostic)]
384#[diag(expand_empty_delegation_mac)]
385pub(crate) struct EmptyDelegationMac {
386 #[primary_span]
387 pub span: Span,
388 pub kind: String,
389}
390
391#[derive(Diagnostic)]
392#[diag(expand_glob_delegation_outside_impls)]
393pub(crate) struct GlobDelegationOutsideImpls {
394 #[primary_span]
395 pub span: Span,
396}
397
398#[derive(Diagnostic)]
399#[diag(expand_crate_name_in_cfg_attr)]
400pub(crate) struct CrateNameInCfgAttr {
401 #[primary_span]
402 pub span: Span,
403}
404
405#[derive(Diagnostic)]
406#[diag(expand_crate_type_in_cfg_attr)]
407pub(crate) struct CrateTypeInCfgAttr {
408 #[primary_span]
409 pub span: Span,
410}
411
412#[derive(Diagnostic)]
413#[diag(expand_glob_delegation_traitless_qpath)]
414pub(crate) struct GlobDelegationTraitlessQpath {
415 #[primary_span]
416 pub span: Span,
417}
418
419#[derive(Diagnostic)]
422#[diag(expand_proc_macro_back_compat)]
423#[note]
424pub(crate) struct ProcMacroBackCompat {
425 pub crate_name: String,
426 pub fixed_version: String,
427}
428
429pub(crate) use metavar_exprs::*;
430mod metavar_exprs {
431 use super::*;
432
433 #[derive(Diagnostic, Default)]
434 #[diag(expand_mve_extra_tokens)]
435 pub(crate) struct MveExtraTokens {
436 #[primary_span]
437 #[suggestion(code = "", applicability = "machine-applicable")]
438 pub span: Span,
439 #[label]
440 pub ident_span: Span,
441 pub extra_count: usize,
442
443 #[note(expand_exact)]
446 pub exact_args_note: Option<()>,
447 #[note(expand_range)]
448 pub range_args_note: Option<()>,
449 pub min_or_exact_args: usize,
450 pub max_args: usize,
451 pub name: String,
452 }
453
454 #[derive(Diagnostic)]
455 #[note]
456 #[diag(expand_mve_missing_paren)]
457 pub(crate) struct MveMissingParen {
458 #[primary_span]
459 #[label]
460 pub ident_span: Span,
461 #[label(expand_unexpected)]
462 pub unexpected_span: Option<Span>,
463 #[suggestion(code = "( /* ... */ )", applicability = "has-placeholders")]
464 pub insert_span: Option<Span>,
465 }
466
467 #[derive(Diagnostic)]
468 #[note]
469 #[diag(expand_mve_unrecognized_expr)]
470 pub(crate) struct MveUnrecognizedExpr {
471 #[primary_span]
472 #[label]
473 pub span: Span,
474 pub valid_expr_list: &'static str,
475 }
476
477 #[derive(Diagnostic)]
478 #[diag(expand_mve_unrecognized_var)]
479 pub(crate) struct MveUnrecognizedVar {
480 #[primary_span]
481 pub span: Span,
482 pub key: MacroRulesNormalizedIdent,
483 }
484}
485
486#[derive(Diagnostic)]
487#[diag(expand_macro_args_bad_delim)]
488pub(crate) struct MacroArgsBadDelim {
489 #[primary_span]
490 pub span: Span,
491 #[subdiagnostic]
492 pub sugg: MacroArgsBadDelimSugg,
493 pub rule_kw: Symbol,
494}
495
496#[derive(Subdiagnostic)]
497#[multipart_suggestion(expand_macro_args_bad_delim_sugg, applicability = "machine-applicable")]
498pub(crate) struct MacroArgsBadDelimSugg {
499 #[suggestion_part(code = "(")]
500 pub open: Span,
501 #[suggestion_part(code = ")")]
502 pub close: Span,
503}