//! 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, diagnostics should //! be expressed in terms of hir types themselves. pub use hir_ty::diagnostics::{CaseType, IncorrectCase}; 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, SyntaxError, SyntaxNodePtr, TextRange}; use crate::{AssocItem, Field, Local, 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, ExpectedFunction, InactiveCode, IncorrectCase, InvalidDeriveTarget, IncoherentImpl, MacroDefError, MacroError, MacroExpansionParseError, MalformedDerive, MismatchedArgCount, MismatchedTupleStructPatArgCount, MissingFields, MissingMatchArms, MissingUnsafe, MovedOutOfRef, NeedMut, NoSuchField, PrivateAssocItem, PrivateField, ReplaceFilterMapNextWithFindMap, TraitImplIncorrectSafety, TraitImplOrphan, TypedHole, TypeMismatch, UndeclaredLabel, UnimplementedBuiltinMacro, UnreachableLabel, UnresolvedExternCrate, UnresolvedField, UnresolvedImport, UnresolvedMacroCall, UnresolvedMethodCall, UnresolvedModule, UnresolvedProcMacro, UnusedMut, UnusedVariable, ]; #[derive(Debug)] pub struct BreakOutsideOfLoop { pub expr: InFile>, pub is_break: bool, pub bad_value_break: bool, } #[derive(Debug)] pub struct TypedHole { pub expr: InFile>, pub expected: Type, } #[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 UnreachableLabel { pub node: InFile>, pub name: Name, } #[derive(Debug, Clone, Eq, PartialEq)] pub struct UndeclaredLabel { pub node: InFile>, pub name: Name, } #[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, Clone, Eq, PartialEq)] pub struct MacroExpansionParseError { pub node: InFile, pub precise_location: Option, pub errors: Box<[SyntaxError]>, } #[derive(Debug, Clone, Eq, PartialEq)] pub struct MacroDefError { pub node: InFile>, pub message: String, pub name: Option, } #[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>>, pub private: bool, } #[derive(Debug)] pub struct PrivateAssocItem { pub expr_or_pat: InFile>>>, pub item: AssocItem, } #[derive(Debug)] pub struct MismatchedTupleStructPatArgCount { pub expr_or_pat: InFile>>, pub expected: usize, pub found: usize, } #[derive(Debug)] pub struct ExpectedFunction { pub call: InFile>, pub found: Type, } #[derive(Debug)] pub struct UnresolvedField { pub expr: InFile>, pub receiver: Type, pub name: Name, pub method_with_same_name_exists: bool, } #[derive(Debug)] pub struct UnresolvedMethodCall { pub expr: InFile>, pub receiver: Type, pub name: Name, pub field_with_same_name: Option, } #[derive(Debug)] pub struct PrivateField { pub expr: InFile>, pub field: Field, } #[derive(Debug)] pub struct MissingUnsafe { pub expr: InFile>, } #[derive(Debug)] pub struct MissingFields { pub file: HirFileId, pub field_list_parent: 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 scrutinee_expr: InFile>, pub uncovered_patterns: String, } #[derive(Debug)] pub struct TypeMismatch { pub expr_or_pat: InFile>>, pub expected: Type, pub actual: Type, } #[derive(Debug)] pub struct NeedMut { pub local: Local, pub span: InFile, } #[derive(Debug)] pub struct UnusedMut { pub local: Local, } #[derive(Debug)] pub struct UnusedVariable { pub local: Local, } #[derive(Debug)] pub struct MovedOutOfRef { pub ty: Type, pub span: InFile, } #[derive(Debug, PartialEq, Eq)] pub struct IncoherentImpl { pub file_id: HirFileId, pub impl_: AstPtr, } #[derive(Debug, PartialEq, Eq)] pub struct TraitImplOrphan { pub file_id: HirFileId, pub impl_: AstPtr, } // FIXME: Split this off into the corresponding 4 rustc errors #[derive(Debug, PartialEq, Eq)] pub struct TraitImplIncorrectSafety { pub file_id: HirFileId, pub impl_: AstPtr, pub should_be_safe: bool, }