]> git.lizzy.rs Git - rust.git/blob - crates/hir_ty/src/diagnostics.rs
minor: use minicore
[rust.git] / crates / hir_ty / src / diagnostics.rs
1 //! Type inference-based diagnostics.
2 mod expr;
3 mod match_check;
4 mod unsafe_check;
5 mod decl_check;
6
7 use std::fmt;
8
9 use base_db::CrateId;
10 use hir_def::ModuleDefId;
11 use hir_expand::HirFileId;
12 use syntax::{ast, AstPtr};
13
14 use crate::db::HirDatabase;
15
16 pub use crate::diagnostics::{
17     expr::{
18         record_literal_missing_fields, record_pattern_missing_fields, BodyValidationDiagnostic,
19     },
20     unsafe_check::missing_unsafe,
21 };
22
23 pub fn validate_module_item(
24     db: &dyn HirDatabase,
25     krate: CrateId,
26     owner: ModuleDefId,
27 ) -> Vec<IncorrectCase> {
28     let _p = profile::span("validate_module_item");
29     let mut validator = decl_check::DeclValidator::new(db, krate);
30     validator.validate_item(owner);
31     validator.sink
32 }
33
34 #[derive(Debug)]
35 pub enum CaseType {
36     // `some_var`
37     LowerSnakeCase,
38     // `SOME_CONST`
39     UpperSnakeCase,
40     // `SomeStruct`
41     UpperCamelCase,
42 }
43
44 impl fmt::Display for CaseType {
45     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46         let repr = match self {
47             CaseType::LowerSnakeCase => "snake_case",
48             CaseType::UpperSnakeCase => "UPPER_SNAKE_CASE",
49             CaseType::UpperCamelCase => "CamelCase",
50         };
51
52         write!(f, "{}", repr)
53     }
54 }
55
56 #[derive(Debug)]
57 pub enum IdentType {
58     Constant,
59     Enum,
60     Field,
61     Function,
62     Parameter,
63     StaticVariable,
64     Structure,
65     Variable,
66     Variant,
67 }
68
69 impl fmt::Display for IdentType {
70     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
71         let repr = match self {
72             IdentType::Constant => "Constant",
73             IdentType::Enum => "Enum",
74             IdentType::Field => "Field",
75             IdentType::Function => "Function",
76             IdentType::Parameter => "Parameter",
77             IdentType::StaticVariable => "Static variable",
78             IdentType::Structure => "Structure",
79             IdentType::Variable => "Variable",
80             IdentType::Variant => "Variant",
81         };
82
83         write!(f, "{}", repr)
84     }
85 }
86
87 #[derive(Debug)]
88 pub struct IncorrectCase {
89     pub file: HirFileId,
90     pub ident: AstPtr<ast::Name>,
91     pub expected_case: CaseType,
92     pub ident_type: IdentType,
93     pub ident_text: String,
94     pub suggested_text: String,
95 }