repl: Do some cleanup (#14982)

Marshall Bowers created

This PR cleans up the REPL implementation a bit.

Release Notes:

- N/A

Change summary

crates/repl/src/outputs.rs     |  8 ++--
crates/repl/src/repl_editor.rs | 52 ++++++++++++++++++-----------------
crates/repl/src/session.rs     | 34 +++++++---------------
3 files changed, 42 insertions(+), 52 deletions(-)

Detailed changes

crates/repl/src/outputs.rs 🔗

@@ -11,13 +11,13 @@ use settings::Settings;
 use theme::ThemeSettings;
 use ui::{div, prelude::*, v_flex, IntoElement, Styled, ViewContext};
 
-// Given these outputs are destined for the editor with the block decorations API, all of them must report
-// how many lines they will take up in the editor.
+/// Given these outputs are destined for the editor with the block decorations API, all of them must report
+/// how many lines they will take up in the editor.
 pub trait LineHeight: Sized {
     fn num_lines(&self, cx: &mut WindowContext) -> u8;
 }
 
-// When deciding what to render from a collection of mediatypes, we need to rank them in order of importance
+/// When deciding what to render from a collection of mediatypes, we need to rank them in order of importance
 fn rank_mime_type(mimetype: &MimeType) -> usize {
     match mimetype {
         MimeType::DataTable(_) => 6,
@@ -264,7 +264,7 @@ impl LineHeight for TableView {
     }
 }
 
-// Userspace error from the kernel
+/// Userspace error from the kernel
 pub struct ErrorView {
     pub ename: String,
     pub evalue: String,

crates/repl/src/repl_editor.rs 🔗

@@ -19,9 +19,8 @@ pub fn run(editor: WeakView<Editor>, cx: &mut WindowContext) -> Result<()> {
         return Ok(());
     }
 
-    let (selected_text, language, anchor_range) = match snippet(editor.clone(), cx) {
-        Some(snippet) => snippet,
-        None => return Ok(()),
+    let Some((selected_text, language, anchor_range)) = snippet(editor.clone(), cx) else {
+        return Ok(());
     };
 
     let entity_id = editor.entity_id();
@@ -83,10 +82,8 @@ pub fn session(editor: WeakView<Editor>, cx: &mut AppContext) -> SessionSupport
         return SessionSupport::ActiveSession(session);
     };
 
-    let language = get_language(editor, cx);
-    let language = match language {
-        Some(language) => language,
-        None => return SessionSupport::Unsupported,
+    let Some(language) = get_language(editor, cx) else {
+        return SessionSupport::Unsupported;
     };
     let kernelspec = store.update(cx, |store, cx| store.kernelspec(&language, cx));
 
@@ -102,34 +99,39 @@ pub fn session(editor: WeakView<Editor>, cx: &mut AppContext) -> SessionSupport
 pub fn clear_outputs(editor: WeakView<Editor>, cx: &mut WindowContext) {
     let store = ReplStore::global(cx);
     let entity_id = editor.entity_id();
-    if let Some(session) = store.read(cx).get_session(entity_id).cloned() {
-        session.update(cx, |session, cx| {
-            session.clear_outputs(cx);
-            cx.notify();
-        });
-    }
+    let Some(session) = store.read(cx).get_session(entity_id).cloned() else {
+        return;
+    };
+    session.update(cx, |session, cx| {
+        session.clear_outputs(cx);
+        cx.notify();
+    });
 }
 
 pub fn interrupt(editor: WeakView<Editor>, cx: &mut WindowContext) {
     let store = ReplStore::global(cx);
     let entity_id = editor.entity_id();
-    if let Some(session) = store.read(cx).get_session(entity_id).cloned() {
-        session.update(cx, |session, cx| {
-            session.interrupt(cx);
-            cx.notify();
-        });
-    }
+    let Some(session) = store.read(cx).get_session(entity_id).cloned() else {
+        return;
+    };
+
+    session.update(cx, |session, cx| {
+        session.interrupt(cx);
+        cx.notify();
+    });
 }
 
 pub fn shutdown(editor: WeakView<Editor>, cx: &mut WindowContext) {
     let store = ReplStore::global(cx);
     let entity_id = editor.entity_id();
-    if let Some(session) = store.read(cx).get_session(entity_id).cloned() {
-        session.update(cx, |session, cx| {
-            session.shutdown(cx);
-            cx.notify();
-        });
-    }
+    let Some(session) = store.read(cx).get_session(entity_id).cloned() else {
+        return;
+    };
+
+    session.update(cx, |session, cx| {
+        session.shutdown(cx);
+        cx.notify();
+    });
 }
 
 fn snippet(

crates/repl/src/session.rs 🔗

@@ -22,15 +22,15 @@ use runtimelib::{
     ExecuteRequest, InterruptRequest, JupyterMessage, JupyterMessageContent, ShutdownRequest,
 };
 use settings::Settings as _;
-use std::{env::temp_dir, ops::Range, path::PathBuf, sync::Arc, time::Duration};
+use std::{env::temp_dir, ops::Range, sync::Arc, time::Duration};
 use theme::{ActiveTheme, ThemeSettings};
 use ui::{h_flex, prelude::*, v_flex, ButtonLike, ButtonStyle, IconButtonShape, Label, Tooltip};
 
 pub struct Session {
-    pub editor: WeakView<Editor>,
+    editor: WeakView<Editor>,
     pub kernel: Kernel,
     blocks: HashMap<String, EditorBlock>,
-    pub messaging_task: Task<()>,
+    messaging_task: Task<()>,
     pub kernel_specification: KernelSpecification,
     _buffer_subscription: Subscription,
 }
@@ -200,17 +200,6 @@ impl EditorBlock {
 }
 
 impl Session {
-    pub fn working_directory(editor: WeakView<Editor>, cx: &WindowContext) -> PathBuf {
-        if let Some(working_directory) = editor
-            .upgrade()
-            .and_then(|editor| editor.read(cx).working_directory(cx))
-        {
-            working_directory
-        } else {
-            temp_dir()
-        }
-    }
-
     pub fn new(
         editor: WeakView<Editor>,
         fs: Arc<dyn Fs>,
@@ -218,11 +207,14 @@ impl Session {
         cx: &mut ViewContext<Self>,
     ) -> Self {
         let entity_id = editor.entity_id();
-
+        let working_directory = editor
+            .upgrade()
+            .and_then(|editor| editor.read(cx).working_directory(cx))
+            .unwrap_or_else(temp_dir);
         let kernel = RunningKernel::new(
             kernel_specification.clone(),
             entity_id,
-            Self::working_directory(editor.clone(), cx),
+            working_directory,
             fs.clone(),
             cx,
         );
@@ -384,9 +376,7 @@ impl Session {
     }
 
     pub fn execute(&mut self, code: &str, anchor_range: Range<Anchor>, cx: &mut ViewContext<Self>) {
-        let editor = if let Some(editor) = self.editor.upgrade() {
-            editor
-        } else {
+        let Some(editor) = self.editor.upgrade() else {
             return;
         };
 
@@ -450,11 +440,9 @@ impl Session {
                 }
             });
 
-        let editor_block = if let Ok(editor_block) =
+        let Ok(editor_block) =
             EditorBlock::new(self.editor.clone(), anchor_range, status, on_close, cx)
-        {
-            editor_block
-        } else {
+        else {
             return;
         };