Unnamed repository; edit this file 'description' to name the repository.
perf: Only compute lang items for `#![feature(lang_items)]` crates
Lukas Wirth 4 months ago
parent e3268f7 · commit 8facf73
-rw-r--r--crates/hir-def/src/lang_item.rs4
-rw-r--r--crates/hir-ty/src/consteval/tests.rs3
-rw-r--r--crates/hir-ty/src/tests/incremental.rs37
-rw-r--r--crates/hir-ty/src/tests/patterns.rs19
-rw-r--r--crates/hir-ty/src/tests/regression.rs1
-rw-r--r--crates/hir-ty/src/tests/regression/new_solver.rs1
-rw-r--r--crates/hir-ty/src/tests/simple.rs36
-rw-r--r--crates/ide-completion/src/tests/flyimport.rs2
-rw-r--r--crates/ide-diagnostics/src/handlers/trait_impl_incorrect_safety.rs1
-rw-r--r--crates/ide/src/hover/tests.rs1
-rw-r--r--crates/ide/src/inlay_hints/bounds.rs2
-rw-r--r--crates/intern/src/symbol/symbols.rs1
-rw-r--r--crates/test-utils/src/minicore.rs1
13 files changed, 51 insertions, 58 deletions
diff --git a/crates/hir-def/src/lang_item.rs b/crates/hir-def/src/lang_item.rs
index d3f4480b20..eba4d87ec9 100644
--- a/crates/hir-def/src/lang_item.rs
+++ b/crates/hir-def/src/lang_item.rs
@@ -40,6 +40,10 @@ pub fn crate_lang_items(db: &dyn DefDatabase, krate: Crate) -> Option<Box<LangIt
let crate_def_map = crate_def_map(db, krate);
+ if !crate_def_map.is_unstable_feature_enabled(&sym::lang_items) {
+ return None;
+ }
+
for (_, module_data) in crate_def_map.modules() {
for impl_def in module_data.scope.inherent_impls() {
lang_items.collect_lang_item(db, impl_def);
diff --git a/crates/hir-ty/src/consteval/tests.rs b/crates/hir-ty/src/consteval/tests.rs
index 08f201fea9..5f6bcb4a60 100644
--- a/crates/hir-ty/src/consteval/tests.rs
+++ b/crates/hir-ty/src/consteval/tests.rs
@@ -2209,6 +2209,7 @@ fn boxes() {
check_number(
r#"
//- minicore: coerce_unsized, deref_mut, slice
+#![feature(lang_items)]
use core::ops::{Deref, DerefMut};
use core::{marker::Unsize, ops::CoerceUnsized};
@@ -2346,6 +2347,7 @@ fn c_string() {
check_number(
r#"
//- minicore: index, slice
+#![feature(lang_items)]
#[lang = "CStr"]
pub struct CStr {
inner: [u8]
@@ -2360,6 +2362,7 @@ const GOAL: u8 = {
check_number(
r#"
//- minicore: index, slice
+#![feature(lang_items)]
#[lang = "CStr"]
pub struct CStr {
inner: [u8]
diff --git a/crates/hir-ty/src/tests/incremental.rs b/crates/hir-ty/src/tests/incremental.rs
index 118f433a24..cf7ff6f7ec 100644
--- a/crates/hir-ty/src/tests/incremental.rs
+++ b/crates/hir-ty/src/tests/incremental.rs
@@ -132,14 +132,13 @@ fn baz() -> i32 {
"trait_environment_query",
"lang_items",
"crate_lang_items",
- "AttrFlags::query_",
- "AttrFlags::query_",
"GenericPredicates::query_with_diagnostics_",
"ImplTraits::return_type_impl_traits_",
"expr_scopes_shim",
"InferenceResult::for_body_",
"function_signature_shim",
"function_signature_with_source_map_shim",
+ "AttrFlags::query_",
"body_shim",
"body_with_source_map_shim",
"trait_environment_query",
@@ -149,6 +148,7 @@ fn baz() -> i32 {
"InferenceResult::for_body_",
"function_signature_shim",
"function_signature_with_source_map_shim",
+ "AttrFlags::query_",
"body_shim",
"body_with_source_map_shim",
"trait_environment_query",
@@ -197,13 +197,13 @@ fn baz() -> i32 {
"body_with_source_map_shim",
"body_shim",
"AttrFlags::query_",
- "AttrFlags::query_",
"function_signature_with_source_map_shim",
"function_signature_shim",
"body_with_source_map_shim",
"body_shim",
"InferenceResult::for_body_",
"expr_scopes_shim",
+ "AttrFlags::query_",
"function_signature_with_source_map_shim",
"function_signature_shim",
"body_with_source_map_shim",
@@ -245,8 +245,6 @@ $0",
"TraitImpls::for_crate_",
"lang_items",
"crate_lang_items",
- "AttrFlags::query_",
- "AttrFlags::query_",
]
"#]],
);
@@ -284,9 +282,6 @@ pub struct NewStruct {
"crate_local_def_map",
"TraitImpls::for_crate_",
"crate_lang_items",
- "AttrFlags::query_",
- "AttrFlags::query_",
- "AttrFlags::query_",
]
"#]],
);
@@ -324,8 +319,6 @@ $0",
"TraitImpls::for_crate_",
"lang_items",
"crate_lang_items",
- "AttrFlags::query_",
- "AttrFlags::query_",
]
"#]],
);
@@ -364,12 +357,6 @@ pub enum SomeEnum {
"crate_local_def_map",
"TraitImpls::for_crate_",
"crate_lang_items",
- "AttrFlags::query_",
- "AttrFlags::query_",
- "AttrFlags::query_",
- "EnumVariants::of_",
- "AttrFlags::query_",
- "AttrFlags::query_",
]
"#]],
);
@@ -407,8 +394,6 @@ $0",
"TraitImpls::for_crate_",
"lang_items",
"crate_lang_items",
- "AttrFlags::query_",
- "AttrFlags::query_",
]
"#]],
);
@@ -444,8 +429,6 @@ fn bar() -> f32 {
"crate_local_def_map",
"TraitImpls::for_crate_",
"crate_lang_items",
- "AttrFlags::query_",
- "AttrFlags::query_",
]
"#]],
);
@@ -487,9 +470,6 @@ $0",
"TraitImpls::for_crate_",
"lang_items",
"crate_lang_items",
- "AttrFlags::query_",
- "AttrFlags::query_",
- "AttrFlags::query_",
]
"#]],
);
@@ -533,12 +513,6 @@ impl SomeStruct {
"crate_local_def_map",
"TraitImpls::for_crate_",
"crate_lang_items",
- "AttrFlags::query_",
- "ImplItems::of_",
- "AttrFlags::query_",
- "AttrFlags::query_",
- "AttrFlags::query_",
- "AttrFlags::query_",
]
"#]],
);
@@ -610,7 +584,6 @@ fn main() {
"trait_environment_query",
"lang_items",
"crate_lang_items",
- "AttrFlags::query_",
"GenericPredicates::query_with_diagnostics_",
"GenericPredicates::query_with_diagnostics_",
"ImplTraits::return_type_impl_traits_",
@@ -623,6 +596,7 @@ fn main() {
"expr_scopes_shim",
"struct_signature_shim",
"struct_signature_with_source_map_shim",
+ "AttrFlags::query_",
"GenericPredicates::query_with_diagnostics_",
"value_ty_query",
"InherentImpls::for_crate_",
@@ -702,8 +676,6 @@ fn main() {
"body_with_source_map_shim",
"body_shim",
"crate_lang_items",
- "AttrFlags::query_",
- "AttrFlags::query_",
"GenericPredicates::query_with_diagnostics_",
"GenericPredicates::query_with_diagnostics_",
"ImplTraits::return_type_impl_traits_",
@@ -713,6 +685,7 @@ fn main() {
"ImplTraits::return_type_impl_traits_",
"expr_scopes_shim",
"struct_signature_with_source_map_shim",
+ "AttrFlags::query_",
"GenericPredicates::query_with_diagnostics_",
"InherentImpls::for_crate_",
"callable_item_signature_query",
diff --git a/crates/hir-ty/src/tests/patterns.rs b/crates/hir-ty/src/tests/patterns.rs
index c312b16759..0b776938c5 100644
--- a/crates/hir-ty/src/tests/patterns.rs
+++ b/crates/hir-ty/src/tests/patterns.rs
@@ -794,6 +794,8 @@ fn slice_tail_pattern() {
fn box_pattern() {
check_infer(
r#"
+ #![feature(lang_items)]
+
pub struct Global;
#[lang = "owned_box"]
pub struct Box<T, A = Global>(T);
@@ -805,13 +807,13 @@ fn box_pattern() {
}
"#,
expect![[r#"
- 83..89 'params': Box<i32, Global>
- 101..155 '{ ... } }': ()
- 107..153 'match ... }': ()
- 113..119 'params': Box<i32, Global>
- 130..141 'box integer': Box<i32, Global>
- 134..141 'integer': i32
- 145..147 '{}': ()
+ 108..114 'params': Box<i32, Global>
+ 126..180 '{ ... } }': ()
+ 132..178 'match ... }': ()
+ 138..144 'params': Box<i32, Global>
+ 155..166 'box integer': Box<i32, Global>
+ 159..166 'integer': i32
+ 170..172 '{}': ()
"#]],
);
check_infer(
@@ -831,7 +833,6 @@ fn box_pattern() {
76..122 'match ... }': ()
82..88 'params': Box<i32>
99..110 'box integer': Box<i32>
- 103..110 'integer': i32
114..116 '{}': ()
"#]],
);
@@ -1142,6 +1143,7 @@ fn my_fn(#[cfg(feature = "feature")] u8: u8, u32: u32) {}
fn var_args() {
check_types(
r#"
+#![feature(lang_items)]
#[lang = "va_list"]
pub struct VaListImpl<'f>;
fn my_fn(foo: ...) {}
@@ -1156,6 +1158,7 @@ fn my_fn2(bar: u32, foo: ...) {}
fn var_args_cond() {
check_types(
r#"
+#![feature(lang_items)]
#[lang = "va_list"]
pub struct VaListImpl<'f>;
fn my_fn(bar: u32, #[cfg(FALSE)] foo: ..., #[cfg(not(FALSE))] foo: u32) {
diff --git a/crates/hir-ty/src/tests/regression.rs b/crates/hir-ty/src/tests/regression.rs
index f03f8d754f..c805f03044 100644
--- a/crates/hir-ty/src/tests/regression.rs
+++ b/crates/hir-ty/src/tests/regression.rs
@@ -2374,6 +2374,7 @@ fn rust_destruct_option_clone() {
check_types(
r#"
//- minicore: option, drop
+#![feature(lang_items)]
fn test(o: &Option<i32>) {
o.my_clone();
//^^^^^^^^^^^^ Option<i32>
diff --git a/crates/hir-ty/src/tests/regression/new_solver.rs b/crates/hir-ty/src/tests/regression/new_solver.rs
index e11cc85e7f..a4554673cd 100644
--- a/crates/hir-ty/src/tests/regression/new_solver.rs
+++ b/crates/hir-ty/src/tests/regression/new_solver.rs
@@ -234,6 +234,7 @@ fn main() {
// toolchains <= 1.88.0, before sized-hierarchy.
check_no_mismatches(
r#"
+#![feature(lang_items)]
#[lang = "sized"]
pub trait Sized {}
diff --git a/crates/hir-ty/src/tests/simple.rs b/crates/hir-ty/src/tests/simple.rs
index db557b7507..6367521841 100644
--- a/crates/hir-ty/src/tests/simple.rs
+++ b/crates/hir-ty/src/tests/simple.rs
@@ -2702,6 +2702,8 @@ fn box_into_vec() {
check_infer(
r#"
//- /core.rs crate:core
+#![feature(lang_items)]
+
#[lang = "sized"]
pub trait Sized {}
@@ -2745,22 +2747,22 @@ struct Astruct;
impl B for Astruct {}
"#,
expect![[r#"
- 614..618 'self': Box<[T], A>
- 647..679 '{ ... }': Vec<T, A>
- 693..863 '{ ...])); }': ()
- 703..706 'vec': Vec<i32, Global>
- 709..724 '<[_]>::into_vec': fn into_vec<i32, Global>(Box<[i32], Global>) -> Vec<i32, Global>
- 709..755 '<[_]>:...i32]))': Vec<i32, Global>
- 725..754 '#[rust...1i32])': Box<[i32; 1], Global>
- 747..753 '[1i32]': [i32; 1]
- 748..752 '1i32': i32
- 765..766 'v': Vec<Box<dyn B + 'static, Global>, Global>
- 786..803 '<[_]> ...to_vec': fn into_vec<Box<dyn B + '?, Global>, Global>(Box<[Box<dyn B + '?, Global>], Global>) -> Vec<Box<dyn B + '?, Global>, Global>
- 786..860 '<[_]> ...ct)]))': Vec<Box<dyn B + '?, Global>, Global>
- 804..859 '#[rust...uct)])': Box<[Box<dyn B + '?, Global>; 1], Global>
- 826..858 '[#[rus...ruct)]': [Box<dyn B + '?, Global>; 1]
- 827..857 '#[rust...truct)': Box<Astruct, Global>
- 849..856 'Astruct': Astruct
+ 639..643 'self': Box<[T], A>
+ 672..704 '{ ... }': Vec<T, A>
+ 718..888 '{ ...])); }': ()
+ 728..731 'vec': Vec<i32, Global>
+ 734..749 '<[_]>::into_vec': fn into_vec<i32, Global>(Box<[i32], Global>) -> Vec<i32, Global>
+ 734..780 '<[_]>:...i32]))': Vec<i32, Global>
+ 750..779 '#[rust...1i32])': Box<[i32; 1], Global>
+ 772..778 '[1i32]': [i32; 1]
+ 773..777 '1i32': i32
+ 790..791 'v': Vec<Box<dyn B + 'static, Global>, Global>
+ 811..828 '<[_]> ...to_vec': fn into_vec<Box<dyn B + '?, Global>, Global>(Box<[Box<dyn B + '?, Global>], Global>) -> Vec<Box<dyn B + '?, Global>, Global>
+ 811..885 '<[_]> ...ct)]))': Vec<Box<dyn B + '?, Global>, Global>
+ 829..884 '#[rust...uct)])': Box<[Box<dyn B + '?, Global>; 1], Global>
+ 851..883 '[#[rus...ruct)]': [Box<dyn B + '?, Global>; 1]
+ 852..882 '#[rust...truct)': Box<Astruct, Global>
+ 874..881 'Astruct': Astruct
"#]],
)
}
@@ -3647,6 +3649,8 @@ fn main() {
fn cstring_literals() {
check_types(
r#"
+#![feature(lang_items)]
+
#[lang = "CStr"]
pub struct CStr;
diff --git a/crates/ide-completion/src/tests/flyimport.rs b/crates/ide-completion/src/tests/flyimport.rs
index 2912457da1..797df3f163 100644
--- a/crates/ide-completion/src/tests/flyimport.rs
+++ b/crates/ide-completion/src/tests/flyimport.rs
@@ -781,9 +781,9 @@ fn main() {
}
"#,
expect![[r#"
- me random_method(…) (use dep::test_mod::TestTrait) fn(&self) DEPRECATED
ct SPECIAL_CONST (use dep::test_mod::TestTrait) u8 DEPRECATED
fn weird_function() (use dep::test_mod::TestTrait) fn() DEPRECATED
+ me random_method(…) (use dep::test_mod::TestTrait) fn(&self) DEPRECATED
"#]],
);
}
diff --git a/crates/ide-diagnostics/src/handlers/trait_impl_incorrect_safety.rs b/crates/ide-diagnostics/src/handlers/trait_impl_incorrect_safety.rs
index 3414e972d5..c5b2f499d3 100644
--- a/crates/ide-diagnostics/src/handlers/trait_impl_incorrect_safety.rs
+++ b/crates/ide-diagnostics/src/handlers/trait_impl_incorrect_safety.rs
@@ -64,6 +64,7 @@ unsafe trait Unsafe {}
fn drop_may_dangle() {
check_diagnostics(
r#"
+#![feature(lang_items)]
#[lang = "drop"]
trait Drop {}
struct S<T>;
diff --git a/crates/ide/src/hover/tests.rs b/crates/ide/src/hover/tests.rs
index f42d3cf0dc..0b518021e3 100644
--- a/crates/ide/src/hover/tests.rs
+++ b/crates/ide/src/hover/tests.rs
@@ -4089,6 +4089,7 @@ fn foo() {
let fo$0o = async { S };
}
//- /core.rs crate:core
+#![feature(lang_items)]
pub mod future {
#[lang = "future_trait"]
pub trait Future {}
diff --git a/crates/ide/src/inlay_hints/bounds.rs b/crates/ide/src/inlay_hints/bounds.rs
index c9fbdf3ae7..045559fd7f 100644
--- a/crates/ide/src/inlay_hints/bounds.rs
+++ b/crates/ide/src/inlay_hints/bounds.rs
@@ -143,7 +143,7 @@ fn foo<T>() {}
file_id: FileId(
1,
),
- range: 446..451,
+ range: 470..475,
},
),
),
diff --git a/crates/intern/src/symbol/symbols.rs b/crates/intern/src/symbol/symbols.rs
index 3e325b2f99..b6efc599f1 100644
--- a/crates/intern/src/symbol/symbols.rs
+++ b/crates/intern/src/symbol/symbols.rs
@@ -297,6 +297,7 @@ define_symbols! {
iterator,
keyword,
lang,
+ lang_items,
le,
Left,
len,
diff --git a/crates/test-utils/src/minicore.rs b/crates/test-utils/src/minicore.rs
index b7c09391ec..01274a9835 100644
--- a/crates/test-utils/src/minicore.rs
+++ b/crates/test-utils/src/minicore.rs
@@ -80,6 +80,7 @@
//! offset_of:
#![rustc_coherence_is_core]
+#![feature(lang_items)]
pub mod marker {
// region:sized