Skip to content

Commit 8aa50e0

Browse files
committed
Simplify
1 parent 352d3c6 commit 8aa50e0

File tree

1 file changed

+32
-28
lines changed

1 file changed

+32
-28
lines changed

crates/hir/src/source_analyzer.rs

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,19 @@ use hir_def::{
2525
Lookup, ModuleDefId, VariantId,
2626
};
2727
use hir_expand::{
28-
builtin_fn_macro::BuiltinFnLikeExpander, hygiene::Hygiene, name, name::AsName, HirFileId,
29-
InFile,
28+
builtin_fn_macro::BuiltinFnLikeExpander,
29+
hygiene::Hygiene,
30+
name,
31+
name::{AsName, Name},
32+
HirFileId, InFile,
3033
};
3134
use hir_ty::{
3235
diagnostics::{
3336
record_literal_missing_fields, record_pattern_missing_fields, unsafe_expressions,
3437
UnsafeExpr,
3538
},
3639
method_resolution::{self, lang_names_for_bin_op},
37-
Adjust, Adjustment, AutoBorrow, InferenceResult, Interner, Substitution, TyExt, TyKind,
40+
Adjust, Adjustment, AutoBorrow, InferenceResult, Interner, Substitution, Ty, TyExt, TyKind,
3841
TyLoweringContext,
3942
};
4043
use itertools::Itertools;
@@ -266,8 +269,7 @@ impl SourceAnalyzer {
266269
db: &dyn HirDatabase,
267270
await_expr: &ast::AwaitExpr,
268271
) -> Option<FunctionId> {
269-
let expr_id = self.expr_id(db, &await_expr.expr()?.into())?;
270-
let ty = self.infer.as_ref()?.type_of_expr.get(expr_id)?;
272+
let ty = self.ty_of_expr(db, &await_expr.expr()?.into())?;
271273

272274
let op_fn = db
273275
.lang_item(self.resolver.krate(), hir_expand::name![poll].to_smol_str())?
@@ -287,12 +289,9 @@ impl SourceAnalyzer {
287289
ast::UnaryOp::Not => name![not],
288290
ast::UnaryOp::Neg => name![neg],
289291
};
290-
let expr_id = self.expr_id(db, &prefix_expr.expr()?.into())?;
291-
let ty = self.infer.as_ref()?.type_of_expr.get(expr_id)?;
292+
let ty = self.ty_of_expr(db, &prefix_expr.expr()?.into())?;
292293

293-
let trait_ =
294-
db.lang_item(self.resolver.krate(), lang_item_name.to_smol_str())?.as_trait()?;
295-
let op_fn = db.trait_data(trait_).method_by_name(&lang_item_name)?;
294+
let op_fn = self.lang_trait_fn(db, &lang_item_name, &lang_item_name)?;
296295
let substs = hir_ty::TyBuilder::subst_for_def(db, op_fn).push(ty.clone()).build();
297296

298297
Some(self.resolve_impl_method_or_trait_def(db, op_fn, &substs))
@@ -303,16 +302,12 @@ impl SourceAnalyzer {
303302
db: &dyn HirDatabase,
304303
index_expr: &ast::IndexExpr,
305304
) -> Option<FunctionId> {
306-
let base_expr_id = self.expr_id(db, &index_expr.base()?.into())?;
307-
let index_expr_id = self.expr_id(db, &index_expr.index()?.into())?;
308-
let base_ty = self.infer.as_ref()?.type_of_expr.get(base_expr_id)?;
309-
let index_ty = self.infer.as_ref()?.type_of_expr.get(index_expr_id)?;
305+
let base_ty = self.ty_of_expr(db, &index_expr.base()?.into())?;
306+
let index_ty = self.ty_of_expr(db, &index_expr.index()?.into())?;
310307

311308
let lang_item_name = name![index];
312309

313-
let trait_ =
314-
db.lang_item(self.resolver.krate(), lang_item_name.to_smol_str())?.as_trait()?;
315-
let op_fn = db.trait_data(trait_).method_by_name(&lang_item_name)?;
310+
let op_fn = self.lang_trait_fn(db, &lang_item_name, &lang_item_name)?;
316311
let substs = hir_ty::TyBuilder::subst_for_def(db, op_fn)
317312
.push(base_ty.clone())
318313
.push(index_ty.clone())
@@ -326,15 +321,11 @@ impl SourceAnalyzer {
326321
binop_expr: &ast::BinExpr,
327322
) -> Option<FunctionId> {
328323
let op = binop_expr.op_kind()?;
329-
let lhs_expr_id = self.expr_id(db, &binop_expr.lhs()?.into())?;
330-
let rhs_expr_id = self.expr_id(db, &binop_expr.rhs()?.into())?;
331-
let lhs = self.infer.as_ref()?.type_of_expr.get(lhs_expr_id)?;
332-
let rhs = self.infer.as_ref()?.type_of_expr.get(rhs_expr_id)?;
333-
334-
let op_fn = lang_names_for_bin_op(op).and_then(|(name, lang_item)| {
335-
db.trait_data(db.lang_item(self.resolver.krate(), lang_item.to_smol_str())?.as_trait()?)
336-
.method_by_name(&name)
337-
})?;
324+
let lhs = self.ty_of_expr(db, &binop_expr.lhs()?.into())?;
325+
let rhs = self.ty_of_expr(db, &binop_expr.rhs()?.into())?;
326+
327+
let op_fn = lang_names_for_bin_op(op)
328+
.and_then(|(name, lang_item)| self.lang_trait_fn(db, &lang_item, &name))?;
338329
let substs =
339330
hir_ty::TyBuilder::subst_for_def(db, op_fn).push(lhs.clone()).push(rhs.clone()).build();
340331

@@ -346,8 +337,7 @@ impl SourceAnalyzer {
346337
db: &dyn HirDatabase,
347338
try_expr: &ast::TryExpr,
348339
) -> Option<FunctionId> {
349-
let expr_id = self.expr_id(db, &try_expr.expr()?.into())?;
350-
let ty = self.infer.as_ref()?.type_of_expr.get(expr_id)?;
340+
let ty = self.ty_of_expr(db, &try_expr.expr()?.into())?;
351341

352342
let op_fn =
353343
db.lang_item(self.resolver.krate(), name![branch].to_smol_str())?.as_function()?;
@@ -772,6 +762,20 @@ impl SourceAnalyzer {
772762
) -> FunctionId {
773763
self.resolve_impl_method(db, func, substs).unwrap_or(func)
774764
}
765+
766+
fn lang_trait_fn(
767+
&self,
768+
db: &dyn HirDatabase,
769+
lang_trait: &Name,
770+
method_name: &Name,
771+
) -> Option<FunctionId> {
772+
db.trait_data(db.lang_item(self.resolver.krate(), lang_trait.to_smol_str())?.as_trait()?)
773+
.method_by_name(method_name)
774+
}
775+
776+
fn ty_of_expr(&self, db: &dyn HirDatabase, expr: &ast::Expr) -> Option<&Ty> {
777+
self.infer.as_ref()?.type_of_expr.get(self.expr_id(db, &expr)?)
778+
}
775779
}
776780

777781
fn scope_for(

0 commit comments

Comments
 (0)