Quote fixes (#19765)

Conrad Irwin and Kurt Wolf created

Closes #19372

Release Notes:

- Fixed autoclosing quotes when the string is already open.
- Added autoclosing of rust multiline strings

---------

Co-authored-by: Kurt Wolf <kurtwolfbuilds@gmail.com>

Change summary

crates/editor/src/editor.rs           | 15 +++++++++++++++
crates/languages/src/rust/config.toml |  3 +++
2 files changed, 18 insertions(+)

Detailed changes

crates/editor/src/editor.rs 🔗

@@ -3282,10 +3282,25 @@ impl Editor {
                                         &bracket_pair.start[..prefix_len],
                                     ));
 
+                            let is_closing_quote = if bracket_pair.end == bracket_pair.start
+                                && bracket_pair.start.len() == 1
+                            {
+                                let target = bracket_pair.start.chars().next().unwrap();
+                                let current_line_count = snapshot
+                                    .reversed_chars_at(selection.start)
+                                    .take_while(|&c| c != '\n')
+                                    .filter(|&c| c == target)
+                                    .count();
+                                current_line_count % 2 == 1
+                            } else {
+                                false
+                            };
+
                             if autoclose
                                 && bracket_pair.close
                                 && following_text_allows_autoclose
                                 && preceding_text_matches_prefix
+                                && !is_closing_quote
                             {
                                 let anchor = snapshot.anchor_before(selection.end);
                                 new_selections.push((selection.map(|_| anchor), text.len()));

crates/languages/src/rust/config.toml 🔗

@@ -5,6 +5,9 @@ line_comments = ["// ", "/// ", "//! "]
 autoclose_before = ";:.,=}])>"
 brackets = [
     { start = "{", end = "}", close = true, newline = true },
+    { start = "r#\"", end = "\"#", close = true, newline = true },
+    { start = "r##\"", end = "\"##", close = true, newline = true },
+    { start = "r###\"", end = "\"###", close = true, newline = true },
     { start = "[", end = "]", close = true, newline = true },
     { start = "(", end = ")", close = true, newline = true },
     { start = "<", end = ">", close = false, newline = true, not_in = ["string", "comment"] },