Skip to content

Commit c7e3c79

Browse files
committed
Auto merge of #43933 - topecongiro:bad-span-for-attributes, r=petrochenkov
Fix bad span for attributes Closes #42641.
2 parents 230a379 + 567b9b7 commit c7e3c79

File tree

3 files changed

+11
-16
lines changed

3 files changed

+11
-16
lines changed

src/libsyntax/attr.rs

+9-14
Original file line numberDiff line numberDiff line change
@@ -1064,26 +1064,21 @@ impl MetaItem {
10641064
},
10651065
_ => return None,
10661066
};
1067+
let list_closing_paren_pos = tokens.peek().map(|tt| tt.span().hi);
10671068
let node = match MetaItemKind::from_tokens(tokens) {
10681069
Some(node) => node,
10691070
_ => return None,
10701071
};
1071-
if let Some(last_span) = node.last_span() {
1072-
span.hi = last_span.hi;
1073-
}
1072+
span.hi = match node {
1073+
MetaItemKind::NameValue(ref lit) => lit.span.hi,
1074+
MetaItemKind::List(..) => list_closing_paren_pos.unwrap_or(span.hi),
1075+
_ => span.hi,
1076+
};
10741077
Some(MetaItem { name: name, span: span, node: node })
10751078
}
10761079
}
10771080

10781081
impl MetaItemKind {
1079-
fn last_span(&self) -> Option<Span> {
1080-
match *self {
1081-
MetaItemKind::Word => None,
1082-
MetaItemKind::List(ref list) => list.last().map(NestedMetaItem::span),
1083-
MetaItemKind::NameValue(ref lit) => Some(lit.span),
1084-
}
1085-
}
1086-
10871082
pub fn tokens(&self, span: Span) -> TokenStream {
10881083
match *self {
10891084
MetaItemKind::Word => TokenStream::empty(),
@@ -1130,7 +1125,7 @@ impl MetaItemKind {
11301125
let mut result = Vec::new();
11311126
while let Some(..) = tokens.peek() {
11321127
match NestedMetaItemKind::from_tokens(&mut tokens) {
1133-
Some(item) => result.push(Spanned { span: item.span(), node: item }),
1128+
Some(item) => result.push(respan(item.span(), item)),
11341129
None => return None,
11351130
}
11361131
match tokens.next() {
@@ -1163,7 +1158,7 @@ impl NestedMetaItemKind {
11631158
if let Some(TokenTree::Token(span, token)) = tokens.peek().cloned() {
11641159
if let Some(node) = LitKind::from_token(token) {
11651160
tokens.next();
1166-
return Some(NestedMetaItemKind::Literal(Spanned { node: node, span: span }));
1161+
return Some(NestedMetaItemKind::Literal(respan(span, node)));
11671162
}
11681163
}
11691164

@@ -1256,7 +1251,7 @@ pub trait HasAttrs: Sized {
12561251
impl<T: HasAttrs> HasAttrs for Spanned<T> {
12571252
fn attrs(&self) -> &[ast::Attribute] { self.node.attrs() }
12581253
fn map_attrs<F: FnOnce(Vec<ast::Attribute>) -> Vec<ast::Attribute>>(self, f: F) -> Self {
1259-
Spanned { node: self.node.map_attrs(f), span: self.span }
1254+
respan(self.span, self.node.map_attrs(f))
12601255
}
12611256
}
12621257

src/test/ui/span/E0536.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ error[E0536]: expected 1 cfg-pattern
22
--> $DIR/E0536.rs:11:7
33
|
44
11 | #[cfg(not())] //~ ERROR E0536
5-
| ^^^
5+
| ^^^^^
66

77
error: aborting due to previous error
88

src/test/ui/span/E0537.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ error[E0537]: invalid predicate `unknown`
22
--> $DIR/E0537.rs:11:7
33
|
44
11 | #[cfg(unknown())] //~ ERROR E0537
5-
| ^^^^^^^
5+
| ^^^^^^^^^
66

77
error: aborting due to previous error
88

0 commit comments

Comments
 (0)