]> git.lizzy.rs Git - rust.git/commitdiff
fix: no more Registering progress handler for token rustAnalyzer/Indexing failed.
authorAleksey Kladov <aleksey.kladov@gmail.com>
Tue, 20 Apr 2021 19:54:05 +0000 (22:54 +0300)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Tue, 20 Apr 2021 19:54:05 +0000 (22:54 +0300)
crates/ide/src/prime_caches.rs
crates/stdx/src/lib.rs

index ea0acfaa0204e620ac339ce6ec60bbaf77b125a5..03597f5078b7a5735e0f7117ba307c94439ffc2d 100644 (file)
@@ -27,6 +27,7 @@ pub(crate) fn prime_caches(db: &RootDatabase, cb: &(dyn Fn(PrimeCachesProgress)
     let topo = &graph.crates_in_topological_order();
 
     cb(PrimeCachesProgress::Started);
+    let _d = stdx::defer(|| cb(PrimeCachesProgress::Finished));
 
     // FIXME: This would be easy to parallelize, since it's in the ideal ordering for that.
     // Unfortunately rayon prevents panics from propagation out of a `scope`, which breaks
@@ -41,6 +42,4 @@ pub(crate) fn prime_caches(db: &RootDatabase, cb: &(dyn Fn(PrimeCachesProgress)
         });
         db.crate_def_map(*krate);
     }
-
-    cb(PrimeCachesProgress::Finished);
 }
index e3eb109156ce11bf35a82e22e776710b9672b74f..857567a853aabf46a91b55b5ce3af49453258c86 100644 (file)
@@ -179,6 +179,18 @@ pub fn equal_range_by<T, F>(slice: &[T], mut key: F) -> ops::Range<usize>
     start..start + len
 }
 
+pub fn defer<F: FnOnce()>(f: F) -> impl Drop {
+    struct D<F: FnOnce()>(Option<F>);
+    impl<F: FnOnce()> Drop for D<F> {
+        fn drop(&mut self) {
+            if let Some(f) = self.0.take() {
+                f()
+            }
+        }
+    }
+    D(Some(f))
+}
+
 #[repr(transparent)]
 pub struct JodChild(pub std::process::Child);