Skip to content

Commit e402c8c

Browse files
committed
make SourceAnalyzer::pat_id return ExprOrPatId
Not all patterns are mapped to Pats. As such, it was necessary to change the ret type Option<PatId> to Option<ExprOrPatId>
1 parent 050c63a commit e402c8c

File tree

2 files changed

+18
-19
lines changed

2 files changed

+18
-19
lines changed

src/tools/rust-analyzer/crates/hir-def/src/expr_store/tests.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
mod block;
22

3-
use base_db::Upcast;
3+
use crate::{test_db::TestDB, ModuleDefId};
44
use expect_test::{expect, Expect};
55
use la_arena::RawIdx;
66
use test_fixture::WithFixture;
7-
use tracing::Instrument;
8-
9-
use crate::{db::InternDatabase, test_db::TestDB, ModuleDefId};
107

118
use super::*;
129

src/tools/rust-analyzer/crates/hir/src/source_analyzer.rs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use hir_def::{
1818
scope::{ExprScopes, ScopeId},
1919
Body, BodySourceMap, HygieneId,
2020
},
21-
hir::{BindingId, Expr, ExprId, ExprOrPatId, Pat, PatId},
21+
hir::{BindingId, Expr, ExprId, ExprOrPatId, Pat},
2222
lang_item::LangItem,
2323
lower::LowerCtx,
2424
nameres::MacroSubNs,
@@ -139,15 +139,15 @@ impl SourceAnalyzer {
139139
sm.node_expr(src.as_ref())
140140
}
141141

