Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/mir.rs')
-rw-r--r--crates/hir-ty/src/mir.rs17
1 files changed, 16 insertions, 1 deletions
diff --git a/crates/hir-ty/src/mir.rs b/crates/hir-ty/src/mir.rs
index be094b1388..22d4da0e75 100644
--- a/crates/hir-ty/src/mir.rs
+++ b/crates/hir-ty/src/mir.rs
@@ -16,7 +16,8 @@ use base_db::CrateId;
use chalk_ir::Mutability;
use either::Either;
use hir_def::{
- hir::{BindingId, Expr, ExprId, Ordering, PatId},
+ body::Body,
+ hir::{BindingAnnotation, BindingId, Expr, ExprId, Ordering, PatId},
DefWithBodyId, FieldId, StaticId, TupleFieldId, UnionId, VariantId,
};
use la_arena::{Arena, ArenaMap, Idx, RawIdx};
@@ -1174,6 +1175,20 @@ pub enum MirSpan {
Unknown,
}
+impl MirSpan {
+ pub fn is_ref_span(&self, body: &Body) -> bool {
+ match *self {
+ MirSpan::ExprId(expr) => matches!(body[expr], Expr::Ref { .. }),
+ // FIXME: Figure out if this is correct wrt. match ergonomics.
+ MirSpan::BindingId(binding) => matches!(
+ body.bindings[binding].mode,
+ BindingAnnotation::Ref | BindingAnnotation::RefMut
+ ),
+ MirSpan::PatId(_) | MirSpan::SelfParam | MirSpan::Unknown => false,
+ }
+ }
+}
+
impl_from!(ExprId, PatId for MirSpan);
impl From<&ExprId> for MirSpan {