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