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