-
Notifications
You must be signed in to change notification settings - Fork 12.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix mispositioned span in suggestions with wide characters #47407
Conversation
r? @estebank (rust_highfive has picked a reviewer for you, use r? to override) |
# fn main() {} // don't insert it for us; that'll break imports | ||
``` | ||
" | ||
"explanation": null |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is the explanation deleted?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@kennytm it was failing locally. Just thought I'll push and see what happens
b23c516
to
eb1ada2
Compare
src/librustc_errors/emitter.rs
Outdated
@@ -1187,7 +1187,7 @@ impl EmitterWriter { | |||
let sub_len = parts[0].snippet.trim().chars().fold(0, |acc, ch| { | |||
acc + unicode_width::UnicodeWidthChar::width(ch).unwrap_or(0) | |||
}); | |||
let underline_start = span_start_pos.col.0 + start; | |||
let underline_start = span_start_pos.col_display + start; | |||
let underline_end = span_start_pos.col.0 + start + sub_len; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think you need to change this line too to use col_display
.
Please add an ui test with both the tab and emoji cases. |
Have made the suggested changes. Investigating why it is not working for the emoji example. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Some tidy check errors to fix:
[00:03:36] tidy error: /checkout/src/test/ui/issue-47377-1.rs:13: line longer than 100 chars
[00:03:36] tidy error: /checkout/src/test/ui/issue-47377-1.rs: missing trailing newline
[00:03:36] tidy error: /checkout/src/test/ui/issue-47377.rs:13: line longer than 100 chars
[00:03:36] tidy error: /checkout/src/test/ui/issue-47377.rs: missing trailing newline
[00:03:37] some tidy checks failed
src/test/ui/issue-47377-1.rs
Outdated
|
||
fn main(){ | ||
let b = "hello"; | ||
println!("🦀🦀🦀🦀🦀"); let _a = b + ", World!"; //~ERROR 13:37: 13:51: binary operation `+` cannot be applied to type `&str` [E0369] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Move the error check to the line below
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also you should probably use 4 spaces of indentation here, as well as rename the file to issue-47380.rs
.
src/test/ui/issue-47377.rs
Outdated
|
||
fn main(){ | ||
let b = "hello"; | ||
let _a = b + ", World!"; //~ERROR 13:14: 13:28: binary operation `+` cannot be applied to type `&str` [E0369] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Move the error check to the line below (//~^ ERROR binary operation...
)
src/test/ui/issue-47377.rs
Outdated
fn main(){ | ||
let b = "hello"; | ||
let _a = b + ", World!"; //~ERROR 13:14: 13:28: binary operation `+` cannot be applied to type `&str` [E0369] | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add new line (your editor should be doing this by default).
src/test/ui/issue-47377.rs
Outdated
// except according to those terms. | ||
|
||
fn main(){ | ||
let b = "hello"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This file doesn't use tabs. You need to change the indentation of these two lines to use tabs and then add a line // ignore-tidy-tab
to get tidy passing, like done in src/test/ui/codemap_tests/tab_2.rs
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@est31 I changed it to ~^ ERROR E0369 }
. Do I still need //ignore-tidy-tab?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think ignore-tidy-tab
is so that the tidy
check for the project doesn't block the merge of the PR, while keeping the tabs in the code so that we avoid regressions in the handling of them. I believe your editor might be "helpfully" replacing tabs with spaces.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah it was. Can you have a look now?
src/test/ui/issue-47377.rs
Outdated
// except according to those terms. | ||
|
||
fn main(){ | ||
let b = "hello"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think ignore-tidy-tab
is so that the tidy
check for the project doesn't block the merge of the PR, while keeping the tabs in the code so that we avoid regressions in the handling of them. I believe your editor might be "helpfully" replacing tabs with spaces.
src/test/ui/issue-47380.stderr
Outdated
| ^^^^^^^^^^^^^^ `+` can't be used to concatenate two `&str` strings | ||
help: `to_owned()` can be used to create an owned `String` from a string reference. String concatenation appends the string on the right to the string on the left and may require reallocation. This requires ownership of the string on the left | ||
| | ||
13 | println!("🦀🦀🦀🦀🦀"); let _a = b.to_owned() + ", World!"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Note for reviewers: this looks misaligned on the browser, but not in terminals that handle emojis correctly.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@estebank the output is misaligned in iTerm though
src/test/ui/issue-47377.rs
Outdated
// except according to those terms. | ||
fn main(){ | ||
let b = "hello"; | ||
let _a = b + ", World!"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is still using spaces instead of tabs.
src/test/ui/issue-47380.rs
Outdated
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
// ignore-tidy-tab |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is not the file that should get this line, the other one should get it with the tabs. Here we are testing for emojis.
@bors r+ rollup |
📌 Commit efe3d69 has been approved by |
fix mispositioned span This fixes rust-lang#47377 The output now looks like this ``` error[E0369]: binary operation `+` cannot be applied to type `&str` --> h.rs:3:11 | 3 | let _a = b + ", World!"; | ^^^^^^^^^^^^^^ `+` can't be used to concatenate two `&str` strings help: `to_owned()` can be used to create an owned `String` from a string reference. String concatenation appends the string on the right to the string on the left and may require reallocation. This requires ownership of the string on the left | 3 | let _a = b.to_owned() + ", World!"; | ^^^^^^^^^ error: aborting due to previous error ``` For the case when emojis are involved, it gives the new output for proper indentation. But for an indentation as follows, ``` fn main() { let b = "hello"; let _a = b + ", World!"; } ``` it still mispositions the span ``` 3 | println!("🦀🦀🦀🦀🦀"); let _a = b + ", World!"; | ^^^^^^^^^^^^^^ `+` can't be used to concatenate two `&str` strings | 3 | println!("🦀🦀🦀🦀🦀"); let _a = b.to_owned() + ", World!"; | ^^^^^^^ error: aborting due to previous erro ``` cc @estebank @est31
fix mispositioned span This fixes rust-lang#47377 The output now looks like this ``` error[E0369]: binary operation `+` cannot be applied to type `&str` --> h.rs:3:11 | 3 | let _a = b + ", World!"; | ^^^^^^^^^^^^^^ `+` can't be used to concatenate two `&str` strings help: `to_owned()` can be used to create an owned `String` from a string reference. String concatenation appends the string on the right to the string on the left and may require reallocation. This requires ownership of the string on the left | 3 | let _a = b.to_owned() + ", World!"; | ^^^^^^^^^ error: aborting due to previous error ``` For the case when emojis are involved, it gives the new output for proper indentation. But for an indentation as follows, ``` fn main() { let b = "hello"; let _a = b + ", World!"; } ``` it still mispositions the span ``` 3 | println!("🦀🦀🦀🦀🦀"); let _a = b + ", World!"; | ^^^^^^^^^^^^^^ `+` can't be used to concatenate two `&str` strings | 3 | println!("🦀🦀🦀🦀🦀"); let _a = b.to_owned() + ", World!"; | ^^^^^^^ error: aborting due to previous erro ``` cc @estebank @est31
This fixes #47377 and #47380.
The output now looks like this
For the case when emojis are involved, it gives the new output for proper indentation.
But for an indentation as follows,
it still mispositions the span
cc @estebank @est31