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)]
268pub(crate) struct ModuleInBlock {
269 #[primary_span]
270 pub span: Span,
271 #[subdiagnostic]
272 pub name: Option<ModuleInBlockName>,
273}
274
275#[derive(Subdiagnostic)]
276#[note(expand_note)]
277pub(crate) struct ModuleInBlockName {
278 #[primary_span]
279 pub span: Span,
280 pub name: Ident,
281}
282
283#[derive(Diagnostic)]
284#[diag(expand_module_file_not_found, code = E0583)]
285#[help]
286#[note]
287pub(crate) struct ModuleFileNotFound {
288 #[primary_span]
289 pub span: Span,
290 pub name: Ident,
291 pub default_path: String,
292 pub secondary_path: String,
293}
294
295#[derive(Diagnostic)]
296#[diag(expand_module_multiple_candidates, code = E0761)]
297#[help]
298pub(crate) struct ModuleMultipleCandidates {
299 #[primary_span]
300 pub span: Span,
301 pub name: Ident,
302 pub default_path: String,
303 pub secondary_path: String,
304}
305
306#[derive(Diagnostic)]
307#[diag(expand_trace_macro)]
308pub(crate) struct TraceMacro {
309 #[primary_span]
310 pub span: Span,
311}
312
313#[derive(Diagnostic)]
314#[diag(expand_proc_macro_panicked)]
315pub(crate) struct ProcMacroPanicked {
316 #[primary_span]
317 pub span: Span,
318 #[subdiagnostic]
319 pub message: Option<ProcMacroPanickedHelp>,
320}
321
322#[derive(Subdiagnostic)]
323#[help(expand_help)]
324pub(crate) struct ProcMacroPanickedHelp {
325 pub message: String,
326}
327
328#[derive(Diagnostic)]
329#[diag(expand_proc_macro_derive_panicked)]
330pub(crate) struct ProcMacroDerivePanicked {
331 #[primary_span]
332 pub span: Span,
333 #[subdiagnostic]
334 pub message: Option<ProcMacroDerivePanickedHelp>,
335}
336
337#[derive(Subdiagnostic)]
338#[help(expand_help)]
339pub(crate) struct ProcMacroDerivePanickedHelp {
340 pub message: String,
341}
342
343#[derive(Diagnostic)]
344#[diag(expand_custom_attribute_panicked)]
345pub(crate) struct CustomAttributePanicked {
346 #[primary_span]
347 pub span: Span,
348 #[subdiagnostic]
349 pub message: Option<CustomAttributePanickedHelp>,
350}
351
352#[derive(Subdiagnostic)]
353#[help(expand_help)]
354pub(crate) struct CustomAttributePanickedHelp {
355 pub message: String,
356}
357
358#[derive(Diagnostic)]
359#[diag(expand_proc_macro_derive_tokens)]
360pub(crate) struct ProcMacroDeriveTokens {
361 #[primary_span]
362 pub span: Span,
363}
364
365#[derive(Diagnostic)]
366#[diag(expand_duplicate_matcher_binding)]
367pub(crate) struct DuplicateMatcherBinding {
368 #[primary_span]
369 #[label]
370 pub span: Span,
371 #[label(expand_label2)]
372 pub prev: Span,
373}
374
375#[derive(LintDiagnostic)]
376#[diag(expand_duplicate_matcher_binding)]
377pub(crate) struct DuplicateMatcherBindingLint {
378 #[label]
379 pub span: Span,
380 #[label(expand_label2)]
381 pub prev: Span,
382}
383
384#[derive(Diagnostic)]
385#[diag(expand_missing_fragment_specifier)]
386#[note]
387#[help(expand_valid)]
388pub(crate) struct MissingFragmentSpecifier {
389 #[primary_span]
390 pub span: Span,
391 #[suggestion(
392 expand_suggestion_add_fragspec,
393 style = "verbose",
394 code = ":spec",
395 applicability = "maybe-incorrect"
396 )]
397 pub add_span: Span,
398 pub valid: &'static str,
399}
400
401#[derive(Diagnostic)]
402#[diag(expand_invalid_fragment_specifier)]
403#[help]
404pub(crate) struct InvalidFragmentSpecifier {
405 #[primary_span]
406 pub span: Span,
407 pub fragment: Ident,
408 pub help: &'static str,
409}
410
411#[derive(Diagnostic)]
412#[diag(expand_expected_paren_or_brace)]
413pub(crate) struct ExpectedParenOrBrace<'a> {
414 #[primary_span]
415 pub span: Span,
416 pub token: Cow<'a, str>,
417}
418
419#[derive(Diagnostic)]
420#[diag(expand_empty_delegation_mac)]
421pub(crate) struct EmptyDelegationMac {
422 #[primary_span]
423 pub span: Span,
424 pub kind: String,
425}
426
427#[derive(Diagnostic)]
428#[diag(expand_glob_delegation_outside_impls)]
429pub(crate) struct GlobDelegationOutsideImpls {
430 #[primary_span]
431 pub span: Span,
432}
433
434#[derive(Diagnostic)]
435#[diag(expand_crate_name_in_cfg_attr)]
436pub(crate) struct CrateNameInCfgAttr {
437 #[primary_span]
438 pub span: Span,
439}
440
441#[derive(Diagnostic)]
442#[diag(expand_crate_type_in_cfg_attr)]
443pub(crate) struct CrateTypeInCfgAttr {
444 #[primary_span]
445 pub span: Span,
446}
447
448#[derive(Diagnostic)]
449#[diag(expand_glob_delegation_traitless_qpath)]
450pub(crate) struct GlobDelegationTraitlessQpath {
451 #[primary_span]
452 pub span: Span,
453}
454
455#[derive(Diagnostic)]
458#[diag(expand_proc_macro_back_compat)]
459#[note]
460pub(crate) struct ProcMacroBackCompat {
461 pub crate_name: String,
462 pub fixed_version: String,
463}
464
465pub(crate) use metavar_exprs::*;
466mod metavar_exprs {
467 use super::*;
468
469 #[derive(Diagnostic, Default)]
470 #[diag(expand_mve_extra_tokens)]
471 pub(crate) struct MveExtraTokens {
472 #[primary_span]
473 #[suggestion(code = "", applicability = "machine-applicable")]
474 pub span: Span,
475 #[label]
476 pub ident_span: Span,
477 pub extra_count: usize,
478
479 #[note(expand_exact)]
482 pub exact_args_note: Option<()>,
483 #[note(expand_range)]
484 pub range_args_note: Option<()>,
485 pub min_or_exact_args: usize,
486 pub max_args: usize,
487 pub name: String,
488 }
489
490 #[derive(Diagnostic)]
491 #[note]
492 #[diag(expand_mve_missing_paren)]
493 pub(crate) struct MveMissingParen {
494 #[primary_span]
495 #[label]
496 pub ident_span: Span,
497 #[label(expand_unexpected)]
498 pub unexpected_span: Option<Span>,
499 #[suggestion(code = "( /* ... */ )", applicability = "has-placeholders")]
500 pub insert_span: Option<Span>,
501 }
502
503 #[derive(Diagnostic)]
504 #[note]
505 #[diag(expand_mve_unrecognized_expr)]
506 pub(crate) struct MveUnrecognizedExpr {
507 #[primary_span]
508 #[label]
509 pub span: Span,
510 pub valid_expr_list: &'static str,
511 }
512
513 #[derive(Diagnostic)]
514 #[diag(expand_mve_unrecognized_var)]
515 pub(crate) struct MveUnrecognizedVar {
516 #[primary_span]
517 pub span: Span,
518 pub key: MacroRulesNormalizedIdent,
519 }
520}
521
522#[derive(Diagnostic)]
523#[diag(expand_macro_args_bad_delim)]
524pub(crate) struct MacroArgsBadDelim {
525 #[primary_span]
526 pub span: Span,
527 #[subdiagnostic]
528 pub sugg: MacroArgsBadDelimSugg,
529 pub rule_kw: Symbol,
530}
531
532#[derive(Subdiagnostic)]
533#[multipart_suggestion(expand_macro_args_bad_delim_sugg, applicability = "machine-applicable")]
534pub(crate) struct MacroArgsBadDelimSugg {
535 #[suggestion_part(code = "(")]
536 pub open: Span,
537 #[suggestion_part(code = ")")]
538 pub close: Span,
539}
540
541#[derive(LintDiagnostic)]
542#[diag(expand_macro_call_unused_doc_comment)]
543#[help]
544pub(crate) struct MacroCallUnusedDocComment {
545 #[label]
546 pub span: Span,
547}
548
549#[derive(LintDiagnostic)]
550#[diag(expand_or_patterns_back_compat)]
551pub(crate) struct OrPatternsBackCompat {
552 #[suggestion(code = "{suggestion}", applicability = "machine-applicable")]
553 pub span: Span,
554 pub suggestion: String,
555}
556
557#[derive(LintDiagnostic)]
558#[diag(expand_trailing_semi_macro)]
559pub(crate) struct TrailingMacro {
560 #[note(expand_note1)]
561 #[note(expand_note2)]
562 pub is_trailing: bool,
563 pub name: Ident,
564}
565
566#[derive(LintDiagnostic)]
567#[diag(expand_unused_builtin_attribute)]
568pub(crate) struct UnusedBuiltinAttribute {
569 #[note]
570 pub invoc_span: Span,
571 pub attr_name: Symbol,
572 pub macro_name: String,
573 #[suggestion(code = "", applicability = "machine-applicable", style = "tool-only")]
574 pub attr_span: Span,
575}