Skip to content

Commit b3be769

Browse files
committed
Refactor additional diagnostics in rustc_attr
1 parent 40c5184 commit b3be769

File tree

3 files changed

+106
-38
lines changed

3 files changed

+106
-38
lines changed

compiler/rustc_attr/src/builtin.rs

Lines changed: 18 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -645,25 +645,18 @@ pub fn eval_condition(
645645
NestedMetaItem::Literal(Lit { span, .. })
646646
| NestedMetaItem::MetaItem(MetaItem { span, .. }),
647647
] => {
648-
sess.span_diagnostic
649-
.struct_span_err(*span, "expected a version literal")
650-
.emit();
648+
sess.emit_err(session_diagnostics::ExpectedVersionLiteral { span: *span });
651649
return false;
652650
}
653651
[..] => {
654-
sess.span_diagnostic
655-
.struct_span_err(cfg.span, "expected single version literal")
656-
.emit();
652+
sess.emit_err(session_diagnostics::ExpectedSingleVersionLiteral {
653+
span: cfg.span,
654+
});
657655
return false;
658656
}
659657
};
660658
let Some(min_version) = parse_version(min_version.as_str(), false) else {
661-
sess.span_diagnostic
662-
.struct_span_warn(
663-
*span,
664-
"unknown version literal format, assuming it refers to a future version",
665-
)
666-
.emit();
659+
sess.emit_warning(session_diagnostics::UnknownVersionLiteral { span: *span });
667660
return false;
668661
};
669662
let rustc_version = parse_version(env!("CFG_RELEASE"), true).unwrap();
@@ -706,13 +699,9 @@ pub fn eval_condition(
706699
}),
707700
sym::not => {
708701
if mis.len() != 1 {
709-
struct_span_err!(
710-
sess.span_diagnostic,
711-
cfg.span,
712-
E0536,
713-
"expected 1 cfg-pattern"
714-
)
715-
.emit();
702+
sess.emit_err(session_diagnostics::ExpectedOneCfgPattern {
703+
span: cfg.span,
704+
});
716705
return false;
717706
}
718707

@@ -738,21 +727,16 @@ pub fn eval_condition(
738727
})
739728
}
740729
_ => {
741-
struct_span_err!(
742-
sess.span_diagnostic,
743-
cfg.span,
744-
E0537,
745-
"invalid predicate `{}`",
746-
pprust::path_to_string(&cfg.path)
747-
)
748-
.emit();
730+
sess.emit_err(session_diagnostics::InvalidPredicate {
731+
span: cfg.span,
732+
predicate: pprust::path_to_string(&cfg.path),
733+
});
749734
false
750735
}
751736
}
752737
}
753738
ast::MetaItemKind::Word | MetaItemKind::NameValue(..) if cfg.path.segments.len() != 1 => {
754-
sess.span_diagnostic
755-
.span_err(cfg.path.span, "`cfg` predicate key must be an identifier");
739+
sess.emit_err(session_diagnostics::CfgPredicateIdentifier { span: cfg.path.span });
756740
true
757741
}
758742
MetaItemKind::NameValue(ref lit) if !lit.kind.is_str() => {
@@ -868,14 +852,10 @@ where
868852
}
869853
sym::suggestion => {
870854
if !sess.features_untracked().deprecated_suggestion {
871-
let mut diag = sess.struct_span_err(
872-
mi.span,
873-
"suggestions on deprecated items are unstable",
874-
);
875-
if sess.is_nightly_build() {
876-
diag.help("add `#![feature(deprecated_suggestion)]` to the crate root");
877-
}
878-
diag.note("see #94785 for more details").emit();
855+
sess.emit_err(session_diagnostics::DeprecatedItemSuggestion {
856+
span: mi.span,
857+
is_nightly: sess.is_nightly_build().then_some(()),
858+
});
879859
}
880860

881861
if !get(mi, &mut suggestion) {
@@ -921,7 +901,7 @@ where
921901
}
922902

923903
if note.is_none() {
924-
struct_span_err!(diagnostic, attr.span, E0543, "missing 'note'").emit();
904+
sess.emit_err(session_diagnostics::MissingNote { span: attr.span });
925905
continue;
926906
}
927907
}

compiler/rustc_attr/src/session_diagnostics.rs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,68 @@ pub(crate) struct SoftNoArgs {
7979
pub span: Span,
8080
}
8181

82+
#[derive(SessionDiagnostic)]
83+
#[error(attr::expected_version_literal)]
84+
pub(crate) struct ExpectedVersionLiteral {
85+
#[primary_span]
86+
pub span: Span,
87+
}
88+
89+
#[derive(SessionDiagnostic)]
90+
#[error(attr::expected_single_version_literal)]
91+
pub(crate) struct ExpectedSingleVersionLiteral {
92+
#[primary_span]
93+
pub span: Span,
94+
}
95+
96+
#[derive(SessionDiagnostic)]
97+
#[warning(attr::unknown_version_literal)]
98+
pub(crate) struct UnknownVersionLiteral {
99+
#[primary_span]
100+
pub span: Span,
101+
}
102+
103+
#[derive(SessionDiagnostic)]
104+
#[error(attr::expected_one_cfg_pattern, code = "E0536")]
105+
pub(crate) struct ExpectedOneCfgPattern {
106+
#[primary_span]
107+
pub span: Span,
108+
}
109+
110+
#[derive(SessionDiagnostic)]
111+
#[error(attr::invalid_predicate, code = "E0537")]
112+
pub(crate) struct InvalidPredicate {
113+
#[primary_span]
114+
pub span: Span,
115+
116+
pub predicate: String,
117+
}
118+
119+
#[derive(SessionDiagnostic)]
120+
#[error(attr::cfg_predicate_identifier)]
121+
pub(crate) struct CfgPredicateIdentifier {
122+
#[primary_span]
123+
pub span: Span,
124+
}
125+
126+
#[derive(SessionDiagnostic)]
127+
#[error(attr::deprecated_item_suggestion)]
128+
#[note]
129+
pub(crate) struct DeprecatedItemSuggestion {
130+
#[primary_span]
131+
pub span: Span,
132+
133+
#[help]
134+
pub is_nightly: Option<()>,
135+
}
136+
137+
#[derive(SessionDiagnostic)]
138+
#[error(attr::missing_note, code = "E0543")]
139+
pub(crate) struct MissingNote {
140+
#[primary_span]
141+
pub span: Span,
142+
}
143+
82144
#[derive(SessionDiagnostic)]
83145
#[error(attr::invalid_issue_string, code = "E0545")]
84146
pub(crate) struct InvalidIssueString {

compiler/rustc_error_messages/locales/en-US/attr.ftl

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,29 @@ attr_rustc_allowed_unstable_pairing =
5555
5656
attr_soft_no_args =
5757
`soft` should not have any arguments
58+
59+
attr_expected_version_literal =
60+
expected a version literal
61+
62+
attr_expected_single_version_literal =
63+
expected single version literal
64+
65+
attr_unknown_version_literal =
66+
unknown version literal format, assuming it refers to a future version
67+
68+
attr_expected_one_cfg_pattern =
69+
expected 1 cfg-pattern
70+
71+
attr_invalid_predicate =
72+
invalid predicate `{$predicate}`
73+
74+
attr_cfg_predicate_identifier =
75+
`cfg` predicate key must be an identifier
76+
77+
attr_deprecated_item_suggestion =
78+
suggestions on deprecated items are unstable
79+
.help = add `#![feature(deprecated_suggestion)]` to the crate root
80+
.note = see #94785 for more details
81+
82+
attr_missing_note =
83+
missing 'note'

0 commit comments

Comments
 (0)