Skip to content

Commit de02742

Browse files
authored
Rollup merge of rust-lang#66054 - petrochenkov:delspan, r=estebank
syntax: Avoid span arithmetic for delimiter tokens The +/-1 logic is from the time where the whole group had a single span and the delimiter spans had to be calculated from it. Now the delimiters have their own spans which are constructed by lexer or proc macro API and can be used directly. If those spans are not perfect, then it should be fixed by tweaking the corresponding lexer logic rather than by trying to add or substract `1` from the span boundaries. Fixes rust-lang#62524 r? @estebank
2 parents af52264 + 90f891d commit de02742

11 files changed

+46
-46
lines changed

src/libsyntax/parse/parser.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -209,12 +209,12 @@ impl TokenCursor {
209209
loop {
210210
let tree = if !self.frame.open_delim {
211211
self.frame.open_delim = true;
212-
TokenTree::open_tt(self.frame.span.open, self.frame.delim)
212+
TokenTree::open_tt(self.frame.span, self.frame.delim)
213213
} else if let Some(tree) = self.frame.tree_cursor.next() {
214214
tree
215215
} else if !self.frame.close_delim {
216216
self.frame.close_delim = true;
217-
TokenTree::close_tt(self.frame.span.close, self.frame.delim)
217+
TokenTree::close_tt(self.frame.span, self.frame.delim)
218218
} else if let Some(frame) = self.stack.pop() {
219219
self.frame = frame;
220220
continue

src/libsyntax/tokenstream.rs

+5-15
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
1616
use crate::parse::token::{self, DelimToken, Token, TokenKind};
1717

18-
use syntax_pos::{BytePos, Span, DUMMY_SP};
18+
use syntax_pos::{Span, DUMMY_SP};
1919
#[cfg(target_arch = "x86_64")]
2020
use rustc_data_structures::static_assert_size;
2121
use rustc_data_structures::sync::Lrc;
@@ -110,23 +110,13 @@ impl TokenTree {
110110
}
111111

112112
/// Returns the opening delimiter as a token tree.
113-
pub fn open_tt(span: Span, delim: DelimToken) -> TokenTree {
114-
let open_span = if span.is_dummy() {
115-
span
116-
} else {
117-
span.with_hi(span.lo() + BytePos(delim.len() as u32))
118-
};
119-
TokenTree::token(token::OpenDelim(delim), open_span)
113+
pub fn open_tt(span: DelimSpan, delim: DelimToken) -> TokenTree {
114+
TokenTree::token(token::OpenDelim(delim), span.open)
120115
}
121116

122117
/// Returns the closing delimiter as a token tree.
123-
pub fn close_tt(span: Span, delim: DelimToken) -> TokenTree {
124-
let close_span = if span.is_dummy() {
125-
span
126-
} else {
127-
span.with_lo(span.hi() - BytePos(delim.len() as u32))
128-
};
129-
TokenTree::token(token::CloseDelim(delim), close_span)
118+
pub fn close_tt(span: DelimSpan, delim: DelimToken) -> TokenTree {
119+
TokenTree::token(token::CloseDelim(delim), span.close)
130120
}
131121
}
132122

src/libsyntax_expand/mbe.rs

+7-17
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use syntax::ast;
1313
use syntax::parse::token::{self, Token, TokenKind};
1414
use syntax::tokenstream::{DelimSpan};
1515

16-
use syntax_pos::{BytePos, Span};
16+
use syntax_pos::Span;
1717

1818
use rustc_data_structures::sync::Lrc;
1919

@@ -27,23 +27,13 @@ struct Delimited {
2727

2828
impl Delimited {
2929
/// Returns a `self::TokenTree` with a `Span` corresponding to the opening delimiter.
30-
fn open_tt(&self, span: Span) -> TokenTree {
31-
let open_span = if span.is_dummy() {
32-
span
33-
} else {
34-
span.with_hi(span.lo() + BytePos(self.delim.len() as u32))
35-
};
36-
TokenTree::token(token::OpenDelim(self.delim), open_span)
30+
fn open_tt(&self, span: DelimSpan) -> TokenTree {
31+
TokenTree::token(token::OpenDelim(self.delim), span.open)
3732
}
3833

3934
/// Returns a `self::TokenTree` with a `Span` corresponding to the closing delimiter.
40-
fn close_tt(&self, span: Span) -> TokenTree {
41-
let close_span = if span.is_dummy() {
42-
span
43-
} else {
44-
span.with_lo(span.hi() - BytePos(self.delim.len() as u32))
45-
};
46-
TokenTree::token(token::CloseDelim(self.delim), close_span)
35+
fn close_tt(&self, span: DelimSpan) -> TokenTree {
36+
TokenTree::token(token::CloseDelim(self.delim), span.close)
4737
}
4838
}
4939

@@ -138,10 +128,10 @@ impl TokenTree {
138128
}
139129
(&TokenTree::Delimited(span, ref delimed), _) => {
140130
if index == 0 {
141-
return delimed.open_tt(span.open);
131+
return delimed.open_tt(span);
142132
}
143133
if index == delimed.tts.len() + 1 {
144-
return delimed.close_tt(span.close);
134+
return delimed.close_tt(span);
145135
}
146136
delimed.tts[index - 1].clone()
147137
}

src/libsyntax_expand/mbe/macro_rules.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,7 @@ impl FirstSets {
566566
}
567567
TokenTree::Delimited(span, ref delimited) => {
568568
build_recur(sets, &delimited.tts[..]);
569-
first.replace_with(delimited.open_tt(span.open));
569+
first.replace_with(delimited.open_tt(span));
570570
}
571571
TokenTree::Sequence(sp, ref seq_rep) => {
572572
let subfirst = build_recur(sets, &seq_rep.tts[..]);
@@ -628,7 +628,7 @@ impl FirstSets {
628628
return first;
629629
}
630630
TokenTree::Delimited(span, ref delimited) => {
631-
first.add_one(delimited.open_tt(span.open));
631+
first.add_one(delimited.open_tt(span));
632632
return first;
633633
}
634634
TokenTree::Sequence(sp, ref seq_rep) => {
@@ -826,7 +826,7 @@ fn check_matcher_core(
826826
}
827827
}
828828
TokenTree::Delimited(span, ref d) => {
829-
let my_suffix = TokenSet::singleton(d.close_tt(span.close));
829+
let my_suffix = TokenSet::singleton(d.close_tt(span));
830830
check_matcher_core(sess, features, attrs, first_sets, &d.tts, &my_suffix);
831831
// don't track non NT tokens
832832
last.replace_with_irrelevant();

src/test/ui/imports/import-prefix-macro-1.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ error: expected one of `::`, `;`, or `as`, found `{`
22
--> $DIR/import-prefix-macro-1.rs:11:27
33
|
44
LL | ($p: path) => (use $p {S, Z});
5-
| ^ expected one of `::`, `;`, or `as` here
5+
| ^^^^^^ expected one of `::`, `;`, or `as` here
66
...
77
LL | import! { a::b::c }
88
| ------------------- in this macro invocation

src/test/ui/issues/issue-39848.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ error: expected `{`, found `foo`
22
--> $DIR/issue-39848.rs:8:19
33
|
44
LL | if $tgt.has_$field() {}
5-
| -- - help: try placing this code inside a block: `{ ) }`
5+
| -- -- help: try placing this code inside a block: `{ () }`
66
| |
77
| this `if` statement has a condition, but no block
88
...

src/test/ui/parser/issue-62973.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@ LL | )
3636
|
3737

3838
error: expected one of `.`, `?`, `{`, or an operator, found `}`
39-
--> $DIR/issue-62973.rs:8:1
39+
--> $DIR/issue-62973.rs:8:2
4040
|
4141
LL | fn p() { match s { v, E { [) {) }
4242
| ----- while parsing this match expression
4343
LL |
4444
LL |
45-
| ^ expected one of `.`, `?`, `{`, or an operator here
45+
| ^ expected one of `.`, `?`, `{`, or an operator here
4646

4747
error: incorrect close delimiter: `)`
4848
--> $DIR/issue-62973.rs:6:28

src/test/ui/parser/issue-63135.stderr

+4-4
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,16 @@ LL | fn i(n{...,f #
2323
| `..` must be at the end and cannot have a trailing comma
2424

2525
error: expected `[`, found `}`
26-
--> $DIR/issue-63135.rs:3:15
26+
--> $DIR/issue-63135.rs:3:16
2727
|
2828
LL | fn i(n{...,f #
29-
| ^ expected `[`
29+
| ^ expected `[`
3030

3131
error: expected one of `:` or `|`, found `)`
32-
--> $DIR/issue-63135.rs:3:15
32+
--> $DIR/issue-63135.rs:3:16
3333
|
3434
LL | fn i(n{...,f #
35-
| ^ expected one of `:` or `|` here
35+
| ^ expected one of `:` or `|` here
3636

3737
error: aborting due to 5 previous errors
3838

src/test/ui/parser/macro/macro-doc-comments-2.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ LL | macro_rules! inner {
55
| ------------------ when calling this macro
66
...
77
LL | /// Outer
8-
| ^ no rules expected this token in macro call
8+
| ^^^^^^^^^ no rules expected this token in macro call
99

1010
error: aborting due to previous error
1111

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// ignore-tidy-trailing-newlines
2+
// error-pattern: aborting due to 2 previous errors
3+
fn main((ؼ
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
error: this file contains an un-closed delimiter
2+
--> $DIR/missing_right_paren.rs:3:11
3+
|
4+
LL | fn main((ؼ
5+
| -- ^
6+
| ||
7+
| |un-closed delimiter
8+
| un-closed delimiter
9+
10+
error: expected one of `:` or `|`, found `)`
11+
--> $DIR/missing_right_paren.rs:3:11
12+
|
13+
LL | fn main((ؼ
14+
| ^ expected one of `:` or `|` here
15+
16+
error: aborting due to 2 previous errors
17+

0 commit comments

Comments
 (0)