Skip to content

Commit

Permalink
Improve conflict marker recovery
Browse files Browse the repository at this point in the history
  • Loading branch information
dev-ardi committed Jun 8, 2024
1 parent d8fde50 commit f33e85b
Show file tree
Hide file tree
Showing 15 changed files with 96 additions and 83 deletions.
41 changes: 27 additions & 14 deletions compiler/rustc_parse/src/parser/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2999,8 +2999,11 @@ impl<'a> Parser<'a> {
};
let mut spans = Vec::with_capacity(3);
spans.push(start);
// |||||||
let mut middlediff3 = None;
// =======
let mut middle = None;
// >>>>>>>
let mut end = None;
loop {
if self.token.kind == TokenKind::Eof {
Expand All @@ -3021,29 +3024,39 @@ impl<'a> Parser<'a> {
}
self.bump();
}

let mut err = self.dcx().struct_span_err(spans, "encountered diff marker");
err.span_label(start, "after this is the code before the merge");
if let Some(middle) = middlediff3 {
err.span_label(middle, "");
}
match middlediff3 {
// We're using diff3
Some(middlediff3) => {
err.span_label(
start,
"between this marker and `|||||||` is the code that we're merging into",
);
err.span_label(middlediff3, "between this marker and `=======` is the base code (what the two refs diverged from)");
}
None => {
err.span_label(
start,
"between this marker and `=======` is the code that we're merging into",
);
}
};

if let Some(middle) = middle {
err.span_label(middle, "");
err.span_label(middle, "between this marker and `>>>>>>>` is the incoming code");
}
if let Some(end) = end {
err.span_label(end, "above this are the incoming code changes");
err.span_label(end, "this marker concludes the conflict region");
}
err.help(
"if you're having merge conflicts after pulling new code, the top section is the code \
you already had and the bottom section is the remote code",
);
err.help(
"if you're in the middle of a rebase, the top section is the code being rebased onto \
and the bottom section is the code coming from the current commit being rebased",
);
err.help("conflict markers indicate that a merge was started but could not be completed due to merge conflicts");
err.help("to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers");

err.note(
"for an explanation on these markers from the `git` documentation, visit \
<https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>",
);

Err(err)
}

Expand Down
12 changes: 6 additions & 6 deletions tests/ui/parser/diff-markers/enum-2.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,19 @@ error: encountered diff marker
--> $DIR/enum-2.rs:3:1
|
LL | <<<<<<< HEAD
| ^^^^^^^ after this is the code before the merge
| ^^^^^^^ between this marker and `|||||||` is the code that we're merging into
LL | x: u8,
LL | |||||||
| -------
| ------- between this marker and `=======` is the base code (what the two refs diverged from)
LL | z: (),
LL | =======
| -------
| ------- between this marker and `>>>>>>>` is the incoming code
LL | y: i8,
LL | >>>>>>> branch
| ^^^^^^^ above this are the incoming code changes
| ^^^^^^^ this marker concludes the conflict region
|
= help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
= help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
= help: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
= help: to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
= note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>

error: aborting due to 1 previous error
Expand Down
10 changes: 5 additions & 5 deletions tests/ui/parser/diff-markers/enum.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ error: encountered diff marker
--> $DIR/enum.rs:2:1
|
LL | <<<<<<< HEAD
| ^^^^^^^ after this is the code before the merge
| ^^^^^^^ between this marker and `=======` is the code that we're merging into
LL | Foo(u8),
LL | =======
| -------
| ------- between this marker and `>>>>>>>` is the incoming code
LL | Bar(i8),
LL | >>>>>>> branch
| ^^^^^^^ above this are the incoming code changes
| ^^^^^^^ this marker concludes the conflict region
|
= help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
= help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
= help: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
= help: to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
= note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>

error: aborting due to 1 previous error
Expand Down
10 changes: 5 additions & 5 deletions tests/ui/parser/diff-markers/fn-arg.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ error: encountered diff marker
--> $DIR/fn-arg.rs:3:1
|
LL | <<<<<<< HEAD
| ^^^^^^^ after this is the code before the merge
| ^^^^^^^ between this marker and `=======` is the code that we're merging into
LL | x: u8,
LL | =======
| -------
| ------- between this marker and `>>>>>>>` is the incoming code
LL | x: i8,
LL | >>>>>>> branch
| ^^^^^^^ above this are the incoming code changes
| ^^^^^^^ this marker concludes the conflict region
|
= help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
= help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
= help: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
= help: to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
= note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>

