@@ -4898,8 +4898,10 @@ impl Editor {
.scope_context(Some(CharScopeContext::LinkedEdit));
classifier.is_word(char)
});
+ let is_dot = text.as_ref() == ".";
+ let should_apply_linked_edit = is_word_char || is_dot;
- if is_word_char {
+ if should_apply_linked_edit {
let anchor_range = start_anchor.text_anchor..anchor.text_anchor;
linked_edits.push(&self, anchor_range, text.clone(), cx);
} else {
@@ -26623,6 +26623,48 @@ async fn test_linked_edits_on_typing_punctuation(cx: &mut TestAppContext) {
cx.assert_editor_state("<Animated.Vห></Animated.V>");
}
+#[gpui::test]
+async fn test_linked_edits_on_typing_dot_without_language_override(cx: &mut TestAppContext) {
+ init_test(cx, |_| {});
+
+ let mut cx = EditorTestContext::new(cx).await;
+ let language = Arc::new(Language::new(
+ LanguageConfig {
+ name: "HTML".into(),
+ matcher: LanguageMatcher {
+ path_suffixes: vec!["html".to_string()],
+ ..LanguageMatcher::default()
+ },
+ brackets: BracketPairConfig {
+ pairs: vec![BracketPair {
+ start: "<".into(),
+ end: ">".into(),
+ close: true,
+ ..Default::default()
+ }],
+ ..Default::default()
+ },
+ ..Default::default()
+ },
+ Some(tree_sitter_html::LANGUAGE.into()),
+ ));
+ cx.update_buffer(|buffer, cx| buffer.set_language(Some(language), cx));
+
+ cx.set_state("<Tableห></Table>");
+ cx.update_editor(|editor, _, cx| {
+ set_linked_edit_ranges(
+ (Point::new(0, 1), Point::new(0, 6)),
+ (Point::new(0, 9), Point::new(0, 14)),
+ editor,
+ cx,
+ );
+ });
+ cx.update_editor(|editor, window, cx| {
+ editor.handle_input(".", window, cx);
+ });
+ cx.assert_editor_state("<Table.ห></Table.>");
+}
+
#[gpui::test]
async fn test_invisible_worktree_servers(cx: &mut TestAppContext) {
init_test(cx, |_| {});