1 //! Re-export diagnostics such that clients of `hir` don't have to depend on
2 //! low-level crates.
3 //!
4 //! This probably isn't the best way to do this -- ideally, diagnistics should
5 //! be expressed in terms of hir types themselves.
6 use cfg::{CfgExpr, CfgOptions};
7 use either::Either;
8 use hir_def::{path::ModPath, type_ref::Mutability};
9 use hir_expand::{name::Name, HirFileId, InFile};
10 use syntax::{ast, AstPtr, SyntaxNodePtr, TextRange};
11 
12 use crate::Type;
13 
14 macro_rules! diagnostics {
15     ($($diag:ident,)*) => {
16         pub enum AnyDiagnostic {$(
17             $diag(Box<$diag>),
18         )*}
19 
20         $(
21             impl From<$diag> for AnyDiagnostic {
22                 fn from(d: $diag) -> AnyDiagnostic {
23                     AnyDiagnostic::$diag(Box::new(d))
24                 }
25             }
26         )*
27     };
28 }
29 
30 diagnostics![
31     AddReferenceHere,
32     BreakOutsideOfLoop,
33     InactiveCode,
34     IncorrectCase,
35     InvalidDeriveTarget,
36     MacroError,
37     MalformedDerive,
38     MismatchedArgCount,
39     MissingFields,
40     MissingMatchArms,
41     MissingOkOrSomeInTailExpr,
42     MissingUnsafe,
43     NoSuchField,
44     RemoveThisSemicolon,
45     ReplaceFilterMapNextWithFindMap,
46     UnimplementedBuiltinMacro,
47     UnresolvedExternCrate,
48     UnresolvedImport,
49     UnresolvedMacroCall,
50     UnresolvedModule,
51     UnresolvedProcMacro,
52 ];
53 
54 #[derive(Debug)]
55 pub struct UnresolvedModule {
56     pub decl: InFile<AstPtr<ast::Module>>,
57     pub candidate: String,
58 }
59 
60 #[derive(Debug)]
61 pub struct UnresolvedExternCrate {
62     pub decl: InFile<AstPtr<ast::ExternCrate>>,
63 }
64 
65 #[derive(Debug)]
66 pub struct UnresolvedImport {
67     pub decl: InFile<AstPtr<ast::UseTree>>,
68 }
69 
70 #[derive(Debug, Clone, Eq, PartialEq)]
71 pub struct UnresolvedMacroCall {
72     pub macro_call: InFile<AstPtr<ast::MacroCall>>,
73     pub path: ModPath,
74 }
75 
76 #[derive(Debug, Clone, Eq, PartialEq)]
77 pub struct InactiveCode {
78     pub node: InFile<SyntaxNodePtr>,
79     pub cfg: CfgExpr,
80     pub opts: CfgOptions,
81 }
82 
83 #[derive(Debug, Clone, Eq, PartialEq)]
84 pub struct UnresolvedProcMacro {
85     pub node: InFile<SyntaxNodePtr>,
86     /// If the diagnostic can be pinpointed more accurately than via `node`, this is the `TextRange`
87     /// to use instead.
88     pub precise_location: Option<TextRange>,
89     pub macro_name: Option<String>,
90 }
91 
92 #[derive(Debug, Clone, Eq, PartialEq)]
93 pub struct MacroError {
94     pub node: InFile<SyntaxNodePtr>,
95     pub message: String,
96 }
97 
98 #[derive(Debug)]
99 pub struct UnimplementedBuiltinMacro {
100     pub node: InFile<SyntaxNodePtr>,
101 }
102 
103 #[derive(Debug)]
104 pub struct InvalidDeriveTarget {
105     pub node: InFile<SyntaxNodePtr>,
106 }
107 
108 #[derive(Debug)]
109 pub struct MalformedDerive {
110     pub node: InFile<SyntaxNodePtr>,
111 }
112 
113 #[derive(Debug)]
114 pub struct NoSuchField {
115     pub field: InFile<AstPtr<ast::RecordExprField>>,
116 }
117 
118 #[derive(Debug)]
119 pub struct BreakOutsideOfLoop {
120     pub expr: InFile<AstPtr<ast::Expr>>,
121 }
122 
123 #[derive(Debug)]
124 pub struct MissingUnsafe {
125     pub expr: InFile<AstPtr<ast::Expr>>,
126 }
127 
128 #[derive(Debug)]
129 pub struct MissingFields {
130     pub file: HirFileId,
131     pub field_list_parent: Either<AstPtr<ast::RecordExpr>, AstPtr<ast::RecordPat>>,
132     pub field_list_parent_path: Option<AstPtr<ast::Path>>,
133     pub missed_fields: Vec<Name>,
134 }
135 
136 #[derive(Debug)]
137 pub struct ReplaceFilterMapNextWithFindMap {
138     pub file: HirFileId,
139     /// This expression is the whole method chain up to and including `.filter_map(..).next()`.
140     pub next_expr: AstPtr<ast::Expr>,
141 }
142 
143 #[derive(Debug)]
144 pub struct MismatchedArgCount {
145     pub call_expr: InFile<AstPtr<ast::Expr>>,
146     pub expected: usize,
147     pub found: usize,
148 }
149 
150 #[derive(Debug)]
151 pub struct RemoveThisSemicolon {
152     pub expr: InFile<AstPtr<ast::Expr>>,
153 }
154 
155 #[derive(Debug)]
156 pub struct MissingOkOrSomeInTailExpr {
157     pub expr: InFile<AstPtr<ast::Expr>>,
158     // `Some` or `Ok` depending on whether the return type is Result or Option
159     pub required: String,
160     pub expected: Type,
161 }
162 
163 #[derive(Debug)]
164 pub struct MissingMatchArms {
165     pub file: HirFileId,
166     pub match_expr: AstPtr<ast::Expr>,
167     pub arms: AstPtr<ast::MatchArmList>,
168 }
169 
170 #[derive(Debug)]
171 pub struct AddReferenceHere {
172     pub expr: InFile<AstPtr<ast::Expr>>,
173     pub mutability: Mutability,
174 }
175 
176 pub use hir_ty::diagnostics::IncorrectCase;
177