• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! Diagnostics emitted during DefMap construction.
2 
3 use base_db::CrateId;
4 use cfg::{CfgExpr, CfgOptions};
5 use hir_expand::{attrs::AttrId, MacroCallKind};
6 use la_arena::Idx;
7 use syntax::{
8     ast::{self, AnyHasAttrs},
9     SyntaxError,
10 };
11 
12 use crate::{
13     item_tree::{self, ItemTreeId},
14     nameres::LocalModuleId,
15     path::ModPath,
16     AstId,
17 };
18 
19 #[derive(Debug, PartialEq, Eq)]
20 pub enum DefDiagnosticKind {
21     UnresolvedModule { ast: AstId<ast::Module>, candidates: Box<[String]> },
22 
23     UnresolvedExternCrate { ast: AstId<ast::ExternCrate> },
24 
25     UnresolvedImport { id: ItemTreeId<item_tree::Import>, index: Idx<ast::UseTree> },
26 
27     UnconfiguredCode { ast: AstId<AnyHasAttrs>, cfg: CfgExpr, opts: CfgOptions },
28 
29     UnresolvedProcMacro { ast: MacroCallKind, krate: CrateId },
30 
31     UnresolvedMacroCall { ast: MacroCallKind, path: ModPath },
32 
33     MacroError { ast: MacroCallKind, message: String },
34 
35     MacroExpansionParseError { ast: MacroCallKind, errors: Box<[SyntaxError]> },
36 
37     UnimplementedBuiltinMacro { ast: AstId<ast::Macro> },
38 
39     InvalidDeriveTarget { ast: AstId<ast::Item>, id: usize },
40 
41     MalformedDerive { ast: AstId<ast::Adt>, id: usize },
42 
43     MacroDefError { ast: AstId<ast::Macro>, message: String },
44 }
45 
46 #[derive(Debug, PartialEq, Eq)]
47 pub struct DefDiagnostic {
48     pub in_module: LocalModuleId,
49     pub kind: DefDiagnosticKind,
50 }
51 
52 impl DefDiagnostic {
unresolved_module( container: LocalModuleId, declaration: AstId<ast::Module>, candidates: Box<[String]>, ) -> Self53     pub(super) fn unresolved_module(
54         container: LocalModuleId,
55         declaration: AstId<ast::Module>,
56         candidates: Box<[String]>,
57     ) -> Self {
58         Self {
59             in_module: container,
60             kind: DefDiagnosticKind::UnresolvedModule { ast: declaration, candidates },
61         }
62     }
63 
unresolved_extern_crate( container: LocalModuleId, declaration: AstId<ast::ExternCrate>, ) -> Self64     pub(super) fn unresolved_extern_crate(
65         container: LocalModuleId,
66         declaration: AstId<ast::ExternCrate>,
67     ) -> Self {
68         Self {
69             in_module: container,
70             kind: DefDiagnosticKind::UnresolvedExternCrate { ast: declaration },
71         }
72     }
73 
unresolved_import( container: LocalModuleId, id: ItemTreeId<item_tree::Import>, index: Idx<ast::UseTree>, ) -> Self74     pub(super) fn unresolved_import(
75         container: LocalModuleId,
76         id: ItemTreeId<item_tree::Import>,
77         index: Idx<ast::UseTree>,
78     ) -> Self {
79         Self { in_module: container, kind: DefDiagnosticKind::UnresolvedImport { id, index } }
80     }
81 
unconfigured_code( container: LocalModuleId, ast: AstId<ast::AnyHasAttrs>, cfg: CfgExpr, opts: CfgOptions, ) -> Self82     pub fn unconfigured_code(
83         container: LocalModuleId,
84         ast: AstId<ast::AnyHasAttrs>,
85         cfg: CfgExpr,
86         opts: CfgOptions,
87     ) -> Self {
88         Self { in_module: container, kind: DefDiagnosticKind::UnconfiguredCode { ast, cfg, opts } }
89     }
90 
91     // FIXME: Whats the difference between this and unresolved_macro_call
unresolved_proc_macro( container: LocalModuleId, ast: MacroCallKind, krate: CrateId, ) -> Self92     pub(crate) fn unresolved_proc_macro(
93         container: LocalModuleId,
94         ast: MacroCallKind,
95         krate: CrateId,
96     ) -> Self {
97         Self { in_module: container, kind: DefDiagnosticKind::UnresolvedProcMacro { ast, krate } }
98     }
99 
macro_error( container: LocalModuleId, ast: MacroCallKind, message: String, ) -> Self100     pub(crate) fn macro_error(
101         container: LocalModuleId,
102         ast: MacroCallKind,
103         message: String,
104     ) -> Self {
105         Self { in_module: container, kind: DefDiagnosticKind::MacroError { ast, message } }
106     }
107 
macro_expansion_parse_error( container: LocalModuleId, ast: MacroCallKind, errors: &[SyntaxError], ) -> Self108     pub(crate) fn macro_expansion_parse_error(
109         container: LocalModuleId,
110         ast: MacroCallKind,
111         errors: &[SyntaxError],
112     ) -> Self {
113         Self {
114             in_module: container,
115             kind: DefDiagnosticKind::MacroExpansionParseError {
116                 ast,
117                 errors: errors.to_vec().into_boxed_slice(),
118             },
119         }
120     }
121 
122     // FIXME: Whats the difference between this and unresolved_proc_macro
unresolved_macro_call( container: LocalModuleId, ast: MacroCallKind, path: ModPath, ) -> Self123     pub(crate) fn unresolved_macro_call(
124         container: LocalModuleId,
125         ast: MacroCallKind,
126         path: ModPath,
127     ) -> Self {
128         Self { in_module: container, kind: DefDiagnosticKind::UnresolvedMacroCall { ast, path } }
129     }
130 
unimplemented_builtin_macro( container: LocalModuleId, ast: AstId<ast::Macro>, ) -> Self131     pub(super) fn unimplemented_builtin_macro(
132         container: LocalModuleId,
133         ast: AstId<ast::Macro>,
134     ) -> Self {
135         Self { in_module: container, kind: DefDiagnosticKind::UnimplementedBuiltinMacro { ast } }
136     }
137 
invalid_derive_target( container: LocalModuleId, ast: AstId<ast::Item>, id: AttrId, ) -> Self138     pub(super) fn invalid_derive_target(
139         container: LocalModuleId,
140         ast: AstId<ast::Item>,
141         id: AttrId,
142     ) -> Self {
143         Self {
144             in_module: container,
145             kind: DefDiagnosticKind::InvalidDeriveTarget { ast, id: id.ast_index() },
146         }
147     }
148 
malformed_derive( container: LocalModuleId, ast: AstId<ast::Adt>, id: AttrId, ) -> Self149     pub(super) fn malformed_derive(
150         container: LocalModuleId,
151         ast: AstId<ast::Adt>,
152         id: AttrId,
153     ) -> Self {
154         Self {
155             in_module: container,
156             kind: DefDiagnosticKind::MalformedDerive { ast, id: id.ast_index() },
157         }
158     }
159 }
160