assistant panel: Fix copying code when trailing newline is missing (#18067)

Thorsten Ball and Bennet created

Follow-up to #17853.

Apparently tree-sitter-md extends the range of the content node to
include the backticks when there is no newline.

Release Notes:

- N/A

Co-authored-by: Bennet <bennet@zed.dev>

Change summary

crates/assistant/src/assistant_panel.rs | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)

Detailed changes

crates/assistant/src/assistant_panel.rs 🔗

@@ -3110,6 +3110,8 @@ impl ContextEditor {
         context_editor_view: &View<ContextEditor>,
         cx: &mut ViewContext<Workspace>,
     ) -> Option<(String, bool)> {
+        const CODE_FENCE_DELIMITER: &'static str = "```";
+
         let context_editor = context_editor_view.read(cx).editor.read(cx);
 
         if context_editor.selections.newest::<Point>(cx).is_empty() {
@@ -3120,10 +3122,17 @@ impl ContextEditor {
             let offset = snapshot.point_to_offset(head);
 
             let surrounding_code_block_range = find_surrounding_code_block(snapshot, offset)?;
-            let text = snapshot
+            let mut text = snapshot
                 .text_for_range(surrounding_code_block_range)
                 .collect::<String>();
 
+            // If there is no newline trailing the closing three-backticks, then
+            // tree-sitter-md extends the range of the content node to include
+            // the backticks.
+            if text.ends_with(CODE_FENCE_DELIMITER) {
+                text.drain((text.len() - CODE_FENCE_DELIMITER.len())..);
+            }
+
             (!text.is_empty()).then_some((text, true))
         } else {
             let anchor = context_editor.selections.newest_anchor();