Revert "inline completion: Add syntax highlighting for edit prediction (#23361)" (#23829)

This reverts commit 3dee32c43d.

Release Notes:

- N/A
This commit is contained in:
Bennet Bo Fenner 2025-01-29 11:32:18 +01:00 committed by GitHub
parent 46f45464be
commit 9bf5e55233
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 472 additions and 780 deletions

View file

@ -96,9 +96,8 @@ use itertools::Itertools;
use language::{
language_settings::{self, all_language_settings, language_settings, InlayHintSettings},
markdown, point_from_lsp, AutoindentMode, BracketPair, Buffer, Capability, CharKind, CodeLabel,
CursorShape, Diagnostic, Documentation, EditPreview, HighlightedEdits, IndentKind, IndentSize,
Language, OffsetRangeExt, Point, Selection, SelectionGoal, TextObject, TransactionId,
TreeSitterOptions,
CursorShape, Diagnostic, Documentation, IndentKind, IndentSize, Language, OffsetRangeExt,
Point, Selection, SelectionGoal, TextObject, TransactionId, TreeSitterOptions,
};
use language::{point_to_lsp, BufferRow, CharClassifier, Runnable, RunnableRange};
use linked_editing_ranges::refresh_linked_ranges;
@ -117,7 +116,6 @@ use lsp::{
LanguageServerId, LanguageServerName,
};
use language::BufferSnapshot;
use movement::TextLayoutDetails;
pub use multi_buffer::{
Anchor, AnchorRangeExt, ExcerptId, ExcerptRange, MultiBuffer, MultiBufferSnapshot, RowInfo,
@ -488,7 +486,10 @@ impl InlineCompletionMenuHint {
#[derive(Clone, Debug)]
enum InlineCompletionText {
Move(SharedString),
Edit(HighlightedEdits),
Edit {
text: SharedString,
highlights: Vec<(Range<usize>, HighlightStyle)>,
},
}
pub(crate) enum EditDisplayMode {
@ -500,9 +501,7 @@ pub(crate) enum EditDisplayMode {
enum InlineCompletion {
Edit {
edits: Vec<(Range<Anchor>, String)>,
edit_preview: Option<EditPreview>,
display_mode: EditDisplayMode,
snapshot: BufferSnapshot,
},
Move(Anchor),
}
@ -4848,7 +4847,10 @@ impl Editor {
selections.select_anchor_ranges([position..position]);
});
}
InlineCompletion::Edit { edits, .. } => {
InlineCompletion::Edit {
edits,
display_mode: _,
} => {
if let Some(provider) = self.inline_completion_provider() {
provider.accept(cx);
}
@ -4896,7 +4898,10 @@ impl Editor {
selections.select_anchor_ranges([position..position]);
});
}
InlineCompletion::Edit { edits, .. } => {
InlineCompletion::Edit {
edits,
display_mode: _,
} => {
// Find an insertion that starts at the cursor position.
let snapshot = self.buffer.read(cx).snapshot(cx);
let cursor_offset = self.selections.newest::<usize>(cx).head();
@ -5035,8 +5040,8 @@ impl Editor {
let (buffer, cursor_buffer_position) =
self.buffer.read(cx).text_anchor_for_position(cursor, cx)?;
let inline_completion = provider.suggest(&buffer, cursor_buffer_position, cx)?;
let edits = inline_completion
let completion = provider.suggest(&buffer, cursor_buffer_position, cx)?;
let edits = completion
.edits
.into_iter()
.flat_map(|(range, new_text)| {
@ -5061,12 +5066,13 @@ impl Editor {
let mut inlay_ids = Vec::new();
let invalidation_row_range;
let completion = if cursor_row < edit_start_row {
let completion;
if cursor_row < edit_start_row {
invalidation_row_range = cursor_row..edit_end_row;
InlineCompletion::Move(first_edit_start)
completion = InlineCompletion::Move(first_edit_start);
} else if cursor_row > edit_end_row {
invalidation_row_range = edit_start_row..cursor_row;
InlineCompletion::Move(first_edit_start)
completion = InlineCompletion::Move(first_edit_start);
} else {
if edits
.iter()
@ -5111,14 +5117,10 @@ impl Editor {
EditDisplayMode::DiffPopover
};
let snapshot = multibuffer.buffer_for_excerpt(excerpt_id).cloned()?;
InlineCompletion::Edit {
completion = InlineCompletion::Edit {
edits,
edit_preview: inline_completion.edit_preview,
display_mode,
snapshot,
}
};
};
let invalidation_range = multibuffer
@ -5162,26 +5164,19 @@ impl Editor {
let text = match &self.active_inline_completion.as_ref()?.completion {
InlineCompletion::Edit {
edits,
edit_preview,
display_mode: _,
snapshot,
} => edit_preview
.as_ref()
.and_then(|edit_preview| {
inline_completion_edit_text(&snapshot, &edits, edit_preview, true, cx)
})
.map(InlineCompletionText::Edit),
} => inline_completion_edit_text(&editor_snapshot, edits, true, cx),
InlineCompletion::Move(target) => {
let target_point =
target.to_point(&editor_snapshot.display_snapshot.buffer_snapshot);
let target_line = target_point.row + 1;
Some(InlineCompletionText::Move(
InlineCompletionText::Move(
format!("Jump to edit in line {}", target_line).into(),
))
)
}
};
Some(InlineCompletionMenuHint::Loaded { text: text? })
Some(InlineCompletionMenuHint::Loaded { text })
} else if provider.is_refreshing(cx) {
Some(InlineCompletionMenuHint::Loading)
} else if provider.needs_terms_acceptance(cx) {
@ -15824,23 +15819,74 @@ pub fn diagnostic_block_renderer(
}
fn inline_completion_edit_text(
current_snapshot: &BufferSnapshot,
edits: &[(Range<Anchor>, String)],
edit_preview: &EditPreview,
editor_snapshot: &EditorSnapshot,
edits: &Vec<(Range<Anchor>, String)>,
include_deletions: bool,
cx: &App,
) -> Option<HighlightedEdits> {
let edits = edits
.iter()
.map(|(anchor, text)| {
(
anchor.start.text_anchor..anchor.end.text_anchor,
text.clone(),
)
})
.collect::<Vec<_>>();
) -> InlineCompletionText {
let edit_start = edits
.first()
.unwrap()
.0
.start
.to_display_point(editor_snapshot);
Some(edit_preview.highlight_edits(current_snapshot, &edits, include_deletions, cx))
let mut text = String::new();
let mut offset = DisplayPoint::new(edit_start.row(), 0).to_offset(editor_snapshot, Bias::Left);
let mut highlights = Vec::new();
for (old_range, new_text) in edits {
let old_offset_range = old_range.to_offset(&editor_snapshot.buffer_snapshot);
text.extend(
editor_snapshot
.buffer_snapshot
.chunks(offset..old_offset_range.start, false)
.map(|chunk| chunk.text),
);
offset = old_offset_range.end;
let start = text.len();
let color = if include_deletions && new_text.is_empty() {
text.extend(
editor_snapshot
.buffer_snapshot
.chunks(old_offset_range.start..offset, false)
.map(|chunk| chunk.text),
);
cx.theme().status().deleted_background
} else {
text.push_str(new_text);
cx.theme().status().created_background
};
let end = text.len();
highlights.push((
start..end,
HighlightStyle {
background_color: Some(color),
..Default::default()
},
));
}
let edit_end = edits
.last()
.unwrap()
.0
.end
.to_display_point(editor_snapshot);
let end_of_line = DisplayPoint::new(edit_end.row(), editor_snapshot.line_len(edit_end.row()))
.to_offset(editor_snapshot, Bias::Right);
text.extend(
editor_snapshot
.buffer_snapshot
.chunks(offset..end_of_line, false)
.map(|chunk| chunk.text),
);
InlineCompletionText::Edit {
text: text.into(),
highlights,
}
}
pub fn highlight_diagnostic_message(