1use std::borrow::Cow;
2use std::rc::Rc;
3
4#[derive(Clone, Debug, PartialEq, Eq, Hash)]
5pub struct DiagnosticCode(Cow<'static, str>);
6
7macro_rules! diagnostic_codes {
8 ($($constant:ident = $code:literal,)*) => {
9 impl DiagnosticCode {
10 $(pub const $constant: Self = Self(Cow::Borrowed($code));)*
11
12 const NAMED: &[(&str, &str)] = &[$((stringify!($constant), $code)),*];
13 }
14 };
15}
16
17diagnostic_codes! {
18 UNCLOSED_LIST = "L0101",
19 UNMATCHED_CLOSE = "L0102",
20 UNTERMINATED_STRING = "L0103",
21 UNKNOWN_ESCAPE = "L0104",
22 MALFORMED_NUMBER = "L0105",
23 RESERVED_CHARACTER = "L0106",
24 NUMBER_TOO_LARGE = "L0107",
25 LIST_TOO_DEEP = "L0108",
26
27 UNBOUND_NAME = "L0201",
28 AMBIGUOUS_NAME = "L0202",
29 DUPLICATE_DEFINITION = "L0203",
30 UNKNOWN_MODULE = "L0204",
31 MISSING_EXPORT = "L0205",
32 IMPORT_CYCLE = "L0206",
33 NOT_A_DEFINITION = "L0207",
34 MODULE_LEVEL_ONLY = "L0208",
35 EMPTY_CALL = "L0209",
36 MALFORMED_FORM = "L0210",
37 FORM_AS_VALUE = "L0211",
38 WRONG_NAMESPACE = "L0212",
39 BAD_TYPE_TEMPLATE = "L0213",
40 RECUR_OUTSIDE_TAIL = "L0214",
41 RECUR_ARGUMENT_COUNT = "L0215",
42 RECUR_OUTSIDE_FN = "L0216",
43 SECOND_TRAIT_PATH = "L0217",
44 MALFORMED_TEMPLATE = "L0218",
45 TYPE_PARAMETERS_ON_NAME = "L0219",
46 TRY_OUTSIDE_FN = "L0220",
47 TYPE_PARAMETER_PLACEHOLDER = "L0221",
48 TYPE_PLACEHOLDER_IN_RUST_TYPE = "L0222",
49 RUST_TYPE_CLAUSES_NEED_ONE_PARAMETER = "L0223",
50 BORROWED_TYPE_PLACEHOLDER = "L0224",
51 PLACEHOLDER_WITHOUT_PARAMETER = "L0225",
52 UNUSED_TYPE_PLACEHOLDER = "L0226",
53 LET_OUTSIDE_BODY = "L0227",
54 MALFORMED_TYPE = "L0228",
55 MACRO_OUTSIDE_DEF = "L0229",
56 MIXED_VARIANT_PAYLOAD = "L0230",
57 NOT_A_PATTERN = "L0231",
58 VARIANT_AS_VALUE = "L0233",
59 NOT_A_TYPE = "L0234",
60 NOT_A_NAME = "L0235",
61 SIGNATURE_TARGET = "L0236",
62 DERIVE_TARGET = "L0237",
63 DERIVE_TRAIT = "L0238",
64 MISSING_METHOD = "L0239",
65 EXTRA_METHOD = "L0240",
66 UNDECLARED_METHOD = "L0241",
67 GENERIC_IMPLEMENTOR = "L0242",
68 FIELD_KEYWORD_ARITY = "L0243",
69 KEYWORD_BINDER = "L0244",
70 IGNORED_BINDING_READ = "L0245",
71 RUST_CLAUSES_NEED_ONE_PARAMETER = "L0246",
72 CLAUSE_PASSES_ARGUMENTS_UNLIKE_TEMPLATE = "L0247",
73 MALFORMED_STRUCTURAL_CLAUSE = "L0248",
74 INPUT_SET_ASIDE = "L0249",
75 RESERVED_MODULE_NAME = "L0250",
76 LIBRARY_HIDES_LOCAL_MODULE = "L0251",
77 UNLISTED_LIBRARY = "L0252",
78 LOCAL_MODULE_BESIDE_LIBRARY = "L0253",
79 MODULE_OUTSIDE_CHECKOUT = "L0254",
80 INTERNAL_MODULE = "L0255",
81 TEST_MODULE_HIDES_SOURCE_MODULE = "L0256",
82
83 MACRO_FAILED = "L0301",
84 MACRO_RESULT_NOT_FORM = "L0302",
85 COMPILE_TIME_ERROR = "L0303",
86 MACRO_AS_VALUE = "L0304",
87 EXPANSION_TOO_DEEP = "L0305",
88 PROGRAM_ONLY = "L0306",
89 COMPILE_TIME_CYCLE = "L0307",
90 BROKEN_DEFINITION = "L0308",
91 BROKEN_MACRO = "L0309",
92 NOT_AT_COMPILE_TIME = "L0310",
93 COMPILE_TIME_ARGUMENT_COUNT = "L0311",
94 NOT_CALLABLE = "L0312",
95 NOT_A_BOOLEAN = "L0313",
96 INDEX_OUT_OF_RANGE = "L0314",
97 ARITHMETIC_OVERFLOW = "L0315",
98 RUNTIME_ONLY = "L0316",
99 MATCH_AT_RUNTIME = "L0317",
100 COMPILE_TIME_RECURSION = "L0318",
101 RUST_CODE_PROGRAM_ONLY = "L0319",
102 REPEATED_PARAMETER = "L0320",
103 FAILURE_PART = "L0321",
104 UNKNOWN_FAILURE_CODE = "L0322",
105 UNKNOWN_PARAMETER = "L0323",
106 UNKNOWN_FIELD_DEFAULT = "L0324",
107 EXPANSION_NESTS_TOO_DEEP = "L0325",
108 EXPANSION_TOO_LARGE = "L0326",
109 UNDOCUMENTED_TERM = "L0327",
110 DOCSTRING_BEFORE_PARAMETERS = "L0328",
111 MALFORMED_HEADER_SHAPE = "L0329",
112 UNEQUAL_REPETITIONS = "L0330",
113 UNEXPECTED_HEADER_SHAPE_MARKER = "L0331",
114 TRAILING_COLON = "L0332",
115 DUPLICATE_TEST = "L0333",
116 BINDING_WITHOUT_VALUE = "L0334",
117 BINDINGS_WITHOUT_BODY = "L0335",
118 MALFORMED_BINDING_LIST = "L0336",
119 PARTLY_LABELED_CALL = "L0338",
120 MALFORMED_DEFINER_HEAD = "L0339",
121 MISPLACED_RUST_CLAUSE = "L0340",
122 MALFORMED_RUST_CLAUSE = "L0341",
123 MALFORMED_TRAIT_METHOD = "L0342",
124 METHOD_IN_RUST_TRAIT = "L0343",
125 RUST_TRAIT_SUPERTRAITS = "L0344",
126 DEFTYPE_WITHOUT_RUST = "L0345",
127 MALFORMED_VARIANT = "L0346",
128 VARIANT_STRUCT_PAYLOAD = "L0347",
129 MIXED_VARIANT_ITEMS = "L0348",
130 VARIANT_FIELD_WITHOUT_TYPE = "L0349",
131 PROJECT_FORM_IN_PROGRAM = "L0350",
132 UNDEFINED_DOCUMENTED_TERM = "L0351",
133 PRN_WITHOUT_VALUE = "L0352",
134 UPDATE_ARGUMENTS = "L0353",
135
136 MISMATCHED_TYPES = "L0401",
137 WRONG_ARGUMENT_COUNT = "L0402",
138 NOT_A_FUNCTION = "L0403",
139 MISSING_TRAIT = "L0404",
140 LITERAL_OUT_OF_RANGE = "L0406",
141 CANNOT_INFER = "L0407",
142 UNKNOWN_FIELD = "L0408",
143 MISSING_FIELDS = "L0409",
144 NO_FIELDS = "L0410",
145 INFINITE_TYPE = "L0411",
146 COMPILE_TIME_ONLY = "L0412",
147 MISPLACED_WHERE = "L0413",
148 LITERAL_TYPE_PARAMETER = "L0414",
149 WRONG_TYPE_ARGUMENT_COUNT = "L0415",
150 UNUSED_TYPE_PARAMETER = "L0416",
151 BOUNDED_TYPE_PARAMETER = "L0417",
152 BARE_IMPLEMENTOR = "L0418",
153 MUT_BORROW_OF_COPY = "L0419",
154 TRAIT_CLAIM_ON_STRUCT = "L0421",
155 NOT_DERIVABLE = "L0422",
156 BLOCKED_DERIVE = "L0423",
157 DUPLICATE_DERIVE = "L0424",
158 TRAIT_NO_SECOND_TYPE = "L0425",
159 MISPLACED_WITH = "L0426",
160 TRY_TARGET = "L0428",
161 TRY_NOT_RESULT_OR_OPTION = "L0429",
162 TRY_NO_CONVERSION = "L0437",
163 AMBIGUOUS_VARIANT = "L0430",
164 UNKNOWN_VARIANT = "L0431",
165 WRONG_PATTERN_COUNT = "L0432",
166 NON_EXHAUSTIVE_MATCH = "L0433",
167 UNREACHABLE_ARM = "L0434",
168 DERIVE_ON_RUST_TYPE = "L0435",
169 VARIANT_ARM_VALUE = "L0436",
170 ENUM_RUST_TEMPLATE = "L0438",
171 RECURSIVELY_USED_TYPE_PARAMETER = "L0439",
172 MISSING_BOUND = "L0440",
173 LITERAL_MISFIT = "L0441",
174 QUOTE_AT_RUNTIME = "L0442",
175 UNUSED_ENUM_PARAMETER = "L0443",
176 UNSIZABLE_IMPLEMENTOR = "L0444",
177 FOREIGN_IMPLEMENTOR = "L0445",
178 SUPERTRAIT = "L0446",
179 ASSOCIATED_TYPE = "L0447",
180 OBJECT_SAFETY = "L0448",
181 TRAIT_OUTSIDE_BOX = "L0449",
182 MISSING_ASSOCIATED_VALUE = "L0450",
183 PROJECTION_WITHOUT_IMPLEMENTOR = "L0451",
184 UNDECLARED_ASSOCIATED_VALUE = "L0452",
185 PROJECTION_WITHOUT_BOUND = "L0453",
186 REPEATED_FIELD = "L0454",
187 MAIN_RETURNS_VALUE = "L0455",
188 SELFLESS_METHOD_CALL = "L0456",
189 UNKNOWN_COLLECTION = "L0457",
190 UNNAMEABLE_TYPE = "L0458",
191 SECOND_IMPL = "L0459",
192 UNKNOWN_PATTERN_FIELD = "L0460",
193 REPEATED_PATTERN_FIELD = "L0461",
194 MIXED_PATTERN_FORMS = "L0462",
195 KEYWORD_WITHOUT_PATTERN = "L0463",
196 COVERED_CLAUSE = "L0464",
197 REQUIREMENT_CYCLE = "L0465",
198
199 USE_AFTER_MOVE = "L0501",
200 NEEDS_OWNERSHIP = "L0503",
201 MISSING_BANG = "L0504",
202 MISSING_COPY_BOUND = "L0505",
203 WRITTEN_MODE_MISMATCH = "L0506",
204 FUNCTION_VALUE_MISMATCH = "L0507",
205 CLOSURE_KIND_MISMATCH = "L0509",
206 LOCAL_BORROW = "L0510",
207 CAPTURING_FUNCTION_FIELD = "L0511",
208 LENT_LOCAL_BORROW = "L0512",
209
210 MISSING_MAIN = "L0601",
211 NAME_COLLISION = "L0602",
212 BAD_TEMPLATE = "L0603",
213 RUST_ERROR = "L0604",
214 UNTIED_IMPLEMENTOR_BORROW = "L0605",
215
216 MISSING_PROJECT_FORM = "L0701",
217 EXTRA_PROJECT_FORM = "L0702",
218 MISSING_PROJECT_NAME = "L0703",
219 UNKNOWN_PROJECT_KEY = "L0704",
220 MISSING_PROJECT_VALUE = "L0705",
221 MISMATCHED_PROJECT_VALUE = "L0706",
222 UNKNOWN_PROJECT_SECTION = "L0707",
223 UNEXPECTED_PROJECT_FORM = "L0708",
224 DUPLICATE_PROJECT_ENTRY = "L0709",
225 MALFORMED_DEPENDENCY = "L0710",
226 VERSIONED_LIBRARY = "L0711",
227 LIBRARY_WITHOUT_SOURCE = "L0712",
228 CONFLICTING_LIBRARY_SOURCES = "L0713",
229 GIT_LIBRARY_WITHOUT_REVISION = "L0714",
230 SHORT_REVISION = "L0715",
231 UNVERSIONED_CRATE = "L0716",
232 UNKNOWN_EDITION = "L0717",
233 INVALID_PROJECT_NAME = "L0718",
234 UNBUILT_PROJECT_SECTION = "L0719",
235 RESERVED_LIBRARY_NAME = "L0720",
236 INVALID_LIBRARY_NAME = "L0721",
237 LIBRARY_AT_TWO_SOURCES = "L0722",
238 LIBRARY_WITHOUT_PROJECT_FILE = "L0723",
239 LIBRARY_WITHOUT_ROOT_MODULE = "L0724",
240 GIT_LIBRARY_UNAVAILABLE = "L0725",
241 INVALID_GIT_REPOSITORY = "L0727",
242 PATH_OUTSIDE_CHECKOUT = "L0728",
243}
244
245impl DiagnosticCode {
246 const STAGE_PREFIX_LENGTH: usize = 3;
247
248 pub fn from_rustc(code: String) -> Self {
249 Self(Cow::Owned(code))
250 }
251
252 pub fn as_str(&self) -> &str {
253 &self.0
254 }
255
256 pub fn macro_stage_named(name: &str) -> Option<Self> {
257 Self::macro_stage_codes()
258 .find(|(source_name, _)| source_name == name)
259 .map(|(_, code)| code)
260 }
261
262 pub fn macro_stage_names() -> Vec<Rc<str>> {
263 Self::macro_stage_codes()
264 .map(|(source_name, _)| Rc::from(source_name))
265 .collect()
266 }
267
268 fn macro_stage_codes() -> impl Iterator<Item = (String, Self)> {
269 Self::NAMED
270 .iter()
271 .map(|(constant, code)| (Self::source_name(constant), Self(Cow::Borrowed(code))))
272 .filter(|(_, code)| code.stage() == Self::MACRO_FAILED.stage())
273 }
274
275 fn source_name(constant: &str) -> String {
276 constant.replace('_', "-").to_lowercase()
277 }
278
279 fn stage(&self) -> &str {
280 &self.0[..Self::STAGE_PREFIX_LENGTH]
281 }
282}