//! Re-export diagnostics such that clients of `hir` don't have to depend on //! low-level crates. //! //! This probably isn't the best way to do this -- ideally, diagnistics should //! be expressed in terms of hir types themselves. use base_db::CrateId; use cfg::{CfgExpr, CfgOptions}; use either::Either; use hir_def::path::ModPath; use hir_expand::{name::Name, HirFileId, InFile}; use syntax::{ast, AstPtr, SyntaxNodePtr, TextRange}; use crate::{MacroKind, Type}; macro_rules! diagnostics { ($($diag:ident,)*) => { #[derive(Debug)] pub enum AnyDiagnostic {$( $diag(Box<$diag>), )*} $( impl From<$diag> for AnyDiagnostic { fn from(d: $diag) -> AnyDiagnostic { AnyDiagnostic::$diag(Box::new(d)) } } )* }; } diagnostics![ BreakOutsideOfLoop, InactiveCode, IncorrectCase, InvalidDeriveTarget, MacroError, MalformedDerive, MismatchedArgCount, MissingFields, MissingMatchArms, MissingUnsafe, NoSuchField, ReplaceFilterMapNextWithFindMap, TypeMismatch, UnimplementedBuiltinMacro, UnresolvedExternCrate, UnresolvedImport, UnresolvedMacroCall, UnresolvedModule, UnresolvedProcMacro, ]; #[derive(Debug)] pub struct UnresolvedModule { pub decl: InFile>, pub candidates: Box<[String]>, } #[derive(Debug)] pub struct UnresolvedExternCrate { pub decl: InFile>, } #[derive(Debug)] pub struct UnresolvedImport { pub decl: InFile>, } #[derive(Debug, Clone, Eq, PartialEq)] pub struct UnresolvedMacroCall { pub macro_call: InFile, pub precise_location: Option, pub path: ModPath, pub is_bang: bool, } #[derive(Debug, Clone, Eq, PartialEq)] pub struct InactiveCode { pub node: InFile, pub cfg: CfgExpr, pub opts: CfgOptions, } #[derive(Debug, Clone, Eq, PartialEq)] pub struct UnresolvedProcMacro { pub node: InFile, /// If the diagnostic can be pinpointed more accurately than via `node`, this is the `TextRange` /// to use instead. pub precise_location: Option, pub macro_name: Option, pub kind: MacroKind, /// The crate id of the proc-macro this macro belongs to, or `None` if the proc-macro can't be found. pub krate: CrateId, } #[derive(Debug, Clone, Eq, PartialEq)] pub struct MacroError { pub node: InFile, pub precise_location: Option, pub message: String, } #[derive(Debug)] pub struct UnimplementedBuiltinMacro { pub node: InFile, } #[derive(Debug)] pub struct InvalidDeriveTarget { pub node: InFile, } #[derive(Debug)] pub struct MalformedDerive { pub node: InFile, } #[derive(Debug)] pub struct NoSuchField { pub field: InFile>, } #[derive(Debug)] pub struct BreakOutsideOfLoop { pub expr: InFile>, pub is_break: bool, } #[derive(Debug)] pub struct MissingUnsafe { pub expr: InFile>, } #[derive(Debug)] pub struct MissingFields { pub file: HirFileId, pub field_list_parent: Either, AstPtr>, pub field_list_parent_path: Option>, pub missed_fields: Vec, } #[derive(Debug)] pub struct ReplaceFilterMapNextWithFindMap { pub file: HirFileId, /// This expression is the whole method chain up to and including `.filter_map(..).next()`. pub next_expr: AstPtr, } #[derive(Debug)] pub struct MismatchedArgCount { pub call_expr: InFile>, pub expected: usize, pub found: usize, } #[derive(Debug)] pub struct MissingMatchArms { pub file: HirFileId, pub match_expr: AstPtr, pub uncovered_patterns: String, } #[derive(Debug)] pub struct TypeMismatch { // FIXME: add mismatches in patterns as well pub expr: InFile>, pub expected: Type, pub actual: Type, } pub use hir_ty::diagnostics::IncorrectCase;