Clearer error on importing both gpui and gpui2

Conrad Irwin created

Change summary

crates/gpui/src/platform/mac/window.rs  |  1 +
crates/gpui2/src/platform/mac/window.rs |  2 ++
crates/util/src/util.rs                 | 15 +++++++++++++++
3 files changed, 18 insertions(+)

Detailed changes

crates/gpui/src/platform/mac/window.rs 🔗

@@ -82,6 +82,7 @@ const NSWindowAnimationBehaviorUtilityWindow: NSInteger = 4;
 
 #[ctor]
 unsafe fn build_classes() {
+    ::util::gpui1_loaded();
     WINDOW_CLASS = build_window_class("GPUIWindow", class!(NSWindow));
     PANEL_CLASS = build_window_class("GPUIPanel", class!(NSPanel));
     VIEW_CLASS = {

crates/gpui2/src/platform/mac/window.rs 🔗

@@ -81,6 +81,8 @@ const NSDragOperationCopy: NSDragOperation = 1;
 
 #[ctor]
 unsafe fn build_classes() {
+    ::util::gpui2_loaded();
+
     WINDOW_CLASS = build_window_class("GPUIWindow", class!(NSWindow));
     PANEL_CLASS = build_window_class("GPUIPanel", class!(NSPanel));
     VIEW_CLASS = {

crates/util/src/util.rs 🔗

@@ -13,6 +13,7 @@ use std::{
     ops::{AddAssign, Range, RangeInclusive},
     panic::Location,
     pin::Pin,
+    sync::atomic::AtomicU32,
     task::{Context, Poll},
 };
 
@@ -410,6 +411,20 @@ impl<T: Ord + Clone> RangeExt<T> for RangeInclusive<T> {
     }
 }
 
+static GPUI_LOADED: AtomicU32 = AtomicU32::new(0);
+
+pub fn gpui2_loaded() {
+    if GPUI_LOADED.fetch_add(2, std::sync::atomic::Ordering::SeqCst) != 0 {
+        panic!("=========\nYou are loading both GPUI1 and GPUI2 in the same build!\nFix Your Dependencies with cargo tree!\n=========")
+    }
+}
+
+pub fn gpui1_loaded() {
+    if GPUI_LOADED.fetch_add(1, std::sync::atomic::Ordering::SeqCst) != 0 {
+        panic!("=========\nYou are loading both GPUI1 and GPUI2 in the same build!\nFix Your Dependencies with cargo tree!\n=========")
+    }
+}
+
 #[cfg(test)]
 mod tests {
     use super::*;