diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2017-08-21 10:41:56 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2017-08-21 10:41:56 -0700 |
| commit | b31998ec93c1738642fd1557b419fa651bb6b543 (patch) | |
| tree | c9461144895ec8d0f937fd16b7f5fbf2942e6706 /src/libsyntax | |
| parent | bf3ebcc98788d805f96b171362d272c93e0a50a0 (diff) | |
| parent | 757b7ac2abd69d97ba196b76f0bbf78c377aaea9 (diff) | |
| download | rust-b31998ec93c1738642fd1557b419fa651bb6b543.tar.gz rust-b31998ec93c1738642fd1557b419fa651bb6b543.zip | |
Merge remote-tracking branch 'origin/master' into gen
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/attr.rs | 23 | ||||
| -rw-r--r-- | src/libsyntax/parse/attr.rs | 10 |
2 files changed, 13 insertions, 20 deletions
diff --git a/src/libsyntax/attr.rs b/src/libsyntax/attr.rs index a6c4c404d62..ca87c807103 100644 --- a/src/libsyntax/attr.rs +++ b/src/libsyntax/attr.rs @@ -1064,26 +1064,21 @@ impl MetaItem { }, _ => return None, }; + let list_closing_paren_pos = tokens.peek().map(|tt| tt.span().hi); let node = match MetaItemKind::from_tokens(tokens) { Some(node) => node, _ => return None, }; - if let Some(last_span) = node.last_span() { - span.hi = last_span.hi; - } + span.hi = match node { + MetaItemKind::NameValue(ref lit) => lit.span.hi, + MetaItemKind::List(..) => list_closing_paren_pos.unwrap_or(span.hi), + _ => span.hi, + }; Some(MetaItem { name: name, span: span, node: node }) } } impl MetaItemKind { - fn last_span(&self) -> Option<Span> { - match *self { - MetaItemKind::Word => None, - MetaItemKind::List(ref list) => list.last().map(NestedMetaItem::span), - MetaItemKind::NameValue(ref lit) => Some(lit.span), - } - } - pub fn tokens(&self, span: Span) -> TokenStream { match *self { MetaItemKind::Word => TokenStream::empty(), @@ -1130,7 +1125,7 @@ impl MetaItemKind { let mut result = Vec::new(); while let Some(..) = tokens.peek() { match NestedMetaItemKind::from_tokens(&mut tokens) { - Some(item) => result.push(Spanned { span: item.span(), node: item }), + Some(item) => result.push(respan(item.span(), item)), None => return None, } match tokens.next() { @@ -1163,7 +1158,7 @@ impl NestedMetaItemKind { if let Some(TokenTree::Token(span, token)) = tokens.peek().cloned() { if let Some(node) = LitKind::from_token(token) { tokens.next(); - return Some(NestedMetaItemKind::Literal(Spanned { node: node, span: span })); + return Some(NestedMetaItemKind::Literal(respan(span, node))); } } @@ -1256,7 +1251,7 @@ pub trait HasAttrs: Sized { impl<T: HasAttrs> HasAttrs for Spanned<T> { fn attrs(&self) -> &[ast::Attribute] { self.node.attrs() } fn map_attrs<F: FnOnce(Vec<ast::Attribute>) -> Vec<ast::Attribute>>(self, f: F) -> Self { - Spanned { node: self.node.map_attrs(f), span: self.span } + respan(self.span, self.node.map_attrs(f)) } } diff --git a/src/libsyntax/parse/attr.rs b/src/libsyntax/parse/attr.rs index 5dc5a53e279..48c92873e14 100644 --- a/src/libsyntax/parse/attr.rs +++ b/src/libsyntax/parse/attr.rs @@ -244,10 +244,9 @@ impl<'a> Parser<'a> { pub fn parse_meta_item_kind(&mut self) -> PResult<'a, ast::MetaItemKind> { Ok(if self.eat(&token::Eq) { ast::MetaItemKind::NameValue(self.parse_unsuffixed_lit()?) - } else if self.token == token::OpenDelim(token::Paren) { + } else if self.eat(&token::OpenDelim(token::Paren)) { ast::MetaItemKind::List(self.parse_meta_seq()?) } else { - self.eat(&token::OpenDelim(token::Paren)); ast::MetaItemKind::Word }) } @@ -277,9 +276,8 @@ impl<'a> Parser<'a> { /// matches meta_seq = ( COMMASEP(meta_item_inner) ) fn parse_meta_seq(&mut self) -> PResult<'a, Vec<ast::NestedMetaItem>> { - self.parse_unspanned_seq(&token::OpenDelim(token::Paren), - &token::CloseDelim(token::Paren), - SeqSep::trailing_allowed(token::Comma), - |p: &mut Parser<'a>| p.parse_meta_item_inner()) + self.parse_seq_to_end(&token::CloseDelim(token::Paren), + SeqSep::trailing_allowed(token::Comma), + |p: &mut Parser<'a>| p.parse_meta_item_inner()) } } |
