From bf23deecb3523abf4235976d98da2e57df53f643 Mon Sep 17 00:00:00 2001 From: Shoyu Vanilla Date: Thu, 29 Feb 2024 00:52:58 +0900 Subject: [PATCH] Fix goto `index_mut` --- crates/hir/src/source_analyzer.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs index bcc9111f2ba..2be47b95149 100644 --- a/crates/hir/src/source_analyzer.rs +++ b/crates/hir/src/source_analyzer.rs @@ -420,7 +420,22 @@ impl SourceAnalyzer { let base_ty = self.ty_of_expr(db, &index_expr.base()?)?; let index_ty = self.ty_of_expr(db, &index_expr.index()?)?; - let (op_trait, op_fn) = self.lang_trait_fn(db, LangItem::Index, &name![index])?; + let (index_trait, index_fn) = self.lang_trait_fn(db, LangItem::Index, &name![index])?; + let (op_trait, op_fn) = self + .infer + .as_ref() + .and_then(|infer| { + let expr = self.expr_id(db, &index_expr.clone().into())?; + let (func, _) = infer.method_resolution(expr)?; + let (index_mut_trait, index_mut_fn) = + self.lang_trait_fn(db, LangItem::IndexMut, &name![index_mut])?; + if func == index_mut_fn { + Some((index_mut_trait, index_mut_fn)) + } else { + None + } + }) + .unwrap_or((index_trait, index_fn)); // HACK: subst for all methods coincides with that for their trait because the methods // don't have any generic parameters, so we skip building another subst for the methods. let substs = hir_ty::TyBuilder::subst_for_def(db, op_trait, None)