diff --git a/crates/assistant/src/inline_assistant.rs b/crates/assistant/src/inline_assistant.rs index aa67347c1c2d7cb677edef7e9a7a848683a0f268..35b8c76866687063ed8ae3c74e58d4e3d9c22781 100644 --- a/crates/assistant/src/inline_assistant.rs +++ b/crates/assistant/src/inline_assistant.rs @@ -232,7 +232,7 @@ impl InlineAssistant { ) { let (snapshot, initial_selections) = editor.update(cx, |editor, cx| { ( - editor.buffer().read(cx).snapshot(cx), + editor.snapshot(window, cx), editor.selections.all::(cx), ) }); @@ -246,7 +246,37 @@ impl InlineAssistant { if selection.end.column == 0 { selection.end.row -= 1; } - selection.end.column = snapshot.line_len(MultiBufferRow(selection.end.row)); + selection.end.column = snapshot + .buffer_snapshot + .line_len(MultiBufferRow(selection.end.row)); + } else if let Some(fold) = + snapshot.crease_for_buffer_row(MultiBufferRow(selection.end.row)) + { + selection.start = fold.range().start; + selection.end = fold.range().end; + if MultiBufferRow(selection.end.row) < snapshot.buffer_snapshot.max_row() { + let chars = snapshot + .buffer_snapshot + .chars_at(Point::new(selection.end.row + 1, 0)); + + for c in chars { + if c == '\n' { + break; + } + if c.is_whitespace() { + continue; + } + if snapshot + .language_at(selection.end) + .is_some_and(|language| language.config().brackets.is_closing_brace(c)) + { + selection.end.row += 1; + selection.end.column = snapshot + .buffer_snapshot + .line_len(MultiBufferRow(selection.end.row)); + } + } + } } if let Some(prev_selection) = selections.last_mut() { @@ -262,6 +292,7 @@ impl InlineAssistant { } selections.push(selection); } + let snapshot = &snapshot.buffer_snapshot; let newest_selection = newest_selection.unwrap(); let mut codegen_ranges = Vec::new(); diff --git a/crates/assistant2/src/inline_assistant.rs b/crates/assistant2/src/inline_assistant.rs index 9952540d6be019ea724f726c0c617e8ee243a8dd..e31fa168b946f91e7ddf026e0f02587db9438e08 100644 --- a/crates/assistant2/src/inline_assistant.rs +++ b/crates/assistant2/src/inline_assistant.rs @@ -324,7 +324,7 @@ impl InlineAssistant { ) { let (snapshot, initial_selections) = editor.update(cx, |editor, cx| { ( - editor.buffer().read(cx).snapshot(cx), + editor.snapshot(window, cx), editor.selections.all::(cx), ) }); @@ -338,7 +338,37 @@ impl InlineAssistant { if selection.end.column == 0 { selection.end.row -= 1; } - selection.end.column = snapshot.line_len(MultiBufferRow(selection.end.row)); + selection.end.column = snapshot + .buffer_snapshot + .line_len(MultiBufferRow(selection.end.row)); + } else if let Some(fold) = + snapshot.crease_for_buffer_row(MultiBufferRow(selection.end.row)) + { + selection.start = fold.range().start; + selection.end = fold.range().end; + if MultiBufferRow(selection.end.row) < snapshot.buffer_snapshot.max_row() { + let chars = snapshot + .buffer_snapshot + .chars_at(Point::new(selection.end.row + 1, 0)); + + for c in chars { + if c == '\n' { + break; + } + if c.is_whitespace() { + continue; + } + if snapshot + .language_at(selection.end) + .is_some_and(|language| language.config().brackets.is_closing_brace(c)) + { + selection.end.row += 1; + selection.end.column = snapshot + .buffer_snapshot + .line_len(MultiBufferRow(selection.end.row)); + } + } + } } if let Some(prev_selection) = selections.last_mut() { @@ -354,6 +384,7 @@ impl InlineAssistant { } selections.push(selection); } + let snapshot = &snapshot.buffer_snapshot; let newest_selection = newest_selection.unwrap(); let mut codegen_ranges = Vec::new(); diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 0a5b24626ae18120b60c1b38664ea28c1a9cac18..3af382edea1ccc9a08f4d9bd79a3b8b8d4de08c9 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -887,6 +887,12 @@ pub struct BracketPairConfig { pub disabled_scopes_by_bracket_ix: Vec>, } +impl BracketPairConfig { + pub fn is_closing_brace(&self, c: char) -> bool { + self.pairs.iter().any(|pair| pair.end.starts_with(c)) + } +} + fn bracket_pair_config_json_schema(gen: &mut SchemaGenerator) -> Schema { Option::>::json_schema(gen) }