From 19450534cf308eff30ea7de1a40ab77dca4e6014 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 14 Jul 2020 10:28:55 +0200 Subject: Cleanup hir diagnostics API --- crates/ra_hir_ty/src/diagnostics/expr.rs | 28 ++++++++++++------------ crates/ra_hir_ty/src/diagnostics/unsafe_check.rs | 23 ++++++++++--------- 2 files changed, 27 insertions(+), 24 deletions(-) (limited to 'crates/ra_hir_ty/src/diagnostics') diff --git a/crates/ra_hir_ty/src/diagnostics/expr.rs b/crates/ra_hir_ty/src/diagnostics/expr.rs index 51c97f801..239be779f 100644 --- a/crates/ra_hir_ty/src/diagnostics/expr.rs +++ b/crates/ra_hir_ty/src/diagnostics/expr.rs @@ -2,7 +2,7 @@ use std::sync::Arc; -use hir_def::{path::path, resolver::HasResolver, AdtId, FunctionId}; +use hir_def::{path::path, resolver::HasResolver, AdtId, DefWithBodyId}; use hir_expand::diagnostics::DiagnosticSink; use ra_syntax::{ast, AstPtr}; use rustc_hash::FxHashSet; @@ -30,23 +30,23 @@ pub use hir_def::{ LocalFieldId, Lookup, VariantId, }; -pub struct ExprValidator<'a, 'b: 'a> { - func: FunctionId, +pub(super) struct ExprValidator<'a, 'b: 'a> { + owner: DefWithBodyId, infer: Arc, sink: &'a mut DiagnosticSink<'b>, } impl<'a, 'b> ExprValidator<'a, 'b> { - pub fn new( - func: FunctionId, + pub(super) fn new( + owner: DefWithBodyId, infer: Arc, sink: &'a mut DiagnosticSink<'b>, ) -> ExprValidator<'a, 'b> { - ExprValidator { func, infer, sink } + ExprValidator { owner, infer, sink } } - pub fn validate_body(&mut self, db: &dyn HirDatabase) { - let body = db.body(self.func.into()); + pub(super) fn validate_body(&mut self, db: &dyn HirDatabase) { + let body = db.body(self.owner.into()); for (id, expr) in body.exprs.iter() { if let Some((variant_def, missed_fields, true)) = @@ -96,7 +96,7 @@ impl<'a, 'b> ExprValidator<'a, 'b> { missed_fields: Vec, ) { // XXX: only look at source_map if we do have missing fields - let (_, source_map) = db.body_with_source_map(self.func.into()); + let (_, source_map) = db.body_with_source_map(self.owner.into()); if let Ok(source_ptr) = source_map.expr_syntax(id) { let root = source_ptr.file_syntax(db.upcast()); @@ -125,7 +125,7 @@ impl<'a, 'b> ExprValidator<'a, 'b> { missed_fields: Vec, ) { // XXX: only look at source_map if we do have missing fields - let (_, source_map) = db.body_with_source_map(self.func.into()); + let (_, source_map) = db.body_with_source_map(self.owner.into()); if let Ok(source_ptr) = source_map.pat_syntax(id) { if let Some(expr) = source_ptr.value.as_ref().left() { @@ -181,7 +181,7 @@ impl<'a, 'b> ExprValidator<'a, 'b> { let mut arg_count = args.len(); if arg_count != param_count { - let (_, source_map) = db.body_with_source_map(self.func.into()); + let (_, source_map) = db.body_with_source_map(self.owner.into()); if let Ok(source_ptr) = source_map.expr_syntax(call_id) { if is_method_call { param_count -= 1; @@ -208,7 +208,7 @@ impl<'a, 'b> ExprValidator<'a, 'b> { infer: Arc, ) { let (body, source_map): (Arc, Arc) = - db.body_with_source_map(self.func.into()); + db.body_with_source_map(self.owner.into()); let match_expr_ty = match infer.type_of_expr.get(match_expr) { Some(ty) => ty, @@ -289,7 +289,7 @@ impl<'a, 'b> ExprValidator<'a, 'b> { let core_result_path = path![core::result::Result]; - let resolver = self.func.resolver(db.upcast()); + let resolver = self.owner.resolver(db.upcast()); let core_result_enum = match resolver.resolve_known_enum(db.upcast(), &core_result_path) { Some(it) => it, _ => return, @@ -304,7 +304,7 @@ impl<'a, 'b> ExprValidator<'a, 'b> { }; if params.len() == 2 && params[0] == mismatch.actual { - let (_, source_map) = db.body_with_source_map(self.func.into()); + let (_, source_map) = db.body_with_source_map(self.owner.into()); if let Ok(source_ptr) = source_map.expr_syntax(id) { self.sink diff --git a/crates/ra_hir_ty/src/diagnostics/unsafe_check.rs b/crates/ra_hir_ty/src/diagnostics/unsafe_check.rs index c512c4f8e..b8ff95ee1 100644 --- a/crates/ra_hir_ty/src/diagnostics/unsafe_check.rs +++ b/crates/ra_hir_ty/src/diagnostics/unsafe_check.rs @@ -6,7 +6,7 @@ use std::sync::Arc; use hir_def::{ body::Body, expr::{Expr, ExprId, UnaryOp}, - DefWithBodyId, FunctionId, + DefWithBodyId, }; use hir_expand::diagnostics::DiagnosticSink; @@ -15,26 +15,29 @@ use crate::{ InferenceResult, Ty, TypeCtor, }; -pub struct UnsafeValidator<'a, 'b: 'a> { - func: FunctionId, +pub(super) struct UnsafeValidator<'a, 'b: 'a> { + owner: DefWithBodyId, infer: Arc, sink: &'a mut DiagnosticSink<'b>, } impl<'a, 'b> UnsafeValidator<'a, 'b> { - pub fn new( - func: FunctionId, + pub(super) fn new( + owner: DefWithBodyId, infer: Arc, sink: &'a mut DiagnosticSink<'b>, ) -> UnsafeValidator<'a, 'b> { - UnsafeValidator { func, infer, sink } + UnsafeValidator { owner, infer, sink } } - pub fn validate_body(&mut self, db: &dyn HirDatabase) { - let def = self.func.into(); + pub(super) fn validate_body(&mut self, db: &dyn HirDatabase) { + let def = self.owner.into(); let unsafe_expressions = unsafe_expressions(db, self.infer.as_ref(), def); - let func_data = db.function_data(self.func); - if func_data.is_unsafe + let is_unsafe = match self.owner { + DefWithBodyId::FunctionId(it) => db.function_data(it).is_unsafe, + DefWithBodyId::StaticId(_) | DefWithBodyId::ConstId(_) => false, + }; + if is_unsafe || unsafe_expressions .iter() .filter(|unsafe_expr| !unsafe_expr.inside_unsafe_block) -- cgit v1.2.3