From 0b95bed83fc8db897f54b350168567f14527e8de Mon Sep 17 00:00:00 2001 From: Paul Daniel Faria Date: Sat, 23 May 2020 17:49:53 -0400 Subject: Add unsafe diagnostics and unsafe highlighting --- crates/ra_hir/src/code_model.rs | 5 +++- crates/ra_hir/src/diagnostics.rs | 50 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index a379b9f49..131180a63 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -36,6 +36,7 @@ use rustc_hash::FxHashSet; use crate::{ db::{DefDatabase, HirDatabase}, + diagnostics::UnsafeValidator, has_source::HasSource, CallableDef, HirDisplay, InFile, Name, }; @@ -677,7 +678,9 @@ impl Function { let _p = profile("Function::diagnostics"); let infer = db.infer(self.id.into()); infer.add_diagnostics(db, self.id, sink); - let mut validator = ExprValidator::new(self.id, infer, sink); + let mut validator = ExprValidator::new(self.id, infer.clone(), sink); + validator.validate_body(db); + let mut validator = UnsafeValidator::new(&self, infer, sink); validator.validate_body(db); } } diff --git a/crates/ra_hir/src/diagnostics.rs b/crates/ra_hir/src/diagnostics.rs index c82883d0c..562f3fe5c 100644 --- a/crates/ra_hir/src/diagnostics.rs +++ b/crates/ra_hir/src/diagnostics.rs @@ -2,3 +2,53 @@ pub use hir_def::diagnostics::UnresolvedModule; pub use hir_expand::diagnostics::{AstDiagnostic, Diagnostic, DiagnosticSink}; pub use hir_ty::diagnostics::{MissingFields, MissingMatchArms, MissingOkInTailExpr, NoSuchField}; + +use std::sync::Arc; + +use crate::code_model::Function; +use crate::db::HirDatabase; +use crate::has_source::HasSource; +use hir_ty::{ + diagnostics::{MissingUnsafe, UnnecessaryUnsafe}, + expr::unsafe_expressions, + InferenceResult, +}; +use ra_syntax::AstPtr; + +pub struct UnsafeValidator<'a, 'b: 'a> { + func: &'a Function, + infer: Arc, + sink: &'a mut DiagnosticSink<'b>, +} + +impl<'a, 'b> UnsafeValidator<'a, 'b> { + pub fn new( + func: &'a Function, + infer: Arc, + sink: &'a mut DiagnosticSink<'b>, + ) -> UnsafeValidator<'a, 'b> { + UnsafeValidator { func, infer, sink } + } + + pub fn validate_body(&mut self, db: &dyn HirDatabase) { + let def = self.func.id.into(); + let unsafe_expressions = unsafe_expressions(db, self.infer.as_ref(), def); + let func_data = db.function_data(self.func.id); + let unnecessary = func_data.is_unsafe && unsafe_expressions.len() == 0; + let missing = !func_data.is_unsafe && unsafe_expressions.len() > 0; + if !(unnecessary || missing) { + return; + } + + let in_file = self.func.source(db); + let file = in_file.file_id; + let fn_def = AstPtr::new(&in_file.value); + let fn_name = func_data.name.clone().into(); + + if unnecessary { + self.sink.push(UnnecessaryUnsafe { file, fn_def, fn_name }) + } else { + self.sink.push(MissingUnsafe { file, fn_def, fn_name }) + } + } +} -- cgit v1.2.3 From daf1cac9f87023d37a4418ea24ed615c9706258b Mon Sep 17 00:00:00 2001 From: Paul Daniel Faria Date: Sun, 24 May 2020 01:33:22 -0400 Subject: Move diagnostics back into expr, add tests for diagnostics, fix logic to account for derefs of raw ptrs --- crates/ra_hir/src/code_model.rs | 5 ++-- crates/ra_hir/src/diagnostics.rs | 50 ---------------------------------------- 2 files changed, 2 insertions(+), 53 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 131180a63..13e763e52 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -25,7 +25,7 @@ use hir_expand::{ use hir_ty::{ autoderef, display::{HirDisplayError, HirFormatter}, - expr::ExprValidator, + expr::{ExprValidator, UnsafeValidator}, method_resolution, ApplicationTy, Canonical, GenericPredicate, InEnvironment, Substs, TraitEnvironment, Ty, TyDefId, TypeCtor, }; @@ -36,7 +36,6 @@ use rustc_hash::FxHashSet; use crate::{ db::{DefDatabase, HirDatabase}, - diagnostics::UnsafeValidator, has_source::HasSource, CallableDef, HirDisplay, InFile, Name, }; @@ -680,7 +679,7 @@ impl Function { infer.add_diagnostics(db, self.id, sink); let mut validator = ExprValidator::new(self.id, infer.clone(), sink); validator.validate_body(db); - let mut validator = UnsafeValidator::new(&self, infer, sink); + let mut validator = UnsafeValidator::new(self.id, infer, sink); validator.validate_body(db); } } diff --git a/crates/ra_hir/src/diagnostics.rs b/crates/ra_hir/src/diagnostics.rs index 562f3fe5c..c82883d0c 100644 --- a/crates/ra_hir/src/diagnostics.rs +++ b/crates/ra_hir/src/diagnostics.rs @@ -2,53 +2,3 @@ pub use hir_def::diagnostics::UnresolvedModule; pub use hir_expand::diagnostics::{AstDiagnostic, Diagnostic, DiagnosticSink}; pub use hir_ty::diagnostics::{MissingFields, MissingMatchArms, MissingOkInTailExpr, NoSuchField}; - -use std::sync::Arc; - -use crate::code_model::Function; -use crate::db::HirDatabase; -use crate::has_source::HasSource; -use hir_ty::{ - diagnostics::{MissingUnsafe, UnnecessaryUnsafe}, - expr::unsafe_expressions, - InferenceResult, -}; -use ra_syntax::AstPtr; - -pub struct UnsafeValidator<'a, 'b: 'a> { - func: &'a Function, - infer: Arc, - sink: &'a mut DiagnosticSink<'b>, -} - -impl<'a, 'b> UnsafeValidator<'a, 'b> { - pub fn new( - func: &'a Function, - infer: Arc, - sink: &'a mut DiagnosticSink<'b>, - ) -> UnsafeValidator<'a, 'b> { - UnsafeValidator { func, infer, sink } - } - - pub fn validate_body(&mut self, db: &dyn HirDatabase) { - let def = self.func.id.into(); - let unsafe_expressions = unsafe_expressions(db, self.infer.as_ref(), def); - let func_data = db.function_data(self.func.id); - let unnecessary = func_data.is_unsafe && unsafe_expressions.len() == 0; - let missing = !func_data.is_unsafe && unsafe_expressions.len() > 0; - if !(unnecessary || missing) { - return; - } - - let in_file = self.func.source(db); - let file = in_file.file_id; - let fn_def = AstPtr::new(&in_file.value); - let fn_name = func_data.name.clone().into(); - - if unnecessary { - self.sink.push(UnnecessaryUnsafe { file, fn_def, fn_name }) - } else { - self.sink.push(MissingUnsafe { file, fn_def, fn_name }) - } - } -} -- cgit v1.2.3 From f678e0d837e472dc2f1421f89f794d33f3ade55c Mon Sep 17 00:00:00 2001 From: Paul Daniel Faria Date: Thu, 28 May 2020 09:30:19 -0400 Subject: Add HighlightTag::Operator, use it for unsafe deref. Move unsafe validation to its own file --- crates/ra_hir/src/code_model.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 13e763e52..9e3b4a2d8 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -25,9 +25,11 @@ use hir_expand::{ use hir_ty::{ autoderef, display::{HirDisplayError, HirFormatter}, - expr::{ExprValidator, UnsafeValidator}, - method_resolution, ApplicationTy, Canonical, GenericPredicate, InEnvironment, Substs, - TraitEnvironment, Ty, TyDefId, TypeCtor, + expr::ExprValidator, + method_resolution, + method_resolution, ApplicationTy, Canonical, InEnvironment, Substs, TraitEnvironment, Ty, + TyDefId, TypeCtor, + unsafe_validation::UnsafeValidator, }; use ra_db::{CrateId, CrateName, Edition, FileId}; use ra_prof::profile; -- cgit v1.2.3 From 2ca52bbb325d4842d9642fc5f9e368b590c4ce41 Mon Sep 17 00:00:00 2001 From: Paul Daniel Faria Date: Tue, 2 Jun 2020 18:58:42 -0400 Subject: Revert ide highlighting changes (addressing on another branch) --- crates/ra_hir/src/code_model.rs | 4 ---- 1 file changed, 4 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 9e3b4a2d8..6aa7251b5 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -671,10 +671,6 @@ impl Function { db.function_data(self.id).params.clone() } - pub fn is_unsafe(self, db: &dyn HirDatabase) -> bool { - db.function_data(self.id).is_unsafe - } - pub fn diagnostics(self, db: &dyn HirDatabase, sink: &mut DiagnosticSink) { let _p = profile("Function::diagnostics"); let infer = db.infer(self.id.into()); -- cgit v1.2.3 From b1992b469cae689f7de01ea9031962735a409198 Mon Sep 17 00:00:00 2001 From: Paul Daniel Faria Date: Sat, 27 Jun 2020 11:20:02 -0400 Subject: Remove unneeded code, filename from tests, fix rebasing issues --- crates/ra_hir/src/code_model.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 6aa7251b5..27e94b7fe 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -27,9 +27,9 @@ use hir_ty::{ display::{HirDisplayError, HirFormatter}, expr::ExprValidator, method_resolution, - method_resolution, ApplicationTy, Canonical, InEnvironment, Substs, TraitEnvironment, Ty, - TyDefId, TypeCtor, unsafe_validation::UnsafeValidator, + ApplicationTy, Canonical, GenericPredicate, InEnvironment, Substs, TraitEnvironment, Ty, + TyDefId, TypeCtor, }; use ra_db::{CrateId, CrateName, Edition, FileId}; use ra_prof::profile; @@ -671,6 +671,10 @@ impl Function { db.function_data(self.id).params.clone() } + pub fn is_unsafe(self, db: &dyn HirDatabase) -> bool { + db.function_data(self.id).is_unsafe + } + pub fn diagnostics(self, db: &dyn HirDatabase, sink: &mut DiagnosticSink) { let _p = profile("Function::diagnostics"); let infer = db.infer(self.id.into()); -- cgit v1.2.3