pub mod components; mod jupyter_settings; pub mod kernels; pub mod notebook; mod outputs; mod repl_editor; mod repl_sessions_ui; mod repl_settings; mod repl_store; mod session; use std::{sync::Arc, time::Duration}; use async_dispatcher::{Dispatcher, Runnable, set_dispatcher}; use gpui::{App, PlatformDispatcher, Priority, RunnableMeta}; use project::Fs; pub use runtimelib::ExecutionState; pub use crate::jupyter_settings::JupyterSettings; pub use crate::kernels::{Kernel, KernelSpecification, KernelStatus, PythonEnvKernelSpecification}; pub use crate::repl_editor::*; pub use crate::repl_sessions_ui::{ ClearCurrentOutput, ClearOutputs, Interrupt, ReplSessionsPage, Restart, Run, Sessions, Shutdown, }; pub use crate::repl_settings::ReplSettings; pub use crate::repl_store::ReplStore; pub use crate::session::Session; pub const KERNEL_DOCS_URL: &str = "https://zed.dev/docs/repl#changing-kernels"; pub fn init(fs: Arc, cx: &mut App) { set_dispatcher(zed_dispatcher(cx)); repl_sessions_ui::init(cx); ReplStore::init(fs, cx); } fn zed_dispatcher(cx: &mut App) -> impl Dispatcher { struct ZedDispatcher { dispatcher: Arc, } // PlatformDispatcher is _super_ close to the same interface we put in // async-dispatcher, except for the task label in dispatch. Later we should // just make that consistent so we have this dispatcher ready to go for // other crates in Zed. impl Dispatcher for ZedDispatcher { #[track_caller] fn dispatch(&self, runnable: Runnable) { let location = core::panic::Location::caller(); let (wrapper, task) = async_task::Builder::new() .metadata(RunnableMeta { location }) .spawn(|_| async move { runnable.run() }, { let dispatcher = self.dispatcher.clone(); move |r| dispatcher.dispatch(r, Priority::default()) }); wrapper.schedule(); task.detach(); } #[track_caller] fn dispatch_after(&self, duration: Duration, runnable: Runnable) { let location = core::panic::Location::caller(); let (wrapper, task) = async_task::Builder::new() .metadata(RunnableMeta { location }) .spawn(|_| async move { runnable.run() }, { let dispatcher = self.dispatcher.clone(); move |r| dispatcher.dispatch_after(duration, r) }); wrapper.schedule(); task.detach(); } } ZedDispatcher { dispatcher: cx.background_executor().dispatcher().clone(), } }