Skip to content

Commit 90f891d

Browse files
committed
syntax: Avoid span arithmetics for delimiter tokens
1 parent aa51f04 commit 90f891d

11 files changed

+46
-46
lines changed

src/libsyntax/parse/parser.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -210,12 +210,12 @@ impl TokenCursor {
210210
loop {
211211
let tree = if !self.frame.open_delim {
212212
self.frame.open_delim = true;
213-
TokenTree::open_tt(self.frame.span.open, self.frame.delim)
213+
TokenTree::open_tt(self.frame.span, self.frame.delim)
214214
} else if let Some(tree) = self.frame.tree_cursor.next() {
215215
tree
216216
} else if !self.frame.close_delim {
217217
self.frame.close_delim = true;
218-
TokenTree::close_tt(self.frame.span.close, self.frame.delim)
218+
TokenTree::close_tt(self.frame.span, self.frame.delim)
219219
} else if let Some(frame) = self.stack.pop() {
220220
self.frame = frame;
221221
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
@@ -34,13 +34,13 @@ LL | )
3434
|
3535

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

4545
error: incorrect close delimiter: `)`
4646
--> $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)