From f8009666beaedb34197da9c87cc54d8ca65203b8 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 12 Jun 2021 17:17:23 +0300 Subject: internal: move inference diagnostics to hir --- crates/hir/src/lib.rs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'crates/hir/src/lib.rs') diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index 0bb3767c1..bce626b03 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -36,8 +36,9 @@ use std::{iter, sync::Arc}; use arrayvec::ArrayVec; use base_db::{CrateDisplayName, CrateId, Edition, FileId}; use diagnostics::{ - InactiveCode, MacroError, UnimplementedBuiltinMacro, UnresolvedExternCrate, UnresolvedImport, - UnresolvedMacroCall, UnresolvedModule, UnresolvedProcMacro, + BreakOutsideOfLoop, InactiveCode, MacroError, NoSuchField, UnimplementedBuiltinMacro, + UnresolvedExternCrate, UnresolvedImport, UnresolvedMacroCall, UnresolvedModule, + UnresolvedProcMacro, }; use either::Either; use hir_def::{ @@ -1042,6 +1043,23 @@ impl Function { } } + let infer = db.infer(self.id.into()); + let (_, source_map) = db.body_with_source_map(self.id.into()); + for d in &infer.diagnostics { + match d { + hir_ty::InferenceDiagnostic::NoSuchField { expr } => { + let field = source_map.field_syntax(*expr); + sink.push(NoSuchField { file: field.file_id, field: field.value }) + } + hir_ty::InferenceDiagnostic::BreakOutsideOfLoop { expr } => { + let ptr = source_map + .expr_syntax(*expr) + .expect("break outside of loop in synthetic syntax"); + sink.push(BreakOutsideOfLoop { file: ptr.file_id, expr: ptr.value }) + } + } + } + hir_ty::diagnostics::validate_module_item(db, krate, self.id.into(), sink); hir_ty::diagnostics::validate_body(db, self.id.into(), sink); } -- cgit v1.2.3