Skip to content

Commit

Permalink
Fix merging of an update of a symbol with an insert_before operation …
Browse files Browse the repository at this point in the history
…before the same symbol (#19450)

When we insert before some text and then update that same text, we need
to preserve and concatenate the new text associated with both
operations.

Release Notes:

- N/A
  • Loading branch information
nathansobo authored Oct 19, 2024
1 parent d209eab commit 781fff2
Showing 1 changed file with 85 additions and 2 deletions.
87 changes: 85 additions & 2 deletions crates/assistant/src/patch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -146,12 +146,28 @@ impl ResolvedEdit {
return false;
}

if let Some(description) = &mut self.description {
if let Some(other_description) = &other.description {
let other_offset_range = other_range.to_offset(buffer);
let offset_range = range.to_offset(buffer);

// If the other range is empty at the start of this edit's range, combine the new text
if other_offset_range.is_empty() && other_offset_range.start == offset_range.start {
self.new_text = format!("{}\n{}", other.new_text, self.new_text);
self.range.start = other_range.start;

if let Some((description, other_description)) =
self.description.as_mut().zip(other.description.as_ref())
{
*description = format!("{}\n{}", other_description, description)
}
} else {
if let Some((description, other_description)) =
self.description.as_mut().zip(other.description.as_ref())
{
description.push('\n');
description.push_str(other_description);
}
}

true
}
}
Expand Down Expand Up @@ -699,6 +715,73 @@ mod tests {
.unindent(),
cx,
);

// Ensure InsertBefore merges correctly with Update of the same text

assert_edits(
"
fn foo() {
}
"
.unindent(),
vec![
AssistantEditKind::InsertBefore {
old_text: "
fn foo() {"
.unindent(),
new_text: "
fn bar() {
qux();
}"
.unindent(),
description: "implement bar".into(),
},
AssistantEditKind::Update {
old_text: "
fn foo() {
}"
.unindent(),
new_text: "
fn foo() {
bar();
}"
.unindent(),
description: "call bar in foo".into(),
},
AssistantEditKind::InsertAfter {
old_text: "
fn foo() {
}
"
.unindent(),
new_text: "
fn qux() {
// todo
}
"
.unindent(),
description: "implement qux".into(),
},
],
"
fn bar() {
qux();
}
fn foo() {
bar();
}
fn qux() {
// todo
}
"
.unindent(),
cx,
);
}

#[track_caller]
Expand Down

0 comments on commit 781fff2

Please sign in to comment.