Skip to content

Commit d569869

Browse files
committed
Decouple more
1 parent 35f57f3 commit d569869

File tree

5 files changed

+41
-40
lines changed

5 files changed

+41
-40
lines changed

crates/ra_hir/src/code_model.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ impl Function {
647647

648648
pub fn diagnostics(self, db: &impl HirDatabase, sink: &mut DiagnosticSink) {
649649
let infer = self.infer(db);
650-
infer.add_diagnostics(db, self, sink);
650+
infer.add_diagnostics(db, self.id, sink);
651651
let mut validator = ExprValidator::new(self, infer, sink);
652652
validator.validate_body(db);
653653
}

crates/ra_hir/src/source_binder.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,17 +214,17 @@ impl SourceAnalyzer {
214214

215215
pub fn resolve_method_call(&self, call: &ast::MethodCallExpr) -> Option<Function> {
216216
let expr_id = self.expr_id(&call.clone().into())?;
217-
self.infer.as_ref()?.method_resolution(expr_id)
217+
self.infer.as_ref()?.method_resolution(expr_id).map(Function::from)
218218
}
219219

220220
pub fn resolve_field(&self, field: &ast::FieldExpr) -> Option<crate::StructField> {
221221
let expr_id = self.expr_id(&field.clone().into())?;
222-
self.infer.as_ref()?.field_resolution(expr_id)
222+
self.infer.as_ref()?.field_resolution(expr_id).map(|it| it.into())
223223
}
224224

225225
pub fn resolve_record_field(&self, field: &ast::RecordField) -> Option<crate::StructField> {
226226
let expr_id = self.expr_id(&field.expr()?)?;
227-
self.infer.as_ref()?.record_field_resolution(expr_id)
227+
self.infer.as_ref()?.record_field_resolution(expr_id).map(|it| it.into())
228228
}
229229

230230
pub fn resolve_record_literal(&self, record_lit: &ast::RecordLit) -> Option<crate::VariantDef> {

crates/ra_hir/src/ty/infer.rs

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,28 @@ use ena::unify::{InPlaceUnificationTable, NoError, UnifyKey, UnifyValue};
2222
use rustc_hash::FxHashMap;
2323

2424
use hir_def::{
25+
body::Body,
2526
data::{ConstData, FunctionData},
26-
path::known,
27+
expr::{BindingAnnotation, ExprId, PatId},
28+
path::{known, Path},
2729
resolver::{HasResolver, Resolver, TypeNs},
2830
type_ref::{Mutability, TypeRef},
29-
AdtId, AssocItemId, DefWithBodyId,
31+
AdtId, AssocItemId, DefWithBodyId, FunctionId, StructFieldId, TypeAliasId,
3032
};
3133
use hir_expand::{diagnostics::DiagnosticSink, name};
3234
use ra_arena::map::ArenaMap;
3335
use ra_prof::profile;
3436
use test_utils::tested_by;
3537

3638
use super::{
39+
primitive::{FloatTy, IntTy},
3740
traits::{Guidance, Obligation, ProjectionPredicate, Solution},
3841
ApplicationTy, InEnvironment, ProjectionTy, Substs, TraitEnvironment, TraitRef, Ty, TypeCtor,
3942
TypeWalk, Uncertain,
4043
};
4144
use crate::{
42-
code_model::TypeAlias,
43-
db::HirDatabase,
44-
expr::{BindingAnnotation, Body, ExprId, PatId},
45-
ty::infer::diagnostics::InferenceDiagnostic,
46-
AssocItem, DefWithBody, FloatTy, Function, IntTy, Path, StructField, VariantDef,
45+
db::HirDatabase, ty::infer::diagnostics::InferenceDiagnostic, AssocItem, DefWithBody,
46+
VariantDef,
4747
};
4848

4949
macro_rules! ty_app {
@@ -121,11 +121,11 @@ pub struct TypeMismatch {
121121
#[derive(Clone, PartialEq, Eq, Debug, Default)]
122122
pub struct InferenceResult {
123123
/// For each method call expr, records the function it resolves to.
124-
method_resolutions: FxHashMap<ExprId, Function>,
124+
method_resolutions: FxHashMap<ExprId, FunctionId>,
125125
/// For each field access expr, records the field it resolves to.
126-
field_resolutions: FxHashMap<ExprId, StructField>,
126+
field_resolutions: FxHashMap<ExprId, StructFieldId>,
127127
/// For each field in record literal, records the field it resolves to.
128-
record_field_resolutions: FxHashMap<ExprId, StructField>,
128+
record_field_resolutions: FxHashMap<ExprId, StructFieldId>,
129129
/// For each struct literal, records the variant it resolves to.
130130
variant_resolutions: FxHashMap<ExprOrPatId, VariantDef>,
131131
/// For each associated item record what it resolves to
@@ -137,13 +137,13 @@ pub struct InferenceResult {
137137
}
138138

139139
impl InferenceResult {
140-
pub fn method_resolution(&self, expr: ExprId) -> Option<Function> {
140+
pub fn method_resolution(&self, expr: ExprId) -> Option<FunctionId> {
141141
self.method_resolutions.get(&expr).copied()
142142
}
143-
pub fn field_resolution(&self, expr: ExprId) -> Option<StructField> {
143+
pub fn field_resolution(&self, expr: ExprId) -> Option<StructFieldId> {
144144
self.field_resolutions.get(&expr).copied()
145145
}
146-
pub fn record_field_resolution(&self, expr: ExprId) -> Option<StructField> {
146+
pub fn record_field_resolution(&self, expr: ExprId) -> Option<StructFieldId> {
147147
self.record_field_resolutions.get(&expr).copied()
148148
}
149149
pub fn variant_resolution_for_expr(&self, id: ExprId) -> Option<VariantDef> {
@@ -164,7 +164,7 @@ impl InferenceResult {
164164
pub(crate) fn add_diagnostics(
165165
&self,
166166
db: &impl HirDatabase,
167-
owner: Function,
167+
owner: FunctionId,
168168
sink: &mut DiagnosticSink,
169169
) {
170170
self.diagnostics.iter().for_each(|it| it.add_to(db, owner, sink))
@@ -243,11 +243,11 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
243243
self.result.type_of_expr.insert(expr, ty);
244244
}
245245

246-
fn write_method_resolution(&mut self, expr: ExprId, func: Function) {
246+
fn write_method_resolution(&mut self, expr: ExprId, func: FunctionId) {
247247
self.result.method_resolutions.insert(expr, func);
248248
}
249249

250-
fn write_field_resolution(&mut self, expr: ExprId, field: StructField) {
250+
fn write_field_resolution(&mut self, expr: ExprId, field: StructFieldId) {
251251
self.result.field_resolutions.insert(expr, field);
252252
}
253253

@@ -557,22 +557,22 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
557557
self.infer_expr(self.body.body_expr, &Expectation::has_type(self.return_ty.clone()));
558558
}
559559

560-
fn resolve_into_iter_item(&self) -> Option<TypeAlias> {
560+
fn resolve_into_iter_item(&self) -> Option<TypeAliasId> {
561561
let path = known::std_iter_into_iterator();
562562
let trait_ = self.resolver.resolve_known_trait(self.db, &path)?;
563-
self.db.trait_data(trait_).associated_type_by_name(&name::ITEM_TYPE).map(TypeAlias::from)
563+
self.db.trait_data(trait_).associated_type_by_name(&name::ITEM_TYPE)
564564
}
565565

566-
fn resolve_ops_try_ok(&self) -> Option<TypeAlias> {
566+
fn resolve_ops_try_ok(&self) -> Option<TypeAliasId> {
567567
let path = known::std_ops_try();
568568
let trait_ = self.resolver.resolve_known_trait(self.db, &path)?;
569-
self.db.trait_data(trait_).associated_type_by_name(&name::OK_TYPE).map(TypeAlias::from)
569+
self.db.trait_data(trait_).associated_type_by_name(&name::OK_TYPE)
570570
}
571571

572-
fn resolve_future_future_output(&self) -> Option<TypeAlias> {
572+
fn resolve_future_future_output(&self) -> Option<TypeAliasId> {
573573
let path = known::std_future_future();
574574
let trait_ = self.resolver.resolve_known_trait(self.db, &path)?;
575-
self.db.trait_data(trait_).associated_type_by_name(&name::OUTPUT_TYPE).map(TypeAlias::from)
575+
self.db.trait_data(trait_).associated_type_by_name(&name::OUTPUT_TYPE)
576576
}
577577

578578
fn resolve_boxed_box(&self) -> Option<AdtId> {
@@ -696,9 +696,10 @@ impl Expectation {
696696
}
697697

698698
mod diagnostics {
699+
use hir_def::{expr::ExprId, FunctionId, HasSource, Lookup};
699700
use hir_expand::diagnostics::DiagnosticSink;
700701

701-
use crate::{db::HirDatabase, diagnostics::NoSuchField, expr::ExprId, Function, HasSource};
702+
use crate::{db::HirDatabase, diagnostics::NoSuchField};
702703

703704
#[derive(Debug, PartialEq, Eq, Clone)]
704705
pub(super) enum InferenceDiagnostic {
@@ -709,13 +710,14 @@ mod diagnostics {
709710
pub(super) fn add_to(
710711
&self,
711712
db: &impl HirDatabase,
712-
owner: Function,
713+
owner: FunctionId,
713714
sink: &mut DiagnosticSink,
714715
) {
715716
match self {
716717
InferenceDiagnostic::NoSuchField { expr, field } => {
717-
let file = owner.source(db).file_id;
718-
let field = owner.body_source_map(db).field_syntax(*expr, *field);
718+
let file = owner.lookup(db).source(db).file_id;
719+
let (_, source_map) = db.body_with_source_map(owner.into());
720+
let field = source_map.field_syntax(*expr, *field);
719721
sink.push(NoSuchField { file, field })
720722
}
721723
}

crates/ra_hir/src/ty/infer/expr.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
100100
let projection = ProjectionPredicate {
101101
ty: pat_ty.clone(),
102102
projection_ty: ProjectionTy {
103-
associated_ty: into_iter_item_alias.id,
103+
associated_ty: into_iter_item_alias,
104104
parameters: Substs::single(iterable_ty),
105105
},
106106
};
@@ -230,7 +230,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
230230
}
231231
});
232232
if let Some(field_def) = field_def {
233-
self.result.record_field_resolutions.insert(field.expr, field_def);
233+
self.result.record_field_resolutions.insert(field.expr, field_def.into());
234234
}
235235
let field_ty = field_def
236236
.map_or(Ty::Unknown, |it| field_types[it.id].clone())
@@ -262,7 +262,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
262262
self.db.struct_data(s).variant_data.field(name).map(|local_id| {
263263
let field = StructFieldId { parent: s.into(), local_id }.into();
264264
self.write_field_resolution(tgt_expr, field);
265-
self.db.field_types(s.into())[field.id]
265+
self.db.field_types(s.into())[field.local_id]
266266
.clone()
267267
.subst(&a_ty.parameters)
268268
})
@@ -285,7 +285,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
285285
let projection = ProjectionPredicate {
286286
ty: ty.clone(),
287287
projection_ty: ProjectionTy {
288-
associated_ty: future_future_output_alias.id,
288+
associated_ty: future_future_output_alias,
289289
parameters: Substs::single(inner_ty),
290290
},
291291
};
@@ -304,7 +304,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
304304
let projection = ProjectionPredicate {
305305
ty: ty.clone(),
306306
projection_ty: ProjectionTy {
307-
associated_ty: ops_try_ok_alias.id,
307+
associated_ty: ops_try_ok_alias,
308308
parameters: Substs::single(inner_ty),
309309
},
310310
};
@@ -557,7 +557,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
557557
Some((ty, func)) => {
558558
let ty = canonicalized_receiver.decanonicalize_ty(ty);
559559
self.write_method_resolution(tgt_expr, func);
560-
(ty, self.db.value_ty(func.id.into()), Some(self.db.generic_params(func.id.into())))
560+
(ty, self.db.value_ty(func.into()), Some(self.db.generic_params(func.into())))
561561
}
562562
None => (receiver_ty, Ty::Unknown, None),
563563
};

crates/ra_hir/src/ty/method_resolution.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use std::sync::Arc;
77
use arrayvec::ArrayVec;
88
use hir_def::{
99
lang_item::LangItemTarget, resolver::HasResolver, resolver::Resolver, type_ref::Mutability,
10-
AssocItemId, AstItemDef, HasModule, ImplId, TraitId,
10+
AssocItemId, AstItemDef, FunctionId, HasModule, ImplId, TraitId,
1111
};
1212
use hir_expand::name::Name;
1313
use ra_db::CrateId;
@@ -18,7 +18,6 @@ use crate::{
1818
db::HirDatabase,
1919
ty::primitive::{FloatBitness, Uncertain},
2020
ty::{utils::all_super_traits, Ty, TypeCtor},
21-
Function,
2221
};
2322

2423
use super::{autoderef, Canonical, InEnvironment, TraitEnvironment, TraitRef};
@@ -154,10 +153,10 @@ pub(crate) fn lookup_method(
154153
db: &impl HirDatabase,
155154
name: &Name,
156155
resolver: &Resolver,
157-
) -> Option<(Ty, Function)> {
156+
) -> Option<(Ty, FunctionId)> {
158157
iterate_method_candidates(ty, db, resolver, Some(name), LookupMode::MethodCall, |ty, f| match f
159158
{
160-
AssocItemId::FunctionId(f) => Some((ty.clone(), f.into())),
159+
AssocItemId::FunctionId(f) => Some((ty.clone(), f)),
161160
_ => None,
162161
})
163162
}

0 commit comments

Comments
 (0)