Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/source_analyzer.rs')
| -rw-r--r-- | crates/hir/src/source_analyzer.rs | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs index 7a65fd99cf..b5e6d99093 100644 --- a/crates/hir/src/source_analyzer.rs +++ b/crates/hir/src/source_analyzer.rs @@ -34,15 +34,16 @@ use hir_ty::{ Adjust, Adjustment, AutoBorrow, InferenceResult, Interner, Substitution, TyExt, TyLoweringContext, }; +use smallvec::SmallVec; use syntax::{ ast::{self, AstNode}, SyntaxKind, SyntaxNode, TextRange, TextSize, }; use crate::{ - db::HirDatabase, semantics::PathResolution, Adt, AssocItem, BuiltinAttr, BuiltinType, Const, - Field, Function, Local, Macro, ModuleDef, Static, Struct, ToolModule, Trait, Type, TypeAlias, - Variant, + db::HirDatabase, semantics::PathResolution, Adt, AssocItem, BindingMode, BuiltinAttr, + BuiltinType, Const, Field, Function, Local, Macro, ModuleDef, Static, Struct, ToolModule, + Trait, Type, TypeAlias, Variant, }; /// `SourceAnalyzer` is a convenience wrapper which exposes HIR API in terms of @@ -182,7 +183,7 @@ impl SourceAnalyzer { let coerced = infer .pat_adjustments .get(&pat_id) - .and_then(|adjusts| adjusts.last().map(|adjust| adjust.target.clone())); + .and_then(|adjusts| adjusts.last().map(|adjust| adjust.clone())); let ty = infer[pat_id].clone(); let mk_ty = |ty| Type::new_with_resolver(db, &self.resolver, ty); Some((mk_ty(ty), coerced.map(mk_ty))) @@ -199,6 +200,38 @@ impl SourceAnalyzer { Some(Type::new_with_resolver(db, &self.resolver, ty)) } + pub(crate) fn binding_mode_of_pat( + &self, + _db: &dyn HirDatabase, + pat: &ast::IdentPat, + ) -> Option<BindingMode> { + let pat_id = self.pat_id(&pat.clone().into())?; + let infer = self.infer.as_ref()?; + infer.pat_binding_modes.get(&pat_id).map(|bm| match bm { + hir_ty::BindingMode::Move => BindingMode::Move, + hir_ty::BindingMode::Ref(hir_ty::Mutability::Mut) => BindingMode::Ref(Mutability::Mut), + hir_ty::BindingMode::Ref(hir_ty::Mutability::Not) => { + BindingMode::Ref(Mutability::Shared) + } + }) + } + pub(crate) fn pattern_adjustments( + &self, + db: &dyn HirDatabase, + pat: &ast::Pat, + ) -> Option<SmallVec<[Type; 1]>> { + let pat_id = self.pat_id(&pat)?; + let infer = self.infer.as_ref()?; + Some( + infer + .pat_adjustments + .get(&pat_id)? + .iter() + .map(|ty| Type::new_with_resolver(db, &self.resolver, ty.clone())) + .collect(), + ) + } + pub(crate) fn resolve_method_call( &self, db: &dyn HirDatabase, |