]> git.lizzy.rs Git - rust.git/commitdiff
Make always-assert crate reusable
authorAleksey Kladov <aleksey.kladov@gmail.com>
Tue, 26 Jan 2021 19:11:12 +0000 (22:11 +0300)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Tue, 26 Jan 2021 19:13:42 +0000 (22:13 +0300)
Cargo.lock
crates/completion/src/item.rs
crates/ide/src/references/rename.rs
crates/ide_db/src/source_change.rs
crates/rust-analyzer/Cargo.toml
crates/rust-analyzer/src/bin/main.rs
crates/stdx/Cargo.toml
crates/stdx/src/lib.rs
crates/stdx/src/macros.rs
docs/dev/style.md
xtask/src/install.rs

index efd1c6d330ac6b48b7f7c76c19631c21e78da63e..45a0211ffb85e834997000027d4480eae1a121fc 100644 (file)
@@ -15,6 +15,15 @@ version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e"
 
+[[package]]
+name = "always-assert"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "727786f78c5bc0cda8011831616589f72084cb16b7df4213a997b78749b55a60"
+dependencies = [
+ "log",
+]
+
 [[package]]
 name = "ansi_term"
 version = "0.12.1"
@@ -1415,6 +1424,7 @@ dependencies = [
 name = "rust-analyzer"
 version = "0.0.0"
 dependencies = [
+ "always-assert",
  "anyhow",
  "cfg",
  "crossbeam-channel 0.5.0",
@@ -1658,6 +1668,7 @@ dependencies = [
 name = "stdx"
 version = "0.0.0"
 dependencies = [
+ "always-assert",
  "backtrace",
 ]
 
index eeb952ec3c54e2b644227bc030d491fa78e635f4..8ec4ac65e29db270a1345d98bd128691fd20a9c7 100644 (file)
@@ -10,7 +10,7 @@
     },
     SymbolKind,
 };
-use stdx::{assert_never, impl_from};
+use stdx::{impl_from, never};
 use syntax::{algo, TextRange};
 use text_edit::TextEdit;
 
@@ -404,7 +404,7 @@ pub(crate) fn detail(self, detail: impl Into<String>) -> Builder {
     pub(crate) fn set_detail(mut self, detail: Option<impl Into<String>>) -> Builder {
         self.detail = detail.map(Into::into);
         if let Some(detail) = &self.detail {
-            if assert_never!(detail.contains('\n'), "multiline detail:\n{}", detail) {
+            if never!(detail.contains('\n'), "multiline detail:\n{}", detail) {
                 self.detail = Some(detail.splitn(2, '\n').next().unwrap().to_string());
             }
         }
index c25bcce50eb61bd19af59a9f32f0a9b38c307e8e..99a558532875309f8436fcf98ea7d7362a62ea8c 100644 (file)
@@ -9,7 +9,7 @@
     search::FileReference,
     RootDatabase,
 };
-use stdx::assert_never;
+use stdx::never;
 use syntax::{
     ast::{self, NameOwner},
     lex_single_syntax_kind, AstNode, SyntaxKind, SyntaxNode, T,
@@ -285,7 +285,7 @@ fn rename_mod(
 }
 
 fn rename_to_self(sema: &Semantics<RootDatabase>, local: hir::Local) -> RenameResult<SourceChange> {
-    if assert_never!(local.is_self(sema.db)) {
+    if never!(local.is_self(sema.db)) {
         bail!("rename_to_self invoked on self");
     }
 
@@ -388,7 +388,7 @@ fn rename_self_to_param(
     let (file_id, self_param) = match local.source(sema.db) {
         InFile { file_id, value: Either::Right(self_param) } => (file_id, self_param),
         _ => {
-            assert_never!(true, "rename_self_to_param invoked on a non-self local");
+            never!(true, "rename_self_to_param invoked on a non-self local");
             bail!("rename_self_to_param invoked on a non-self local");
         }
     };
index b1f87731bfdf4389b38d3d6eb27b9f6e5288d83f..f76bac151c2a89cabf6bf853941d9234f0eb1c2c 100644 (file)
@@ -10,7 +10,7 @@
 
 use base_db::{AnchoredPathBuf, FileId};
 use rustc_hash::FxHashMap;
-use stdx::assert_never;
+use stdx::never;
 use text_edit::TextEdit;
 
 #[derive(Default, Debug, Clone)]
@@ -40,10 +40,7 @@ pub fn from_text_edit(file_id: FileId, edit: TextEdit) -> Self {
     pub fn insert_source_edit(&mut self, file_id: FileId, edit: TextEdit) {
         match self.source_file_edits.entry(file_id) {
             Entry::Occupied(mut entry) => {
-                assert_never!(
-                    entry.get_mut().union(edit).is_err(),
-                    "overlapping edits for same file"
-                );
+                never!(entry.get_mut().union(edit).is_err(), "overlapping edits for same file");
             }
             Entry::Vacant(entry) => {
                 entry.insert(edit);
index 268c009424fc3da2d95214eefe2e7a7248154bd0..82ea76666a79394eb0a0e090c6ff9cff7f168a12 100644 (file)
@@ -37,6 +37,7 @@ lsp-server = "0.5.0"
 tracing = "0.1"
 tracing-subscriber = { version = "0.2", default-features = false, features = ["env-filter", "registry"] }
 tracing-tree = { version = "0.1.4" }
+always-assert = "0.1"
 
 stdx = { path = "../stdx", version = "0.0.0" }
 flycheck = { path = "../flycheck", version = "0.0.0" }
@@ -72,3 +73,4 @@ tt = { path = "../tt" }
 
 [features]
 jemalloc = ["jemallocator", "profile/jemalloc"]
+force-always-assert = ["always-assert/force"]
index 1d6e5478bc4d38969dd64cb20edc45747d1556e6..bee2eedbccb3b63133516b148f83834104d5a7cc 100644 (file)
@@ -75,15 +75,6 @@ fn setup_logging(log_file: Option<PathBuf>) -> Result<()> {
 
     profile::init();
 
-    if !cfg!(debug_assertions) {
-        stdx::set_assert_hook(|loc, args| {
-            if env::var("RA_PROFILE").is_ok() {
-                panic!("assertion failed at {}: {}", loc, args)
-            }
-            log::error!("assertion failed at {}: {}", loc, args)
-        });
-    }
-
     Ok(())
 }
 
index c47e8d0a86bd9061c1a050ab907b470a9e1fc174..5866c0a280b333d9169d34393c9c50ac51b1314c 100644 (file)
@@ -11,6 +11,7 @@ doctest = false
 
 [dependencies]
 backtrace = { version = "0.3.44", optional = true }
+always-assert = { version = "0.1.1", features = ["log"] }
 # Think twice before adding anything here
 
 [features]
index d42817078d799faff13a6ecb986694853846dd99..d26be4853449c993f050466200a96d15eec58ee6 100644 (file)
@@ -4,7 +4,7 @@
 mod macros;
 pub mod panic_context;
 
-pub use crate::macros::{on_assert_failure, set_assert_hook};
+pub use always_assert::{always, never};
 
 #[inline(always)]
 pub fn is_ci() -> bool {
index 4f5c6100d2a860b085239e263f27750bafbee8ea..d91fc690cb517fbc3de0058c3acb8d4c1dd2d382 100644 (file)
@@ -1,9 +1,5 @@
 //! Convenience macros.
 
-use std::{
-    fmt, mem, panic,
-    sync::atomic::{AtomicUsize, Ordering::SeqCst},
-};
 #[macro_export]
 macro_rules! eprintln {
     ($($tt:tt)*) => {{
@@ -49,50 +45,3 @@ fn from(it: $sub_variant) -> $enum {
         )*
     }
 }
-
-/// A version of `assert!` macro which allows to handle an assertion failure.
-///
-/// In release mode, it returns the condition and logs an error.
-///
-/// ```
-/// if assert_never!(impossible) {
-///     // Heh, this shouldn't have happened, but lets try to soldier on...
-///     return None;
-/// }
-/// ```
-///
-/// Rust analyzer is a long-running process, and crashing really isn't an option.
-///
-/// Shamelessly stolen from: https://www.sqlite.org/assert.html
-#[macro_export]
-macro_rules! assert_never {
-    ($cond:expr) => { $crate::assert_never!($cond, "") };
-    ($cond:expr, $($fmt:tt)*) => {{
-        let value = $cond;
-        if value {
-            $crate::on_assert_failure(
-                format_args!($($fmt)*)
-            );
-        }
-        value
-    }};
-}
-
-type AssertHook = fn(&panic::Location<'_>, fmt::Arguments<'_>);
-static HOOK: AtomicUsize = AtomicUsize::new(0);
-
-pub fn set_assert_hook(hook: AssertHook) {
-    HOOK.store(hook as usize, SeqCst);
-}
-
-#[cold]
-#[track_caller]
-pub fn on_assert_failure(args: fmt::Arguments) {
-    let hook: usize = HOOK.load(SeqCst);
-    if hook == 0 {
-        panic!("\n  assertion failed: {}\n", args);
-    }
-
-    let hook: AssertHook = unsafe { mem::transmute::<usize, AssertHook>(hook) };
-    hook(panic::Location::caller(), args)
-}
index 6dc6868c2ccfdc18bb8c1abbae1aaa8e0bc2023a..0c5e2ad33cb0efb327ae8264cf70dce97e637dd3 100644 (file)
@@ -232,7 +232,7 @@ if idx >= len {
 ## Assertions
 
 Assert liberally.
-Prefer `stdx::assert_never!` to standard `assert!`.
+Prefer `stdx::never!` to standard `assert!`.
 
 ## Getters & Setters
 
index 202c74426689d9684306ea80b9efd8343ceaf678..81b9956b8f03d2e3fe1a5e968deea8dc63304907 100644 (file)
@@ -180,7 +180,7 @@ fn install_server(opts: ServerOpt) -> Result<()> {
         Malloc::Jemalloc => &["--features", "jemalloc"],
     };
 
-    let cmd = cmd!("cargo install --path crates/rust-analyzer --locked --force {features...}");
+    let cmd = cmd!("cargo install --path crates/rust-analyzer --locked --force --features force-always-assert {features...}");
     let res = cmd.run();
 
     if res.is_err() && old_rust {