142-
fn pat_id(&self, pat: &ast::Pat) -> Option<PatId> {
142+
fn pat_id(&self, pat: &ast::Pat) -> Option<ExprOrPatId> {
143143
// FIXME: macros, see `expr_id`
144144
let src = InFile { file_id: self.file_id, value: pat };
145-
self.body_source_map()?.node_pat(src).and_then(ExprOrPatId::as_pat)
145+
self.body_source_map()?.node_pat(src)
146146
}
147147

148148
fn binding_id_of_pat(&self, pat: &ast::IdentPat) -> Option<BindingId> {
149149
let pat_id = self.pat_id(&pat.clone().into())?;
150-
if let Pat::Bind { id, .. } = self.body()?.pats[pat_id] {
150+
if let Pat::Bind { id, .. } = self.body()?.pats[pat_id.as_pat()?] {
151151
Some(id)
152152
} else {
153153
None
@@ -212,8 +212,10 @@ impl SourceAnalyzer {
212212
) -> Option<(Type, Option<Type>)> {
213213
let pat_id = self.pat_id(pat)?;
214214
let infer = self.infer.as_ref()?;
215-
let coerced =
216-
infer.pat_adjustments.get(&pat_id).and_then(|adjusts| adjusts.last().cloned());
215+
let coerced = infer
216+
.pat_adjustments
217+
.get(&pat_id.as_pat()?)
218+
.and_then(|adjusts| adjusts.last().cloned());
217219
let ty = infer[pat_id].clone();
218220
let mk_ty = |ty| Type::new_with_resolver(db, &self.resolver, ty);
219221
Some((mk_ty(ty), coerced.map(mk_ty)))
@@ -248,7 +250,7 @@ impl SourceAnalyzer {
248250
) -> Option<BindingMode> {
249251
let id = self.pat_id(&pat.clone().into())?;
250252
let infer = self.infer.as_ref()?;
251-
infer.binding_modes.get(id).map(|bm| match bm {
253+
infer.binding_modes.get(id.as_pat()?).map(|bm| match bm {
252254
hir_ty::BindingMode::Move => BindingMode::Move,
253255
hir_ty::BindingMode::Ref(hir_ty::Mutability::Mut) => BindingMode::Ref(Mutability::Mut),
254256
hir_ty::BindingMode::Ref(hir_ty::Mutability::Not) => {
@@ -266,7 +268,7 @@ impl SourceAnalyzer {
266268
Some(
267269
infer
268270
.pat_adjustments
269-
.get(&pat_id)?
271+
.get(&pat_id.as_pat()?)?
270272
.iter()
271273
.map(|ty| Type::new_with_resolver(db, &self.resolver, ty.clone()))
272274
.collect(),
@@ -649,10 +651,10 @@ impl SourceAnalyzer {
649651
let field_name = field.field_name()?.as_name();
650652
let record_pat = ast::RecordPat::cast(field.syntax().parent().and_then(|p| p.parent())?)?;
651653
let pat_id = self.pat_id(&record_pat.into())?;
652-
let variant = self.infer.as_ref()?.variant_resolution_for_pat(pat_id)?;
654+
let variant = self.infer.as_ref()?.variant_resolution_for_pat(pat_id.as_pat()?)?;
653655
let variant_data = variant.variant_data(db.upcast());
654656
let field = FieldId { parent: variant, local_id: variant_data.field(&field_name)? };
655-
let (adt, subst) = self.infer.as_ref()?.type_of_pat.get(pat_id)?.as_adt()?;
657+
let (adt, subst) = self.infer.as_ref()?.type_of_pat.get(pat_id.as_pat()?)?.as_adt()?;
656658
let field_ty =
657659
db.field_types(variant).get(field.local_id)?.clone().substitute(Interner, subst);
658660
Some((
@@ -684,7 +686,7 @@ impl SourceAnalyzer {
684686
) -> Option<ModuleDef> {
685687
let pat_id = self.pat_id(&pat.clone().into())?;
686688
let body = self.body()?;
687-
let path = match &body[pat_id] {
689+
let path = match &body[pat_id.as_pat()?] {
688690
Pat::Path(path) => path,
689691
_ => return None,
690692
};
@@ -783,7 +785,7 @@ impl SourceAnalyzer {
783785
prefer_value_ns = true;
784786
} else if let Some(path_pat) = parent().and_then(ast::PathPat::cast) {
785787
let pat_id = self.pat_id(&path_pat.into())?;
786-
if let Some((assoc, subs)) = infer.assoc_resolutions_for_pat(pat_id) {
788+
if let Some((assoc, subs)) = infer.assoc_resolutions_for_pat(pat_id.as_pat()?) {
787789
let (assoc, subst) = match assoc {
788790
AssocItemId::ConstId(const_id) => {
789791
let (konst, subst) =
@@ -807,7 +809,7 @@ impl SourceAnalyzer {
807809
return Some((PathResolution::Def(AssocItem::from(assoc).into()), Some(subst)));
808810
}
809811
if let Some(VariantId::EnumVariantId(variant)) =
810-
infer.variant_resolution_for_pat(pat_id)
812+
infer.variant_resolution_for_pat(pat_id.as_pat()?)
811813
{
812814
return Some((PathResolution::Def(ModuleDef::Variant(variant.into())), None));
813815
}
@@ -824,7 +826,7 @@ impl SourceAnalyzer {
824826
|| parent().and_then(ast::TupleStructPat::cast).map(ast::Pat::from);
825827
if let Some(pat) = record_pat.or_else(tuple_struct_pat) {
826828
let pat_id = self.pat_id(&pat)?;
827-
let variant_res_for_pat = infer.variant_resolution_for_pat(pat_id);
829+
let variant_res_for_pat = infer.variant_resolution_for_pat(pat_id.as_pat()?);
828830
if let Some(VariantId::EnumVariantId(variant)) = variant_res_for_pat {
829831
return Some((
830832
PathResolution::Def(ModuleDef::Variant(variant.into())),
@@ -1043,7 +1045,7 @@ impl SourceAnalyzer {
10431045
let body = self.body()?;
10441046
let infer = self.infer.as_ref()?;
10451047

1046-
let pat_id = self.pat_id(&pattern.clone().into())?;
1048+
let pat_id = self.pat_id(&pattern.clone().into())?.as_pat()?;
10471049
let substs = infer.type_of_pat[pat_id].as_adt()?.1;
10481050

10491051
let (variant, missing_fields, _exhaustive) =

0 commit comments

Comments
 (0)