fix bracket ranges failing test

Kay Simmons created

Change summary

crates/language/src/buffer.rs       | 10 ++++++++--
crates/language/src/buffer_tests.rs |  7 ++++---
crates/util/Cargo.toml              |  2 +-
crates/util/src/util.rs             |  0 
crates/workspace/src/workspace.rs   | 19 ++++++++++++++++++-
5 files changed, 31 insertions(+), 7 deletions(-)

Detailed changes

crates/language/src/buffer.rs 🔗

@@ -2346,7 +2346,7 @@ impl BufferSnapshot {
         Some(items)
     }
 
-    /// Returns bracket range pairs overlapping `range`
+    /// Returns bracket range pairs overlapping or adjacent to `range`
     pub fn bracket_ranges<'a, T: ToOffset>(
         &'a self,
         range: Range<T>,
@@ -2355,7 +2355,7 @@ impl BufferSnapshot {
         let range = range.start.to_offset(self).saturating_sub(1)
             ..self.len().min(range.end.to_offset(self) + 1);
 
-        let mut matches = self.syntax.matches(range, &self.text, |grammar| {
+        let mut matches = self.syntax.matches(range.clone(), &self.text, |grammar| {
             grammar.brackets_config.as_ref().map(|c| &c.query)
         });
         let configs = matches
@@ -2380,6 +2380,12 @@ impl BufferSnapshot {
                 matches.advance();
 
                 let Some((open, close)) = open.zip(close) else { continue };
+
+                let bracket_range = open.start..=close.end;
+                if !bracket_range.contains(&range.start) && !bracket_range.contains(&range.end) {
+                    continue;
+                }
+
                 return Some((open, close));
             }
             None

crates/language/src/buffer_tests.rs 🔗

@@ -578,7 +578,7 @@ async fn test_symbols_containing(cx: &mut gpui::TestAppContext) {
 #[gpui::test]
 fn test_enclosing_bracket_ranges(cx: &mut MutableAppContext) {
     let mut assert = |selection_text, range_markers| {
-        assert_enclosing_bracket_pairs(selection_text, range_markers, rust_lang(), cx)
+        assert_bracket_pairs(selection_text, range_markers, rust_lang(), cx)
     };
 
     assert(
@@ -696,7 +696,7 @@ fn test_enclosing_bracket_ranges_where_brackets_are_not_outermost_children(
     cx: &mut MutableAppContext,
 ) {
     let mut assert = |selection_text, bracket_pair_texts| {
-        assert_enclosing_bracket_pairs(selection_text, bracket_pair_texts, javascript_lang(), cx)
+        assert_bracket_pairs(selection_text, bracket_pair_texts, javascript_lang(), cx)
     };
 
     assert(
@@ -710,6 +710,7 @@ fn test_enclosing_bracket_ranges_where_brackets_are_not_outermost_children(
         }"}],
     );
 
+    eprintln!("-----------------------");
     // Regression test: even though the parent node of the parentheses (the for loop) does
     // intersect the given range, the parentheses themselves do not contain the range, so
     // they should not be returned. Only the curly braces contain the range.
@@ -2047,7 +2048,7 @@ fn get_tree_sexp(buffer: &ModelHandle<Buffer>, cx: &gpui::TestAppContext) -> Str
 }
 
 // Assert that the enclosing bracket ranges around the selection match the pairs indicated by the marked text in `range_markers`
-fn assert_enclosing_bracket_pairs(
+fn assert_bracket_pairs(
     selection_text: &'static str,
     bracket_pair_texts: Vec<&'static str>,
     language: Language,

crates/util/Cargo.toml 🔗

@@ -5,6 +5,7 @@ edition = "2021"
 publish = false
 
 [lib]
+path = "src/util.rs"
 doctest = false
 
 [features]
@@ -22,7 +23,6 @@ serde_json = { version = "1.0", features = ["preserve_order"], optional = true }
 git2 = { version = "0.15", default-features = false, optional = true }
 dirs = "3.0"
 
-
 [dev-dependencies]
 tempdir = { version = "0.3.7" }
 serde_json = { version = "1.0", features = ["preserve_order"] }

crates/workspace/src/workspace.rs 🔗

@@ -101,6 +101,7 @@ actions!(
         NewTerminal,
         NewSearch,
         Feedback,
+        Restart
     ]
 );
 
@@ -1329,7 +1330,19 @@ impl Workspace {
         focus_item: bool,
         cx: &mut ViewContext<Self>,
     ) -> Task<Result<Box<dyn ItemHandle>, anyhow::Error>> {
-        let pane = pane.unwrap_or_else(|| self.active_pane().downgrade());
+        let pane = pane.unwrap_or_else(|| {
+            if !self.dock_active() {
+                self.active_pane().downgrade()
+            } else {
+                self.last_active_center_pane.clone().unwrap_or_else(|| {
+                    self.panes
+                        .first()
+                        .expect("There must be an active pane")
+                        .downgrade()
+                })
+            }
+        });
+
         let task = self.load_path(path.into(), cx);
         cx.spawn(|this, mut cx| async move {
             let (project_entry_id, build_item) = task.await?;
@@ -1636,6 +1649,10 @@ impl Workspace {
         self.dock.pane()
     }
 
+    fn dock_active(&self) -> bool {
+        &self.active_pane == self.dock.pane()
+    }
+
     fn project_remote_id_changed(&mut self, remote_id: Option<u64>, cx: &mut ViewContext<Self>) {
         if let Some(remote_id) = remote_id {
             self.remote_entity_subscription =