Skip to content

Commit bf23dee

Browse files
committed
Fix goto index_mut
1 parent 83f6dd1 commit bf23dee

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

crates/hir/src/source_analyzer.rs

+16-1
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,22 @@ impl SourceAnalyzer {
420420
let base_ty = self.ty_of_expr(db, &index_expr.base()?)?;
421421
let index_ty = self.ty_of_expr(db, &index_expr.index()?)?;
422422

423-
let (op_trait, op_fn) = self.lang_trait_fn(db, LangItem::Index, &name![index])?;
423+
let (index_trait, index_fn) = self.lang_trait_fn(db, LangItem::Index, &name![index])?;
424+
let (op_trait, op_fn) = self
425+
.infer
426+
.as_ref()
427+
.and_then(|infer| {
428+
let expr = self.expr_id(db, &index_expr.clone().into())?;
429+
let (func, _) = infer.method_resolution(expr)?;
430+
let (index_mut_trait, index_mut_fn) =
431+
self.lang_trait_fn(db, LangItem::IndexMut, &name![index_mut])?;
432+
if func == index_mut_fn {
433+
Some((index_mut_trait, index_mut_fn))
434+
} else {
435+
None
436+
}
437+
})
438+
.unwrap_or((index_trait, index_fn));
424439
// HACK: subst for all methods coincides with that for their trait because the methods
425440
// don't have any generic parameters, so we skip building another subst for the methods.
426441
let substs = hir_ty::TyBuilder::subst_for_def(db, op_trait, None)

0 commit comments

Comments
 (0)