error: aborting due to 1 previous error
Expand Down
10 changes: 5 additions & 5 deletions tests/ui/parser/diff-markers/item-with-attr.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ error: encountered diff marker
--> $DIR/item-with-attr.rs:2:1
|
LL | <<<<<<< HEAD
| ^^^^^^^ after this is the code before the merge
| ^^^^^^^ between this marker and `=======` is the code that we're merging into
LL | fn foo() {}
LL | =======
| -------
| ------- between this marker and `>>>>>>>` is the incoming code
LL | fn bar() {}
LL | >>>>>>> branch
| ^^^^^^^ above this are the incoming code changes
| ^^^^^^^ this marker concludes the conflict region
|
= help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
= help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
= help: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
= help: to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
= note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>

error: aborting due to 1 previous error
Expand Down
10 changes: 5 additions & 5 deletions tests/ui/parser/diff-markers/item.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ error: encountered diff marker
--> $DIR/item.rs:1:1
|
LL | <<<<<<< HEAD
| ^^^^^^^ after this is the code before the merge
| ^^^^^^^ between this marker and `=======` is the code that we're merging into
LL | fn foo() {}
LL | =======
| -------
| ------- between this marker and `>>>>>>>` is the incoming code
LL | fn bar() {}
LL | >>>>>>> branch
| ^^^^^^^ above this are the incoming code changes
| ^^^^^^^ this marker concludes the conflict region
|
= help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
= help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
= help: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
= help: to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
= note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>

error: aborting due to 1 previous error
Expand Down
10 changes: 5 additions & 5 deletions tests/ui/parser/diff-markers/statement.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ error: encountered diff marker
--> $DIR/statement.rs:10:1
|
LL | <<<<<<< HEAD
| ^^^^^^^ after this is the code before the merge
| ^^^^^^^ between this marker and `=======` is the code that we're merging into
LL | S::foo();
LL | =======
| -------
| ------- between this marker and `>>>>>>>` is the incoming code
LL | S::bar();
LL | >>>>>>> branch
| ^^^^^^^ above this are the incoming code changes
| ^^^^^^^ this marker concludes the conflict region
|
= help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
= help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
= help: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
= help: to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
= note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>

error: aborting due to 1 previous error
Expand Down
10 changes: 5 additions & 5 deletions tests/ui/parser/diff-markers/struct-expr.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ error: encountered diff marker
--> $DIR/struct-expr.rs:6:1
|
LL | <<<<<<< HEAD
| ^^^^^^^ after this is the code before the merge
| ^^^^^^^ between this marker and `=======` is the code that we're merging into
LL | x: 42,
LL | =======
| -------
| ------- between this marker and `>>>>>>>` is the incoming code
LL | x: 0,
LL | >>>>>>> branch
| ^^^^^^^ above this are the incoming code changes
| ^^^^^^^ this marker concludes the conflict region
|
= help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
= help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
= help: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
= help: to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
= note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>

error: aborting due to 1 previous error
Expand Down
10 changes: 5 additions & 5 deletions tests/ui/parser/diff-markers/struct.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ error: encountered diff marker
--> $DIR/struct.rs:2:1
|
LL | <<<<<<< HEAD
| ^^^^^^^ after this is the code before the merge
| ^^^^^^^ between this marker and `=======` is the code that we're merging into
LL | x: u8,
LL | =======
| -------
| ------- between this marker and `>>>>>>>` is the incoming code
LL | x: i8,
LL | >>>>>>> branch
| ^^^^^^^ above this are the incoming code changes
| ^^^^^^^ this marker concludes the conflict region
|
= help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
= help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
= help: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
= help: to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
= note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>

error: aborting due to 1 previous error
Expand Down
10 changes: 5 additions & 5 deletions tests/ui/parser/diff-markers/trait-item.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ error: encountered diff marker
--> $DIR/trait-item.rs:2:1
|
LL | <<<<<<< HEAD
| ^^^^^^^ after this is the code before the merge
| ^^^^^^^ between this marker and `=======` is the code that we're merging into
LL | fn foo() {}
LL | =======
| -------
| ------- between this marker and `>>>>>>>` is the incoming code
LL | fn bar() {}
LL | >>>>>>> branch
| ^^^^^^^ above this are the incoming code changes
| ^^^^^^^ this marker concludes the conflict region
|
= help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
= help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
= help: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
= help: to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
= note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>

