about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2024-05-02 12:05:25 +0000
committerbors <bors@rust-lang.org>2024-05-02 12:05:25 +0000
commitb05f906a504c8ecfc5f9930508d79dac3ca25091 (patch)
treebfb2e1f779c09d0ce1f17ab49834476f787ad6b9
parentc5eaf59e43da63e047c4d155528aced804804ac0 (diff)
parentfdf757e0571c3eab95656005cb669b89eaa5c4dd (diff)
downloadrust-b05f906a504c8ecfc5f9930508d79dac3ca25091.tar.gz
rust-b05f906a504c8ecfc5f9930508d79dac3ca25091.zip
Auto merge of #17176 - Veykril:fix-implicit-ty-args, r=Veykril
Fix impl trait params not being counted properly

Fixes the other thing in https://github.com/rust-lang/rust-analyzer/issues/17173, this just rolls back a change from https://github.com/rust-lang/rust-analyzer/pull/17175 and adds a comment as to what it does
-rw-r--r--src/tools/rust-analyzer/crates/hir-ty/src/lower.rs19
-rw-r--r--src/tools/rust-analyzer/crates/hir-ty/src/tests/regression.rs7
-rw-r--r--src/tools/rust-analyzer/crates/rust-analyzer/src/cli/diagnostics.rs11
3 files changed, 33 insertions, 4 deletions
diff --git a/src/tools/rust-analyzer/crates/hir-ty/src/lower.rs b/src/tools/rust-analyzer/crates/hir-ty/src/lower.rs
index 04e2ded05a5..f1315f6c814 100644
--- a/src/tools/rust-analyzer/crates/hir-ty/src/lower.rs
+++ b/src/tools/rust-analyzer/crates/hir-ty/src/lower.rs
@@ -345,7 +345,9 @@ impl<'a> TyLoweringContext<'a> {
                     }
                     ImplTraitLoweringState::Param(counter) => {
                         let idx = counter.get();
-                        counter.set(idx + 1);
+                        // Count the number of `impl Trait` things that appear within our bounds.
+                        // Since t hose have been emitted as implicit type args already.
+                        counter.set(idx + count_impl_traits(type_ref) as u16);
                         let kind = self
                             .generics()
                             .expect("param impl trait lowering must be in a generic def")
@@ -367,7 +369,9 @@ impl<'a> TyLoweringContext<'a> {
                     }
                     ImplTraitLoweringState::Variable(counter) => {
                         let idx = counter.get();
-                        counter.set(idx + 1);
+                        // Count the number of `impl Trait` things that appear within our bounds.
+                        // Since t hose have been emitted as implicit type args already.
+                        counter.set(idx + count_impl_traits(type_ref) as u16);
                         let (
                             _parent_params,
                             self_params,
@@ -1397,6 +1401,17 @@ pub fn associated_type_shorthand_candidates<R>(
     named_associated_type_shorthand_candidates(db, def, res, None, |name, _, id| cb(name, id))
 }
 
+// FIXME: This does not handle macros!
+fn count_impl_traits(type_ref: &TypeRef) -> usize {
+    let mut count = 0;
+    type_ref.walk(&mut |type_ref| {
+        if matches!(type_ref, TypeRef::ImplTrait(_)) {
+            count += 1;
+        }
+    });
+    count
+}
+
 fn named_associated_type_shorthand_candidates<R>(
     db: &dyn HirDatabase,
     // If the type parameter is defined in an impl and we're in a method, there
diff --git a/src/tools/rust-analyzer/crates/hir-ty/src/tests/regression.rs b/src/tools/rust-analyzer/crates/hir-ty/src/tests/regression.rs
index f80d5394985..3aa94be755c 100644
--- a/src/tools/rust-analyzer/crates/hir-ty/src/tests/regression.rs
+++ b/src/tools/rust-analyzer/crates/hir-ty/src/tests/regression.rs
@@ -1980,7 +1980,7 @@ impl<#[cfg(feature = "a-feature")] A> Bar for (){}
 fn nested_anon_generics_and_where_bounds_17173() {
     check_types(
         r#"
-//- minicore: sized
+//- minicore: sized, fn
 pub trait Lookup {
     type Data;
     fn lookup(&self) -> Self::Data;
@@ -1988,8 +1988,11 @@ pub trait Lookup {
 pub trait ItemTreeLoc {
     type Id;
 }
-fn id_to_generics(id: impl Lookup<Data = impl ItemTreeLoc<Id = ()>>)
+fn id_to_generics(id: impl Lookup<Data = impl ItemTreeLoc<Id = ()>>,
                 //^^ impl Lookup<Data = impl ItemTreeLoc<Id = ()>>
+                enabled_params: impl Fn(),
+              //^^^^^^^^^^^^^^  impl Fn()
+                )
 where
     (): Sized,
 {}
diff --git a/src/tools/rust-analyzer/crates/rust-analyzer/src/cli/diagnostics.rs b/src/tools/rust-analyzer/crates/rust-analyzer/src/cli/diagnostics.rs
index 79d6226debf..d5eac49ad3a 100644
--- a/src/tools/rust-analyzer/crates/rust-analyzer/src/cli/diagnostics.rs
+++ b/src/tools/rust-analyzer/crates/rust-analyzer/src/cli/diagnostics.rs
@@ -13,6 +13,17 @@ use crate::cli::flags;
 
 impl flags::Diagnostics {
     pub fn run(self) -> anyhow::Result<()> {
+        const STACK_SIZE: usize = 1024 * 1024 * 8;
+
+        let handle = stdx::thread::Builder::new(stdx::thread::ThreadIntent::LatencySensitive)
+            .name("BIG_STACK_THREAD".into())
+            .stack_size(STACK_SIZE)
+            .spawn(|| self.run_())
+            .unwrap();
+
+        handle.join()
+    }
+    fn run_(self) -> anyhow::Result<()> {
         let cargo_config =
             CargoConfig { sysroot: Some(RustLibSource::Discover), ..Default::default() };
         let with_proc_macro_server = if let Some(p) = &self.proc_macro_srv {