Unnamed repository; edit this file 'description' to name the repository.
internal: update next-solver to 0.166
Ada Alakbarova 12 days ago
parent ffc3232 · commit a3f0bcf
-rw-r--r--Cargo.lock44
-rw-r--r--Cargo.toml16
-rw-r--r--crates/hir-ty/src/method_resolution.rs45
-rw-r--r--crates/hir-ty/src/next_solver/interner.rs37
-rw-r--r--crates/hir-ty/src/next_solver/util.rs12
5 files changed, 95 insertions, 59 deletions
diff --git a/Cargo.lock b/Cargo.lock
index a096be2f2a..7a2e2d493b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2062,9 +2062,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
[[package]]
name = "ra-ap-rustc_abi"
-version = "0.165.0"
+version = "0.166.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f25a779e21ca3bba6795193b16508c8ab159f96ee4b07349893fd272065b525"
+checksum = "e2cf1b1ffe31b6226c00b40cddfda65002b7729f9f4ed2d547b5856cdab0011c"
dependencies = [
"bitflags",
"ra-ap-rustc_hashes",
@@ -2074,33 +2074,33 @@ dependencies = [
[[package]]
name = "ra-ap-rustc_ast_ir"
-version = "0.165.0"
+version = "0.166.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0218ca6c7b096466e85a497e6150c39be5b7bc36637fe62c1cd20370a9d9aac7"
+checksum = "2ef42605e36e1305e815ccfc8830eb870f74d78534bca19a61629149536d8e98"
[[package]]
name = "ra-ap-rustc_hashes"
-version = "0.165.0"
+version = "0.166.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6b410bacf1a7c8038f376fa6283003784d568ac012e35fc0aeefa9a5ab11a2e"
+checksum = "b9f5542968215c17275920791b2fa13a43014287506ed0450777c79845102e86"
dependencies = [
"rustc-stable-hash",
]
[[package]]
name = "ra-ap-rustc_index"
-version = "0.165.0"
+version = "0.166.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2271b55e4a5d0cc0cbe9bdf8056c07ac69e32919a48ce66722ed0526d62588c3"
+checksum = "1d9e47b9ca7d92cfb0d6653503adbabd41938b84474317397a664326b208d6c6"
dependencies = [
"ra-ap-rustc_index_macros",
]
[[package]]
name = "ra-ap-rustc_index_macros"
-version = "0.165.0"
+version = "0.166.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6a89e743fb881a1e13544e3395a5ad9ad9280d56384256a121066119abd7af2"
+checksum = "4d744a7a2852a22f06210bcff9e4667ed0cacbfbe94894cc294044d25e876341"
dependencies = [
"proc-macro2",
"quote",
@@ -2109,9 +2109,9 @@ dependencies = [
[[package]]
name = "ra-ap-rustc_lexer"
-version = "0.165.0"
+version = "0.166.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6d7c9cc05e0e6b72a214a455a106d9b22b0494164d50a657b17bd319534c218"
+checksum = "527c12b3731b7d0692498012810b85b2b8dfdb8b514321ed6afc434bd1c70191"
dependencies = [
"memchr",
"unicode-ident",
@@ -2120,9 +2120,9 @@ dependencies = [
[[package]]
name = "ra-ap-rustc_next_trait_solver"
-version = "0.165.0"
+version = "0.166.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb3017c2f0ace80b8e6068b9c613aa56ed50e0374bf44a891447511f1264e40d"
+checksum = "a7a9663a8d7c369e934aac2b74a638537ad7eb4be75b4530d765384dc071c936"
dependencies = [
"derive-where",
"ra-ap-rustc_index",
@@ -2133,9 +2133,9 @@ dependencies = [
[[package]]
name = "ra-ap-rustc_parse_format"
-version = "0.165.0"
+version = "0.166.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a737f844bdef8ac5ab54dadf2f34704b4d06beef9236d71080bb34db697220b"
+checksum = "2c038b7a8b0f784d4e441ad8ab991fbbdaa5e0be482e59c639a846a1c8126951"
dependencies = [
"ra-ap-rustc_lexer",
"rustc-literal-escaper",
@@ -2143,9 +2143,9 @@ dependencies = [
[[package]]
name = "ra-ap-rustc_pattern_analysis"
-version = "0.165.0"
+version = "0.166.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6de3d4c7d6078cce3c40c55717b8b15002a80b9fa8849faea496a365324861b4"
+checksum = "42ca286f90e99bb97cd9274c088f3c874a05d1ee90cabf40a3928afedabe99fd"
dependencies = [
"ra-ap-rustc_index",
"rustc-hash 2.1.2",
@@ -2156,9 +2156,9 @@ dependencies = [
[[package]]
name = "ra-ap-rustc_type_ir"
-version = "0.165.0"
+version = "0.166.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c5d9a4d3e7bee7313599bc6d794037247ac0165f03857379cf4fc3097199e05"
+checksum = "26d6efb6008f665a9485e0afecf9f4950a6c4bedd8ddd330a9df8986a6c0160b"
dependencies = [
"arrayvec",
"bitflags",
@@ -2177,9 +2177,9 @@ dependencies = [
[[package]]
name = "ra-ap-rustc_type_ir_macros"
-version = "0.165.0"
+version = "0.166.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "024598d1f54272acd83d28c121f8a2e82e216dd7be1e40158b66b2d12fa214c0"
+checksum = "5f4fd2355e2bbf1f343c730f623596efc6e465b5e3685b606a437567ebb75bf8"
dependencies = [
"proc-macro2",
"quote",
diff --git a/Cargo.toml b/Cargo.toml
index 2a219c3ea4..4ef92c5bd2 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -86,14 +86,14 @@ vfs-notify = { path = "./crates/vfs-notify", version = "0.0.0" }
vfs = { path = "./crates/vfs", version = "0.0.0" }
edition = { path = "./crates/edition", version = "0.0.0" }
-ra-ap-rustc_lexer = { version = "0.165", default-features = false }
-ra-ap-rustc_parse_format = { version = "0.165", default-features = false }
-ra-ap-rustc_index = { version = "0.165", default-features = false }
-ra-ap-rustc_abi = { version = "0.165", default-features = false }
-ra-ap-rustc_pattern_analysis = { version = "0.165", default-features = false }
-ra-ap-rustc_ast_ir = { version = "0.165", default-features = false }
-ra-ap-rustc_type_ir = { version = "0.165", default-features = false }
-ra-ap-rustc_next_trait_solver = { version = "0.165", default-features = false }
+ra-ap-rustc_lexer = { version = "0.166", default-features = false }
+ra-ap-rustc_parse_format = { version = "0.166", default-features = false }
+ra-ap-rustc_index = { version = "0.166", default-features = false }
+ra-ap-rustc_abi = { version = "0.166", default-features = false }
+ra-ap-rustc_pattern_analysis = { version = "0.166", default-features = false }
+ra-ap-rustc_ast_ir = { version = "0.166", default-features = false }
+ra-ap-rustc_type_ir = { version = "0.166", default-features = false }
+ra-ap-rustc_next_trait_solver = { version = "0.166", default-features = false }
# local crates that aren't published to crates.io. These should not have versions.
diff --git a/crates/hir-ty/src/method_resolution.rs b/crates/hir-ty/src/method_resolution.rs
index e8702bf2c9..97e9d8bae1 100644
--- a/crates/hir-ty/src/method_resolution.rs
+++ b/crates/hir-ty/src/method_resolution.rs
@@ -31,7 +31,7 @@ use hir_def::{
};
use rustc_hash::{FxHashMap, FxHashSet};
use rustc_type_ir::{
- TypeVisitableExt,
+ TypeVisitableExt, VisitorResult,
fast_reject::{TreatParams, simplify_type},
inherent::{BoundExistentialPredicates, IntoKind},
};
@@ -54,6 +54,7 @@ use crate::{
obligation_ctxt::ObligationCtxt,
util::clauses_as_obligations,
},
+ ret,
traits::ParamEnvAndCrate,
};
@@ -835,27 +836,34 @@ impl<'db> TraitImpls<'db> {
}
}
- pub fn for_each_crate_and_block(
+ pub fn for_each_crate_and_block<R: VisitorResult>(
db: &'db dyn HirDatabase,
krate: Crate,
block: Option<BlockIdLt<'db>>,
- for_each: &mut dyn FnMut(&TraitImpls<'db>),
- ) {
+ for_each: &mut dyn FnMut(&TraitImpls<'db>) -> R,
+ ) -> R {
let blocks = std::iter::successors(block, |block| block.module(db).block(db));
- blocks.filter_map(|block| Self::for_block(db, block)).for_each(&mut *for_each);
- Self::for_crate_and_deps(db, krate).iter().map(|it| &**it).for_each(for_each);
+ for impl_ in blocks.filter_map(|block| Self::for_block(db, block)) {
+ ret!(for_each(impl_));
+ }
+ for impl_ in Self::for_crate_and_deps(db, krate) {
+ ret!(for_each(impl_));
+ }
+ R::output()
}
/// Like [`Self::for_each_crate_and_block()`], but takes in account two blocks, one for a trait and one for a self type.
- pub fn for_each_crate_and_block_trait_and_type(
+ pub fn for_each_crate_and_block_trait_and_type<R: VisitorResult>(
db: &'db dyn HirDatabase,
krate: Crate,
type_block: Option<BlockIdLt<'db>>,
trait_block: Option<BlockIdLt<'db>>,
- for_each: &mut dyn FnMut(&TraitImpls<'db>),
- ) {
+ for_each: &mut dyn FnMut(&TraitImpls<'db>) -> R,
+ ) -> R {
let in_self_and_deps = TraitImpls::for_crate_and_deps(db, krate);
- in_self_and_deps.iter().for_each(|impls| for_each(impls));
+ for impl_ in in_self_and_deps {
+ ret!(for_each(impl_));
+ }
// We must not provide duplicate impls to the solver. Therefore we work with the following strategy:
// start from each block, and walk ancestors until you meet the other block. If they never meet,
@@ -874,13 +882,20 @@ impl<'db> TraitImpls<'db> {
.filter_map(move |block| TraitImpls::for_block(db, block))
};
if trait_block == type_block {
- blocks_iter(trait_block)
- .filter_map(|block| TraitImpls::for_block(db, block))
- .for_each(for_each);
+ for impl_ in
+ blocks_iter(trait_block).filter_map(|block| TraitImpls::for_block(db, block))
+ {
+ ret!(for_each(impl_));
+ }
} else {
- for_each_block(trait_block, type_block).for_each(&mut *for_each);
- for_each_block(type_block, trait_block).for_each(for_each);
+ for impl_ in for_each_block(trait_block, type_block) {
+ ret!(for_each(impl_));
+ }
+ for impl_ in for_each_block(type_block, trait_block) {
+ ret!(for_each(impl_));
+ }
}
+ R::output()
}
}
diff --git a/crates/hir-ty/src/next_solver/interner.rs b/crates/hir-ty/src/next_solver/interner.rs
index a7216a034c..dc30c1e582 100644
--- a/crates/hir-ty/src/next_solver/interner.rs
+++ b/crates/hir-ty/src/next_solver/interner.rs
@@ -29,7 +29,7 @@ use rustc_index::bit_set::DenseBitSet;
use rustc_type_ir::{
AliasTy, BoundVar, CoroutineWitnessTypes, DebruijnIndex, EarlyBinder, FlagComputation, Flags,
FnSigKind, GenericArgKind, GenericTypeVisitable, ImplPolarity, InferTy, Interner, TraitRef,
- TypeFlags, TypeVisitableExt, Upcast, Variance,
+ TypeFlags, TypeVisitableExt, Upcast, Variance, VisitorResult,
elaborate::elaborate,
error::TypeError,
fast_reject,
@@ -54,6 +54,7 @@ use crate::{
TraitAssocTyId, TraitIdWrapper, TypeAliasIdWrapper, UnevaluatedConst, Unnormalized,
util::{explicit_item_bounds, explicit_item_self_bounds},
},
+ ret,
};
use super::{
@@ -1601,12 +1602,12 @@ impl<'db> Interner for DbInterner<'db> {
def_id.0.trait_items(self.db()).associated_types().map(|id| id.into())
}
- fn for_each_relevant_impl(
+ fn for_each_relevant_impl<R: VisitorResult>(
self,
trait_def_id: Self::TraitId,
self_ty: Self::Ty,
- mut f: impl FnMut(Self::ImplId),
- ) {
+ mut f: impl FnMut(Self::ImplId) -> R,
+ ) -> R {
let krate = self.krate.expect("trait solving requires setting `DbInterner::krate`");
let trait_block = trait_def_id.0.loc(self.db).container.block(self.db);
let mut consider_impls_for_simplified_type = |simp: SimplifiedType<'_>| {
@@ -1641,13 +1642,14 @@ impl<'db> Interner for DbInterner<'db> {
let (regular_impls, builtin_derive_impls) =
impls.for_trait_and_self_ty(trait_def_id.0, &simp);
for &impl_ in regular_impls {
- f(impl_.into());
+ ret!(f(impl_.into()));
}
for &impl_ in builtin_derive_impls {
- f(impl_.into());
+ ret!(f(impl_.into()));
}
+ R::output()
},
- );
+ )
};
match self_ty.kind() {
@@ -1676,7 +1678,7 @@ impl<'db> Interner for DbInterner<'db> {
let simp =
fast_reject::simplify_type(self, self_ty, fast_reject::TreatParams::AsRigid)
.unwrap();
- consider_impls_for_simplified_type(simp);
+ ret!(consider_impls_for_simplified_type(simp));
}
// HACK: For integer and float variables we have to manually look at all impls
@@ -1704,7 +1706,7 @@ impl<'db> Interner for DbInterner<'db> {
SimplifiedType::Uint(Usize),
];
for simp in possible_integers {
- consider_impls_for_simplified_type(simp);
+ ret!(consider_impls_for_simplified_type(simp));
}
}
@@ -1719,7 +1721,7 @@ impl<'db> Interner for DbInterner<'db> {
];
for simp in possible_floats {
- consider_impls_for_simplified_type(simp);
+ ret!(consider_impls_for_simplified_type(simp));
}
}
@@ -1748,15 +1750,22 @@ impl<'db> Interner for DbInterner<'db> {
self.for_each_blanket_impl(trait_def_id, f)
}
- fn for_each_blanket_impl(self, trait_def_id: Self::TraitId, mut f: impl FnMut(Self::ImplId)) {
- let Some(krate) = self.krate else { return };
+ fn for_each_blanket_impl<R: VisitorResult>(
+ self,
+ trait_def_id: Self::TraitId,
+ mut f: impl FnMut(Self::ImplId) -> R,
+ ) -> R {
+ let Some(krate) = self.krate else {
+ return R::output();
+ };
let block = trait_def_id.0.loc(self.db).container.block(self.db);
TraitImpls::for_each_crate_and_block(self.db, krate, block, &mut |impls| {
for &impl_ in impls.blanket_impls(trait_def_id.0) {
- f(impl_.into());
+ ret!(f(impl_.into()));
}
- });
+ R::output()
+ })
}
fn has_item_definition(self, _def_id: Self::ImplOrTraitAssocTermId) -> bool {
diff --git a/crates/hir-ty/src/next_solver/util.rs b/crates/hir-ty/src/next_solver/util.rs
index 7e40e3c17d..e384ac4552 100644
--- a/crates/hir-ty/src/next_solver/util.rs
+++ b/crates/hir-ty/src/next_solver/util.rs
@@ -723,3 +723,15 @@ pub(crate) fn clauses_as_obligations<'db>(
recursion_depth: 0,
})
}
+
+/// Copied from
+/// <https://github.com/jdonszelmann/rust/blob/180725cff61d00dd1b9c35fc720a8befaec5d46b/compiler/rustc_middle/src/ty/context/impl_interner.rs#L534-L541>
+#[macro_export]
+macro_rules! ret {
+ ($e: expr) => {
+ match $e.branch() {
+ ::std::ops::ControlFlow::Break(b) => return R::from_residual(b),
+ ::std::ops::ControlFlow::Continue(()) => {}
+ }
+ };
+}