error: aborting due to 1 previous error
Expand Down
10 changes: 5 additions & 5 deletions tests/ui/parser/diff-markers/tuple-struct.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ error: encountered diff marker
--> $DIR/tuple-struct.rs:2:1
|
LL | <<<<<<< HEAD
| ^^^^^^^ after this is the code before the merge
| ^^^^^^^ between this marker and `=======` is the code that we're merging into
LL | u8,
LL | =======
| -------
| ------- between this marker and `>>>>>>>` is the incoming code
LL | i8,
LL | >>>>>>> branch
| ^^^^^^^ above this are the incoming code changes
| ^^^^^^^ this marker concludes the conflict region
|
= help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
= help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
= help: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
= help: to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
= note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>

error: aborting due to 1 previous error
Expand Down
10 changes: 5 additions & 5 deletions tests/ui/parser/diff-markers/unclosed-delims-in-macro.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ error: encountered diff marker
--> $DIR/unclosed-delims-in-macro.rs:2:1
|
LL | <<<<<<< HEAD
| ^^^^^^^ after this is the code before the merge
| ^^^^^^^ between this marker and `=======` is the code that we're merging into
...
LL | =======
| -------
| ------- between this marker and `>>>>>>>` is the incoming code
LL | () { //
LL | >>>>>>> 7a4f13c blah blah blah
| ^^^^^^^ above this are the incoming code changes
| ^^^^^^^ this marker concludes the conflict region
|
= help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
= help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
= help: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
= help: to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
= note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>

error: aborting due to 1 previous error
Expand Down
6 changes: 3 additions & 3 deletions tests/ui/parser/diff-markers/unclosed-delims.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ mod tests {
#[test]
<<<<<<< HEAD
//~^ ERROR encountered diff marker
//~| NOTE after this is the code before the merge
//~| NOTE for an explanation on these markers
//~| NOTE between this marker and `=======` is the code that we're merging into
////~| NOTE for an explanation on these markers
fn test1() {
=======
//~^ NOTE
fn test2() {
>>>>>>> 7a4f13c blah blah blah
//~^ NOTE above this are the incoming code changes
//~^ NOTE this marker concludes the conflict region
}
}
10 changes: 5 additions & 5 deletions tests/ui/parser/diff-markers/unclosed-delims.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ error: encountered diff marker
--> $DIR/unclosed-delims.rs:3:1
|
LL | <<<<<<< HEAD
| ^^^^^^^ after this is the code before the merge
| ^^^^^^^ between this marker and `=======` is the code that we're merging into
...
LL | =======
| -------
| ------- between this marker and `>>>>>>>` is the incoming code
...
LL | >>>>>>> 7a4f13c blah blah blah
| ^^^^^^^ above this are the incoming code changes
| ^^^^^^^ this marker concludes the conflict region
|
= help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
= help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
= help: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
= help: to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
= note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>

error: aborting due to 1 previous error
Expand Down
10 changes: 5 additions & 5 deletions tests/ui/parser/diff-markers/use-statement.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ error: encountered diff marker
--> $DIR/use-statement.rs:2:1
|
LL | <<<<<<< HEAD
| ^^^^^^^ after this is the code before the merge
| ^^^^^^^ between this marker and `=======` is the code that we're merging into
LL | bar,
LL | =======
| -------
| ------- between this marker and `>>>>>>>` is the incoming code
LL | baz,
LL | >>>>>>> branch
| ^^^^^^^ above this are the incoming code changes
| ^^^^^^^ this marker concludes the conflict region
|
= help: if you're having merge conflicts after pulling new code, the top section is the code you already had and the bottom section is the remote code
= help: if you're in the middle of a rebase, the top section is the code being rebased onto and the bottom section is the code coming from the current commit being rebased
= help: conflict markers indicate that a merge was started but could not be completed due to merge conflicts
= help: to resolve a conflict, keep only the code you want and then delete the lines containing conflict markers
= note: for an explanation on these markers from the `git` documentation, visit <https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts>

error: aborting due to 1 previous error
Expand Down

0 comments on commit f33e85b

Please sign in to comment.