Skip to main content

knave_expand/diagnostic/
code.rs

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}