Improve spans when splitting multi-char operator tokens for proc macros.
This commit is contained in:
parent
177b3d2d8b
commit
88dab8d9b3
14 changed files with 79 additions and 67 deletions
|
@ -115,8 +115,20 @@ impl FromInternal<(TokenStream, &mut Rustc<'_, '_>)> for Vec<TokenTree<TokenStre
|
|||
// before that get `joint = true`.
|
||||
let mut op = |s: &str| {
|
||||
assert!(s.is_ascii());
|
||||
trees.extend(s.bytes().enumerate().map(|(idx, ch)| {
|
||||
let is_final = idx == s.len() - 1;
|
||||
trees.extend(s.bytes().enumerate().map(|(i, ch)| {
|
||||
let is_final = i == s.len() - 1;
|
||||
// Split the token span into single chars. Unless the span
|
||||
// is an unusual one, e.g. due to proc macro expansion. We
|
||||
// determine this by assuming any span with a length that
|
||||
// matches the operator length is a normal one, and any
|
||||
// span with a different length is an unusual one.
|
||||
let span = if (span.hi() - span.lo()).to_usize() == s.len() {
|
||||
let lo = span.lo() + BytePos::from_usize(i);
|
||||
let hi = lo + BytePos::from_usize(1);
|
||||
span.with_lo(lo).with_hi(hi)
|
||||
} else {
|
||||
span
|
||||
};
|
||||
TokenTree::Punct(Punct { ch, joint: if is_final { joint } else { true }, span })
|
||||
}));
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue