From 426ad8e165aeb70a3d12b8bc870cb0c57a308bc7 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Thu, 28 Jan 2021 19:06:33 +0100 Subject: [PATCH] Classify function calls as functions when shadowed by types --- crates/hir/src/source_analyzer.rs | 8 ++++++-- crates/hir_ty/src/diagnostics/unsafe_check.rs | 12 +++--------- crates/hir_ty/src/lib.rs | 19 ++++++++++++++----- .../test_data/highlighting.html | 4 ++++ crates/ide/src/syntax_highlighting/tests.rs | 4 ++++ 5 files changed, 31 insertions(+), 16 deletions(-) diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs index 30a8e513dd1..524120d0858 100644 --- a/crates/hir/src/source_analyzer.rs +++ b/crates/hir/src/source_analyzer.rs @@ -224,14 +224,18 @@ impl SourceAnalyzer { ) -> Option { if let Some(path_expr) = path.syntax().parent().and_then(ast::PathExpr::cast) { let expr_id = self.expr_id(db, &path_expr.into())?; - if let Some(assoc) = self.infer.as_ref()?.assoc_resolutions_for_expr(expr_id) { + let infer = self.infer.as_ref()?; + if let Some(assoc) = infer.assoc_resolutions_for_expr(expr_id) { return Some(PathResolution::AssocItem(assoc.into())); } if let Some(VariantId::EnumVariantId(variant)) = - self.infer.as_ref()?.variant_resolution_for_expr(expr_id) + infer.variant_resolution_for_expr(expr_id) { return Some(PathResolution::Def(ModuleDef::Variant(variant.into()))); } + if let Some(func) = infer[expr_id].as_fn_def() { + return Some(PathResolution::Def(ModuleDef::Function(func.into()))); + } } if let Some(path_pat) = path.syntax().parent().and_then(ast::PathPat::cast) { diff --git a/crates/hir_ty/src/diagnostics/unsafe_check.rs b/crates/hir_ty/src/diagnostics/unsafe_check.rs index 6dc86282647..9c506112da2 100644 --- a/crates/hir_ty/src/diagnostics/unsafe_check.rs +++ b/crates/hir_ty/src/diagnostics/unsafe_check.rs @@ -12,8 +12,7 @@ use hir_def::{ use hir_expand::diagnostics::DiagnosticSink; use crate::{ - db::HirDatabase, diagnostics::MissingUnsafe, lower::CallableDefId, ApplicationTy, - InferenceResult, Ty, TypeCtor, + db::HirDatabase, diagnostics::MissingUnsafe, ApplicationTy, InferenceResult, Ty, TypeCtor, }; pub(super) struct UnsafeValidator<'a, 'b: 'a> { @@ -87,13 +86,8 @@ fn walk_unsafe( ) { let expr = &body.exprs[current]; match expr { - Expr::Call { callee, .. } => { - let ty = &infer[*callee]; - if let &Ty::Apply(ApplicationTy { - ctor: TypeCtor::FnDef(CallableDefId::FunctionId(func)), - .. - }) = ty - { + &Expr::Call { callee, .. } => { + if let Some(func) = infer[callee].as_fn_def() { if db.function_data(func).is_unsafe { unsafe_exprs.push(UnsafeExpr { expr: current, inside_unsafe_block }); } diff --git a/crates/hir_ty/src/lib.rs b/crates/hir_ty/src/lib.rs index d47f975d29f..6bec389f83e 100644 --- a/crates/hir_ty/src/lib.rs +++ b/crates/hir_ty/src/lib.rs @@ -29,8 +29,8 @@ use base_db::{salsa, CrateId}; use hir_def::{ expr::ExprId, type_ref::{Mutability, Rawness}, - AdtId, AssocContainerId, DefWithBodyId, GenericDefId, HasModule, LifetimeParamId, Lookup, - TraitId, TypeAliasId, TypeParamId, + AdtId, AssocContainerId, DefWithBodyId, FunctionId, GenericDefId, HasModule, LifetimeParamId, + Lookup, TraitId, TypeAliasId, TypeParamId, }; use itertools::Itertools; @@ -43,10 +43,9 @@ use crate::{ pub use autoderef::autoderef; pub use infer::{InferTy, InferenceResult}; -pub use lower::CallableDefId; pub use lower::{ - associated_type_shorthand_candidates, callable_item_sig, ImplTraitLoweringMode, TyDefId, - TyLoweringContext, ValueTyDefId, + associated_type_shorthand_candidates, callable_item_sig, CallableDefId, ImplTraitLoweringMode, + TyDefId, TyLoweringContext, ValueTyDefId, }; pub use traits::{InEnvironment, Obligation, ProjectionPredicate, TraitEnvironment}; @@ -824,6 +823,16 @@ impl Ty { } } + pub fn as_fn_def(&self) -> Option { + match self { + &Ty::Apply(ApplicationTy { + ctor: TypeCtor::FnDef(CallableDefId::FunctionId(func)), + .. + }) => Some(func), + _ => None, + } + } + pub fn callable_sig(&self, db: &dyn HirDatabase) -> Option { match self { Ty::Apply(a_ty) => match a_ty.ctor { diff --git a/crates/ide/src/syntax_highlighting/test_data/highlighting.html b/crates/ide/src/syntax_highlighting/test_data/highlighting.html index 23714956660..2f983c0b8a1 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlighting.html +++ b/crates/ide/src/syntax_highlighting/test_data/highlighting.html @@ -108,6 +108,10 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd } } +fn str() { + str(); +} + static mut STATIC_MUT: i32 = 0; fn foo<'a, T>() -> T { diff --git a/crates/ide/src/syntax_highlighting/tests.rs b/crates/ide/src/syntax_highlighting/tests.rs index a62704c39e7..1854da91421 100644 --- a/crates/ide/src/syntax_highlighting/tests.rs +++ b/crates/ide/src/syntax_highlighting/tests.rs @@ -81,6 +81,10 @@ impl FooCopy { } } +fn str() { + str(); +} + static mut STATIC_MUT: i32 = 0; fn foo<'a, T>() -> T {