Skip to content

Commit 8316ffe

Browse files
authored
Merge pull request #19405 from ChayimFriedman2/no-expand
minor: Remove unnecessary expansions
2 parents 15d8741 + ced6ea5 commit 8316ffe

File tree

2 files changed

+31
-68
lines changed

2 files changed

+31
-68
lines changed

crates/hir/src/semantics.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1388,7 +1388,7 @@ impl<'db> SemanticsImpl<'db> {
13881388

13891389
let (mut source_ty, _) = analyzer.type_of_expr(self.db, expr)?;
13901390

1391-
analyzer.expr_adjustments(self.db, expr).map(|it| {
1391+
analyzer.expr_adjustments(expr).map(|it| {
13921392
it.iter()
13931393
.map(|adjust| {
13941394
let target =
@@ -1521,7 +1521,7 @@ impl<'db> SemanticsImpl<'db> {
15211521
}
15221522

15231523
pub fn resolve_field(&self, field: &ast::FieldExpr) -> Option<Either<Field, TupleField>> {
1524-
self.analyze(field.syntax())?.resolve_field(self.db, field)
1524+
self.analyze(field.syntax())?.resolve_field(field)
15251525
}
15261526

15271527
pub fn resolve_field_fallback(
@@ -1664,7 +1664,7 @@ impl<'db> SemanticsImpl<'db> {
16641664
}
16651665

16661666
fn resolve_variant(&self, record_lit: ast::RecordExpr) -> Option<VariantId> {
1667-
self.analyze(record_lit.syntax())?.resolve_variant(self.db, record_lit)
1667+
self.analyze(record_lit.syntax())?.resolve_variant(record_lit)
16681668
}
16691669

16701670
pub fn resolve_bind_pat_to_const(&self, pat: &ast::IdentPat) -> Option<ModuleDef> {

crates/hir/src/source_analyzer.rs

Lines changed: 28 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use hir_def::{
2929
type_ref::{Mutability, TypesMap, TypesSourceMap},
3030
};
3131
use hir_expand::{
32-
HirFileId, InFile, InMacroFile, MacroFileId, MacroFileIdExt,
32+
HirFileId, InFile, MacroFileId, MacroFileIdExt,
3333
mod_path::path,
3434
name::{AsName, Name},
3535
};
@@ -129,13 +129,8 @@ impl SourceAnalyzer {
129129
)
130130
}
131131

132-
fn expr_id(&self, db: &dyn HirDatabase, expr: &ast::Expr) -> Option<ExprOrPatId> {
133-
let src = match expr {
134-
ast::Expr::MacroExpr(expr) => {
135-
self.expand_expr(db, InFile::new(self.file_id, expr.macro_call()?))?.into()
136-
}
137-
_ => InFile::new(self.file_id, expr.clone()),
138-
};
132+
fn expr_id(&self, expr: ast::Expr) -> Option<ExprOrPatId> {
133+
let src = InFile::new(self.file_id, expr);
139134
let sm = self.body_source_map()?;
140135
sm.node_expr(src.as_ref())
141136
}
@@ -151,37 +146,10 @@ impl SourceAnalyzer {
151146
if let Pat::Bind { id, .. } = self.body()?.pats[pat_id.as_pat()?] { Some(id) } else { None }
152147
}
153148

154-
fn expand_expr(
155-
&self,
156-
db: &dyn HirDatabase,
157-
expr: InFile<ast::MacroCall>,
158-
) -> Option<InMacroFile<ast::Expr>> {
159-
let macro_file = self.body_source_map()?.node_macro_file(expr.as_ref())?;
160-
let expanded = db.parse_macro_expansion(macro_file).value.0.syntax_node();
161-
let res = if let Some(stmts) = ast::MacroStmts::cast(expanded.clone()) {
162-
match stmts.expr()? {
163-
ast::Expr::MacroExpr(mac) => {
164-
self.expand_expr(db, InFile::new(macro_file.into(), mac.macro_call()?))?
165-
}
166-
expr => InMacroFile::new(macro_file, expr),
167-
}
168-
} else if let Some(call) = ast::MacroCall::cast(expanded.clone()) {
169-
self.expand_expr(db, InFile::new(macro_file.into(), call))?
170-
} else {
171-
InMacroFile::new(macro_file, ast::Expr::cast(expanded)?)
172-
};
173-
174-
Some(res)
175-
}
176-
177-
pub(crate) fn expr_adjustments(
178-
&self,
179-
db: &dyn HirDatabase,
180-
expr: &ast::Expr,
181-
) -> Option<&[Adjustment]> {
149+
pub(crate) fn expr_adjustments(&self, expr: &ast::Expr) -> Option<&[Adjustment]> {
182150
// It is safe to omit destructuring assignments here because they have no adjustments (neither
183151
// expressions nor patterns).
184-
let expr_id = self.expr_id(db, expr)?.as_expr()?;
152+
let expr_id = self.expr_id(expr.clone())?.as_expr()?;
185153
let infer = self.infer.as_ref()?;
186154
infer.expr_adjustments.get(&expr_id).map(|v| &**v)
187155
}
@@ -191,7 +159,7 @@ impl SourceAnalyzer {
191159
db: &dyn HirDatabase,
192160
expr: &ast::Expr,
193161
) -> Option<(Type, Option<Type>)> {
194-
let expr_id = self.expr_id(db, expr)?;
162+
let expr_id = self.expr_id(expr.clone())?;
195163
let infer = self.infer.as_ref()?;
196164
let coerced = expr_id
197165
.as_expr()
@@ -284,7 +252,7 @@ impl SourceAnalyzer {
284252
db: &dyn HirDatabase,
285253
call: &ast::MethodCallExpr,
286254
) -> Option<Callable> {
287-
let expr_id = self.expr_id(db, &call.clone().into())?.as_expr()?;
255+
let expr_id = self.expr_id(call.clone().into())?.as_expr()?;
288256
let (func, substs) = self.infer.as_ref()?.method_resolution(expr_id)?;
289257
let ty = db.value_ty(func.into())?.substitute(Interner, &substs);
290258
let ty = Type::new_with_resolver(db, &self.resolver, ty);
@@ -298,7 +266,7 @@ impl SourceAnalyzer {
298266
db: &dyn HirDatabase,
299267
call: &ast::MethodCallExpr,
300268
) -> Option<Function> {
301-
let expr_id = self.expr_id(db, &call.clone().into())?.as_expr()?;
269+
let expr_id = self.expr_id(call.clone().into())?.as_expr()?;
302270
let (f_in_trait, substs) = self.infer.as_ref()?.method_resolution(expr_id)?;
303271

304272
Some(self.resolve_impl_method_or_trait_def(db, f_in_trait, substs).into())
@@ -309,7 +277,7 @@ impl SourceAnalyzer {
309277
db: &dyn HirDatabase,
310278
call: &ast::MethodCallExpr,
311279
) -> Option<(Either<Function, Field>, Option<GenericSubstitution>)> {
312-
let expr_id = self.expr_id(db, &call.clone().into())?.as_expr()?;
280+
let expr_id = self.expr_id(call.clone().into())?.as_expr()?;
313281
let inference_result = self.infer.as_ref()?;
314282
match inference_result.method_resolution(expr_id) {
315283
Some((f_in_trait, substs)) => {
@@ -339,11 +307,10 @@ impl SourceAnalyzer {
339307

340308
pub(crate) fn resolve_field(
341309
&self,
342-
db: &dyn HirDatabase,
343310
field: &ast::FieldExpr,
344311
) -> Option<Either<Field, TupleField>> {
345312
let &(def, ..) = self.def.as_ref()?;
346-
let expr_id = self.expr_id(db, &field.clone().into())?.as_expr()?;
313+
let expr_id = self.expr_id(field.clone().into())?.as_expr()?;
347314
self.infer.as_ref()?.field_resolution(expr_id).map(|it| {
348315
it.map_either(Into::into, |f| TupleField { owner: def, tuple: f.tuple, index: f.index })
349316
})
@@ -373,7 +340,7 @@ impl SourceAnalyzer {
373340
field: &ast::FieldExpr,
374341
) -> Option<(Either<Either<Field, TupleField>, Function>, Option<GenericSubstitution>)> {
375342
let &(def, ..) = self.def.as_ref()?;
376-
let expr_id = self.expr_id(db, &field.clone().into())?.as_expr()?;
343+
let expr_id = self.expr_id(field.clone().into())?.as_expr()?;
377344
let inference_result = self.infer.as_ref()?;
378345
match inference_result.field_resolution(expr_id) {
379346
Some(field) => match field {
@@ -444,7 +411,7 @@ impl SourceAnalyzer {
444411
db: &dyn HirDatabase,
445412
await_expr: &ast::AwaitExpr,
446413
) -> Option<FunctionId> {
447-
let mut ty = self.ty_of_expr(db, &await_expr.expr()?)?.clone();
414+
let mut ty = self.ty_of_expr(await_expr.expr()?)?.clone();
448415

449416
let into_future_trait = self
450417
.resolver
@@ -494,7 +461,7 @@ impl SourceAnalyzer {
494461
self.infer
495462
.as_ref()
496463
.and_then(|infer| {
497-
let expr = self.expr_id(db, &prefix_expr.clone().into())?.as_expr()?;
464+
let expr = self.expr_id(prefix_expr.clone().into())?.as_expr()?;
498465
let (func, _) = infer.method_resolution(expr)?;
499466
let (deref_mut_trait, deref_mut) = self.lang_trait_fn(
500467
db,
@@ -513,7 +480,7 @@ impl SourceAnalyzer {
513480
}
514481
};
515482

516-
let ty = self.ty_of_expr(db, &prefix_expr.expr()?)?;
483+
let ty = self.ty_of_expr(prefix_expr.expr()?)?;
517484

518485
// HACK: subst for all methods coincides with that for their trait because the methods
519486
// don't have any generic parameters, so we skip building another subst for the methods.
@@ -527,16 +494,16 @@ impl SourceAnalyzer {
527494
db: &dyn HirDatabase,
528495
index_expr: &ast::IndexExpr,
529496
) -> Option<FunctionId> {
530-
let base_ty = self.ty_of_expr(db, &index_expr.base()?)?;
531-
let index_ty = self.ty_of_expr(db, &index_expr.index()?)?;
497+
let base_ty = self.ty_of_expr(index_expr.base()?)?;
498+
let index_ty = self.ty_of_expr(index_expr.index()?)?;
532499

533500
let (index_trait, index_fn) =
534501
self.lang_trait_fn(db, LangItem::Index, &Name::new_symbol_root(sym::index.clone()))?;
535502
let (op_trait, op_fn) = self
536503
.infer
537504
.as_ref()
538505
.and_then(|infer| {
539-
let expr = self.expr_id(db, &index_expr.clone().into())?.as_expr()?;
506+
let expr = self.expr_id(index_expr.clone().into())?.as_expr()?;
540507
let (func, _) = infer.method_resolution(expr)?;
541508
let (index_mut_trait, index_mut_fn) = self.lang_trait_fn(
542509
db,
@@ -561,8 +528,8 @@ impl SourceAnalyzer {
561528
binop_expr: &ast::BinExpr,
562529
) -> Option<FunctionId> {
563530
let op = binop_expr.op_kind()?;
564-
let lhs = self.ty_of_expr(db, &binop_expr.lhs()?)?;
565-
let rhs = self.ty_of_expr(db, &binop_expr.rhs()?)?;
531+
let lhs = self.ty_of_expr(binop_expr.lhs()?)?;
532+
let rhs = self.ty_of_expr(binop_expr.rhs()?)?;
566533

567534
let (op_trait, op_fn) = lang_items_for_bin_op(op)
568535
.and_then(|(name, lang_item)| self.lang_trait_fn(db, lang_item, &name))?;
@@ -581,7 +548,7 @@ impl SourceAnalyzer {
581548
db: &dyn HirDatabase,
582549
try_expr: &ast::TryExpr,
583550
) -> Option<FunctionId> {
584-
let ty = self.ty_of_expr(db, &try_expr.expr()?)?;
551+
let ty = self.ty_of_expr(try_expr.expr()?)?;
585552

586553
let op_fn = db.lang_item(self.resolver.krate(), LangItem::TryTraitBranch)?.as_function()?;
587554
let op_trait = match op_fn.lookup(db.upcast()).container {
@@ -721,7 +688,7 @@ impl SourceAnalyzer {
721688
let resolved = (|| {
722689
let infer = self.infer.as_deref()?;
723690
if let Some(path_expr) = parent().and_then(ast::PathExpr::cast) {
724-
let expr_id = self.expr_id(db, &path_expr.into())?;
691+
let expr_id = self.expr_id(path_expr.into())?;
725692
if let Some((assoc, subs)) = infer.assoc_resolutions_for_expr_or_pat(expr_id) {
726693
let (assoc, subst) = match assoc {
727694
AssocItemId::FunctionId(f_in_trait) => {
@@ -819,7 +786,7 @@ impl SourceAnalyzer {
819786
return Some((PathResolution::Def(ModuleDef::Variant(variant.into())), None));
820787
}
821788
} else if let Some(rec_lit) = parent().and_then(ast::RecordExpr::cast) {
822-
let expr_id = self.expr_id(db, &rec_lit.into())?;
789+
let expr_id = self.expr_id(rec_lit.into())?;
823790
if let Some(VariantId::EnumVariantId(variant)) =
824791
infer.variant_resolution_for_expr_or_pat(expr_id)
825792
{
@@ -1010,7 +977,7 @@ impl SourceAnalyzer {
1010977
let subst = (|| {
1011978
let parent = parent()?;
1012979
let ty = if let Some(expr) = ast::Expr::cast(parent.clone()) {
1013-
let expr_id = self.expr_id(db, &expr)?;
980+
let expr_id = self.expr_id(expr)?;
1014981
self.infer.as_ref()?.type_of_expr_or_pat(expr_id)?
1015982
} else if let Some(pat) = ast::Pat::cast(parent) {
1016983
let pat_id = self.pat_id(&pat)?;
@@ -1064,7 +1031,7 @@ impl SourceAnalyzer {
10641031
let body = self.body()?;
10651032
let infer = self.infer.as_ref()?;
10661033

1067-
let expr_id = self.expr_id(db, &literal.clone().into())?;
1034+
let expr_id = self.expr_id(literal.clone().into())?;
10681035
let substs = infer[expr_id].as_adt()?.1;
10691036

10701037
let (variant, missing_fields, _exhaustive) = match expr_id {
@@ -1130,13 +1097,9 @@ impl SourceAnalyzer {
11301097
Some(macro_call_id.as_macro_file()).filter(|it| it.expansion_level(db.upcast()) < 64)
11311098
}
11321099

1133-
pub(crate) fn resolve_variant(
1134-
&self,
1135-
db: &dyn HirDatabase,
1136-
record_lit: ast::RecordExpr,
1137-
) -> Option<VariantId> {
1100+
pub(crate) fn resolve_variant(&self, record_lit: ast::RecordExpr) -> Option<VariantId> {
11381101
let infer = self.infer.as_ref()?;
1139-
let expr_id = self.expr_id(db, &record_lit.into())?;
1102+
let expr_id = self.expr_id(record_lit.into())?;
11401103
infer.variant_resolution_for_expr_or_pat(expr_id)
11411104
}
11421105

@@ -1284,8 +1247,8 @@ impl SourceAnalyzer {
12841247
Some((trait_id, fn_id))
12851248
}
12861249

1287-
fn ty_of_expr(&self, db: &dyn HirDatabase, expr: &ast::Expr) -> Option<&Ty> {
1288-
self.infer.as_ref()?.type_of_expr_or_pat(self.expr_id(db, expr)?)
1250+
fn ty_of_expr(&self, expr: ast::Expr) -> Option<&Ty> {
1251+
self.infer.as_ref()?.type_of_expr_or_pat(self.expr_id(expr.clone())?)
12891252
}
12901253
}
12911254

0 commit comments

Comments
 (0)