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