Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit f8ed4d7

Browse files
committed
Use lang item resolution instead of known paths
1 parent 1535881 commit f8ed4d7

File tree

6 files changed

+66
-180
lines changed

6 files changed

+66
-180
lines changed

crates/hir-def/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,7 @@ pub trait Lookup {
634634
pub trait HasModule {
635635
fn module(&self, db: &dyn db::DefDatabase) -> ModuleId;
636636
}
637+
637638
impl HasModule for ItemContainerId {
638639
fn module(&self, db: &dyn db::DefDatabase) -> ModuleId {
639640
match *self {

crates/hir-ty/src/diagnostics/expr.rs

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
use std::fmt;
66
use std::sync::Arc;
77

8-
use hir_def::{path::path, resolver::HasResolver, AdtId, AssocItemId, DefWithBodyId, HasModule};
8+
use hir_def::lang_item::LangItem;
9+
use hir_def::{resolver::HasResolver, AdtId, AssocItemId, DefWithBodyId, HasModule};
10+
use hir_def::{ItemContainerId, Lookup};
911
use hir_expand::name;
1012
use itertools::Either;
1113
use itertools::Itertools;
@@ -245,26 +247,25 @@ struct FilterMapNextChecker {
245247
impl FilterMapNextChecker {
246248
fn new(resolver: &hir_def::resolver::Resolver, db: &dyn HirDatabase) -> Self {
247249
// Find and store the FunctionIds for Iterator::filter_map and Iterator::next
248-
let iterator_path = path![core::iter::Iterator];
249-
let mut filter_map_function_id = None;
250-
let mut next_function_id = None;
251-
252-
if let Some(iterator_trait_id) = resolver.resolve_known_trait(db.upcast(), &iterator_path) {
253-
let iterator_trait_items = &db.trait_data(iterator_trait_id).items;
254-
for item in iterator_trait_items.iter() {
255-
if let (name, AssocItemId::FunctionId(id)) = item {
256-
if *name == name![filter_map] {
257-
filter_map_function_id = Some(*id);
250+
let (next_function_id, filter_map_function_id) = match db
251+
.lang_item(resolver.krate(), LangItem::IteratorNext)
252+
.and_then(|it| it.as_function())
253+
{
254+
Some(next_function_id) => (
255+
Some(next_function_id),
256+
match next_function_id.lookup(db.upcast()).container {
257+
ItemContainerId::TraitId(iterator_trait_id) => {
258+
let iterator_trait_items = &db.trait_data(iterator_trait_id).items;
259+
iterator_trait_items.iter().find_map(|(name, it)| match it {
260+
&AssocItemId::FunctionId(id) if *name == name![filter_map] => Some(id),
261+
_ => None,
262+
})
258263
}
259-
if *name == name![next] {
260-
next_function_id = Some(*id);
261-
}
262-
}
263-
if filter_map_function_id.is_some() && next_function_id.is_some() {
264-
break;
265-
}
266-
}
267-
}
264+
_ => None,
265+
},
266+
),
267+
None => (None, None),
268+
};
268269
Self { filter_map_function_id, next_function_id, prev_filter_map_expr_id: None }
269270
}
270271

crates/hir-ty/src/infer.rs

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use hir_def::{
2424
expr::{BindingAnnotation, ExprId, ExprOrPatId, PatId},
2525
lang_item::{LangItem, LangItemTarget},
2626
layout::Integer,
27-
path::{path, Path},
27+
path::Path,
2828
resolver::{HasResolver, ResolveValueResult, Resolver, TypeNs, ValueNs},
2929
type_ref::TypeRef,
3030
AdtId, AssocItemId, DefWithBodyId, EnumVariantId, FieldId, FunctionId, HasModule,
@@ -923,26 +923,24 @@ impl<'a> InferenceContext<'a> {
923923
}
924924

925925
fn resolve_into_iter_item(&self) -> Option<TypeAliasId> {
926-
let path = path![core::iter::IntoIterator];
927-
let trait_ = self.resolver.resolve_known_trait(self.db.upcast(), &path)?;
926+
let ItemContainerId::TraitId(trait_) = self.resolve_lang_item(LangItem::IntoIterIntoIter)?
927+
.as_function()?
928+
.lookup(self.db.upcast()).container
929+
else { return None };
928930
self.db.trait_data(trait_).associated_type_by_name(&name![IntoIter])
929931
}
930932

931933
fn resolve_iterator_item(&self) -> Option<TypeAliasId> {
932-
let path = path![core::iter::Iterator];
933-
let trait_ = self.resolver.resolve_known_trait(self.db.upcast(), &path)?;
934+
let ItemContainerId::TraitId(trait_) = self.resolve_lang_item(LangItem::IteratorNext)?
935+
.as_function()?
936+
.lookup(self.db.upcast()).container
937+
else { return None };
934938
self.db.trait_data(trait_).associated_type_by_name(&name![Item])
935939
}
936940

937941
fn resolve_ops_try_ok(&self) -> Option<TypeAliasId> {
938-
// FIXME resolve via lang_item once try v2 is stable
939-
let path = path![core::ops::Try];
940-
let trait_ = self.resolver.resolve_known_trait(self.db.upcast(), &path)?;
941-
let trait_data = self.db.trait_data(trait_);
942-
trait_data
943-
// FIXME remove once try v2 is stable
944-
.associated_type_by_name(&name![Ok])
945-
.or_else(|| trait_data.associated_type_by_name(&name![Output]))
942+
let trait_ = self.resolve_lang_item(LangItem::Try)?.as_trait()?;
943+
self.db.trait_data(trait_).associated_type_by_name(&name![Output])
946944
}
947945

948946
fn resolve_ops_neg_output(&self) -> Option<TypeAliasId> {
@@ -956,10 +954,12 @@ impl<'a> InferenceContext<'a> {
956954
}
957955

958956
fn resolve_future_future_output(&self) -> Option<TypeAliasId> {
959-
let trait_ = self
960-
.resolver
961-
.resolve_known_trait(self.db.upcast(), &path![core::future::IntoFuture])
962-
.or_else(|| self.resolve_lang_item(LangItem::Future)?.as_trait())?;
957+
let ItemContainerId::TraitId(trait_) = self
958+
.resolve_lang_item(LangItem::IntoFutureIntoFuture)?
959+
.as_function()?
960+
.lookup(self.db.upcast())
961+
.container
962+
else { return None };
963963
self.db.trait_data(trait_).associated_type_by_name(&name![Output])
964964
}
965965

@@ -969,38 +969,32 @@ impl<'a> InferenceContext<'a> {
969969
}
970970

971971
fn resolve_range_full(&self) -> Option<AdtId> {
972-
let path = path![core::ops::RangeFull];
973-
let struct_ = self.resolver.resolve_known_struct(self.db.upcast(), &path)?;
972+
let struct_ = self.resolve_lang_item(LangItem::RangeFull)?.as_struct()?;
974973
Some(struct_.into())
975974
}
976975

977976
fn resolve_range(&self) -> Option<AdtId> {
978-
let path = path![core::ops::Range];
979-
let struct_ = self.resolver.resolve_known_struct(self.db.upcast(), &path)?;
977+
let struct_ = self.resolve_lang_item(LangItem::Range)?.as_struct()?;
980978
Some(struct_.into())
981979
}
982980

983981
fn resolve_range_inclusive(&self) -> Option<AdtId> {
984-
let path = path![core::ops::RangeInclusive];
985-
let struct_ = self.resolver.resolve_known_struct(self.db.upcast(), &path)?;
982+
let struct_ = self.resolve_lang_item(LangItem::RangeInclusiveStruct)?.as_struct()?;
986983
Some(struct_.into())
987984
}
988985

989986
fn resolve_range_from(&self) -> Option<AdtId> {
990-
let path = path![core::ops::RangeFrom];
991-
let struct_ = self.resolver.resolve_known_struct(self.db.upcast(), &path)?;
987+
let struct_ = self.resolve_lang_item(LangItem::RangeFrom)?.as_struct()?;
992988
Some(struct_.into())
993989
}
994990

995991
fn resolve_range_to(&self) -> Option<AdtId> {
996-
let path = path![core::ops::RangeTo];
997-
let struct_ = self.resolver.resolve_known_struct(self.db.upcast(), &path)?;
992+
let struct_ = self.resolve_lang_item(LangItem::RangeTo)?.as_struct()?;
998993
Some(struct_.into())
999994
}
1000995

1001996
fn resolve_range_to_inclusive(&self) -> Option<AdtId> {
1002-
let path = path![core::ops::RangeToInclusive];
1003-
let struct_ = self.resolver.resolve_known_struct(self.db.upcast(), &path)?;
997+
let struct_ = self.resolve_lang_item(LangItem::RangeToInclusive)?.as_struct()?;
1004998
Some(struct_.into())
1005999
}
10061000

crates/hir-ty/src/tests/traits.rs

Lines changed: 12 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -163,98 +163,22 @@ fn test() {
163163
}
164164

165165
#[test]
166-
fn infer_try() {
166+
fn infer_try_trait() {
167167
check_types(
168168
r#"
169-
//- /main.rs crate:main deps:core
169+
//- minicore: try, result
170170
fn test() {
171171
let r: Result<i32, u64> = Result::Ok(1);
172172
let v = r?;
173173
v;
174174
} //^ i32
175175
176-
//- /core.rs crate:core
177-
pub mod ops {
178-
pub trait Try {
179-
type Ok;
180-
type Error;
181-
}
176+
impl<O, E> core::ops::Try for Result<O, E> {
177+
type Output = O;
178+
type Error = Result<core::convert::Infallible, E>;
182179
}
183180
184-
pub mod result {
185-
pub enum Result<O, E> {
186-
Ok(O),
187-
Err(E)
188-
}
189-
190-
impl<O, E> crate::ops::Try for Result<O, E> {
191-
type Ok = O;
192-
type Error = E;
193-
}
194-
}
195-
196-
pub mod prelude {
197-
pub mod rust_2018 {
198-
pub use crate::{result::*, ops::*};
199-
}
200-
}
201-
"#,
202-
);
203-
}
204-
205-
#[test]
206-
fn infer_try_trait_v2() {
207-
check_types(
208-
r#"
209-
//- /main.rs crate:main deps:core
210-
fn test() {
211-
let r: Result<i32, u64> = Result::Ok(1);
212-
let v = r?;
213-
v;
214-
} //^ i32
215-
216-
//- /core.rs crate:core
217-
mod ops {
218-
mod try_trait {
219-
pub trait Try: FromResidual {
220-
type Output;
221-
type Residual;
222-
}
223-
pub trait FromResidual<R = <Self as Try>::Residual> {}
224-
}
225-
226-
pub use self::try_trait::FromResidual;
227-
pub use self::try_trait::Try;
228-
}
229-
230-
mod convert {
231-
pub trait From<T> {}
232-
impl<T> From<T> for T {}
233-
}
234-
235-
pub mod result {
236-
use crate::convert::From;
237-
use crate::ops::{Try, FromResidual};
238-
239-
pub enum Infallible {}
240-
pub enum Result<O, E> {
241-
Ok(O),
242-
Err(E)
243-
}
244-
245-
impl<O, E> Try for Result<O, E> {
246-
type Output = O;
247-
type Error = Result<Infallible, E>;
248-
}
249-
250-
impl<T, E, F: From<E>> FromResidual<Result<Infallible, E>> for Result<T, F> {}
251-
}
252-
253-
pub mod prelude {
254-
pub mod rust_2018 {
255-
pub use crate::result::*;
256-
}
257-
}
181+
impl<T, E, F: From<E>> core::ops::FromResidual<Result<core::convert::Infallible, E>> for Result<T, F> {}
258182
"#,
259183
);
260184
}
@@ -263,7 +187,8 @@ pub mod prelude {
263187
fn infer_for_loop() {
264188
check_types(
265189
r#"
266-
//- /main.rs crate:main deps:core,alloc
190+
//- minicore: iterator
191+
//- /main.rs crate:main deps:alloc
267192
#![no_std]
268193
use alloc::collections::Vec;
269194
@@ -275,23 +200,7 @@ fn test() {
275200
} //^ &str
276201
}
277202
278-
//- /core.rs crate:core
279-
pub mod iter {
280-
pub trait IntoIterator {
281-
type Item;
282-
type IntoIter: Iterator<Item = Self::Item>;
283-
}
284-
pub trait Iterator {
285-
type Item;
286-
}
287-
}
288-
pub mod prelude {
289-
pub mod rust_2018 {
290-
pub use crate::iter::*;
291-
}
292-
}
293-
294-
//- /alloc.rs crate:alloc deps:core
203+
//- /alloc.rs crate:alloc
295204
#![no_std]
296205
pub mod collections {
297206
pub struct Vec<T> {}
@@ -2999,40 +2908,17 @@ fn test() {
29992908
fn integer_range_iterate() {
30002909
check_types(
30012910
r#"
3002-
//- /main.rs crate:main deps:core
2911+
//- minicore: range, iterator
2912+
//- /main.rs crate:main
30032913
fn test() {
30042914
for x in 0..100 { x; }
30052915
} //^ i32
30062916
3007-
//- /core.rs crate:core
3008-
pub mod ops {
3009-
pub struct Range<Idx> {
3010-
pub start: Idx,
3011-
pub end: Idx,
3012-
}
3013-
}
3014-
3015-
pub mod iter {
3016-
pub trait Iterator {
3017-
type Item;
3018-
}
3019-
3020-
pub trait IntoIterator {
3021-
type Item;
3022-
type IntoIter: Iterator<Item = Self::Item>;
3023-
}
3024-
3025-
impl<T> IntoIterator for T where T: Iterator {
3026-
type Item = <T as Iterator>::Item;
3027-
type IntoIter = Self;
3028-
}
3029-
}
3030-
30312917
trait Step {}
30322918
impl Step for i32 {}
30332919
impl Step for i64 {}
30342920
3035-
impl<A: Step> iter::Iterator for ops::Range<A> {
2921+
impl<A: Step> core::iter::Iterator for core::ops::Range<A> {
30362922
type Item = A;
30372923
}
30382924
"#,

crates/ide-completion/src/tests/flyimport.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -541,9 +541,9 @@ fn main() {
541541
}
542542
"#,
543543
expect![[r#"
544-
fn weird_function() (use dep::test_mod::TestTrait) fn() DEPRECATED
545-
ct SPECIAL_CONST (use dep::test_mod::TestTrait) DEPRECATED
546-
"#]],
544+
ct SPECIAL_CONST (use dep::test_mod::TestTrait) DEPRECATED
545+
fn weird_function() (use dep::test_mod::TestTrait) fn() DEPRECATED
546+
"#]],
547547
);
548548
}
549549

0 commit comments

Comments
 (0)