mod macros;
mod display_source_code;
-use std::sync::Arc;
+use std::{env, sync::Arc};
use base_db::{fixture::WithFixture, FileRange, SourceDatabase, SourceDatabaseExt};
use expect::Expect;
AssocItemId, DefWithBodyId, LocalModuleId, Lookup, ModuleDefId,
};
use hir_expand::{db::AstDatabase, InFile};
-use stdx::format_to;
+use stdx::{format_to, RacyFlag};
use syntax::{
algo,
ast::{self, AstNode},
SyntaxNode,
};
+use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry};
+use tracing_tree::HierarchicalLayer;
use crate::{
db::HirDatabase, display::HirDisplay, infer::TypeMismatch, test_db::TestDB, InferenceResult, Ty,
// against snapshots of the expected results using expect. Use
// `env UPDATE_EXPECT=1 cargo test -p hir_ty` to update the snapshots.
-fn setup_tracing() -> tracing::subscriber::DefaultGuard {
- use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry};
- use tracing_tree::HierarchicalLayer;
+fn setup_tracing() -> Option<tracing::subscriber::DefaultGuard> {
+ static ENABLE: RacyFlag = RacyFlag::new();
+ if !ENABLE.get(|| env::var("CHALK_DEBUG").is_ok()) {
+ return None;
+ }
+
let filter = EnvFilter::from_env("CHALK_DEBUG");
let layer = HierarchicalLayer::default()
.with_indent_lines(true)
.with_indent_amount(2)
.with_writer(std::io::stderr);
let subscriber = Registry::default().with(filter).with(layer);
- tracing::subscriber::set_default(subscriber)
+ Some(tracing::subscriber::set_default(subscriber))
}
fn check_types(ra_fixture: &str) {
//! Missing batteries for standard libraries.
-use std::time::Instant;
+use std::{
+ sync::atomic::{AtomicUsize, Ordering},
+ time::Instant,
+};
mod macros;
left
}
+pub struct RacyFlag(AtomicUsize);
+
+impl RacyFlag {
+ pub const fn new() -> RacyFlag {
+ RacyFlag(AtomicUsize::new(0))
+ }
+
+ pub fn get(&self, init: impl FnMut() -> bool) -> bool {
+ let mut init = Some(init);
+ self.get_impl(&mut || init.take().map_or(false, |mut f| f()))
+ }
+
+ fn get_impl(&self, init: &mut dyn FnMut() -> bool) -> bool {
+ match self.0.load(Ordering::Relaxed) {
+ 0 => false,
+ 1 => true,
+ _ => {
+ let res = init();
+ self.0.store(if res { 1 } else { 0 }, Ordering::Relaxed);
+ res
+ }
+ }
+ }
+}
+
#[cfg(test)]
mod tests {
use super::*;