diff options
| author | bors <bors@rust-lang.org> | 2019-06-07 06:52:09 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2019-06-07 06:52:09 +0000 |
| commit | ca1bcfdde3f19afd68ef808cecf2ce56d08d5df4 (patch) | |
| tree | 07a0d2ef9340fa064341cc697a8ae58e3762373a /src/libsyntax_ext | |
| parent | c5295ac64a8f2c7aee9cdd13b8fe00b82aff8435 (diff) | |
| parent | 3a31f0634bb1669eae64e83f595942986f867125 (diff) | |
| download | rust-ca1bcfdde3f19afd68ef808cecf2ce56d08d5df4.tar.gz rust-ca1bcfdde3f19afd68ef808cecf2ce56d08d5df4.zip | |
Auto merge of #61541 - petrochenkov:tsp, r=oli-obk
syntax: Keep token span as a part of `Token` In the world with proc macros and edition hygiene `Token` without a span is not self-contained. In practice this means that tokens and spans are always stored and passed somewhere along with each other. This PR combines them into a single struct by doing the next renaming/replacement: - `Token` -> `TokenKind` - `TokenAndSpan` -> `Token` - `(Token, Span)` -> `Token` Some later commits (https://github.com/rust-lang/rust/commit/fb6e2fe8fd6caed247857758c6c3549fe2b59527 and https://github.com/rust-lang/rust/commit/1cdee86940db892cd17239c26add5364335e895a) remove duplicate spans in `token::Ident` and `token::Lifetime`. Those spans were supposed to be identical to token spans, but could easily go out of sync, as was noticed in https://github.com/rust-lang/rust/pull/60965#discussion_r285398523. The `(Token, Span)` -> `Token` change is a soft pre-requisite for this de-duplication since it allows to avoid some larger churn (passing spans to most of functions classifying identifiers).
Diffstat (limited to 'src/libsyntax_ext')
| -rw-r--r-- | src/libsyntax_ext/asm.rs | 9 | ||||
| -rw-r--r-- | src/libsyntax_ext/assert.rs | 11 | ||||
| -rw-r--r-- | src/libsyntax_ext/concat_idents.rs | 8 | ||||
| -rw-r--r-- | src/libsyntax_ext/deriving/custom.rs | 6 | ||||
| -rw-r--r-- | src/libsyntax_ext/format.rs | 6 | ||||
| -rw-r--r-- | src/libsyntax_ext/proc_macro_decls.rs | 4 | ||||
| -rw-r--r-- | src/libsyntax_ext/proc_macro_server.rs | 45 | ||||
| -rw-r--r-- | src/libsyntax_ext/trace_macros.rs | 4 |
8 files changed, 47 insertions, 46 deletions
diff --git a/src/libsyntax_ext/asm.rs b/src/libsyntax_ext/asm.rs index 4d7083c1a79..b015815ac9c 100644 --- a/src/libsyntax_ext/asm.rs +++ b/src/libsyntax_ext/asm.rs @@ -9,7 +9,8 @@ use errors::DiagnosticBuilder; use syntax::ast; use syntax::ext::base::{self, *}; use syntax::feature_gate; -use syntax::parse::{self, token}; +use syntax::parse; +use syntax::parse::token::{self, Token}; use syntax::ptr::P; use syntax::symbol::{kw, sym, Symbol}; use syntax::ast::AsmDialect; @@ -86,8 +87,8 @@ fn parse_inline_asm<'a>( let first_colon = tts.iter() .position(|tt| { match *tt { - tokenstream::TokenTree::Token(_, token::Colon) | - tokenstream::TokenTree::Token(_, token::ModSep) => true, + tokenstream::TokenTree::Token(Token { kind: token::Colon, .. }) | + tokenstream::TokenTree::Token(Token { kind: token::ModSep, .. }) => true, _ => false, } }) @@ -259,7 +260,7 @@ fn parse_inline_asm<'a>( loop { // MOD_SEP is a double colon '::' without space in between. // When encountered, the state must be advanced twice. - match (&p.token, state.next(), state.next().next()) { + match (&p.token.kind, state.next(), state.next().next()) { (&token::Colon, StateNone, _) | (&token::ModSep, _, StateNone) => { p.bump(); diff --git a/src/libsyntax_ext/assert.rs b/src/libsyntax_ext/assert.rs index 13342c8e28e..3886528c74c 100644 --- a/src/libsyntax_ext/assert.rs +++ b/src/libsyntax_ext/assert.rs @@ -4,7 +4,7 @@ use syntax::ast::{self, *}; use syntax::source_map::Spanned; use syntax::ext::base::*; use syntax::ext::build::AstBuilder; -use syntax::parse::token::{self, Token}; +use syntax::parse::token::{self, TokenKind}; use syntax::parse::parser::Parser; use syntax::print::pprust; use syntax::ptr::P; @@ -29,12 +29,12 @@ pub fn expand_assert<'cx>( let panic_call = Mac_ { path: Path::from_ident(Ident::new(sym::panic, sp)), tts: custom_message.unwrap_or_else(|| { - TokenStream::from(TokenTree::Token( - DUMMY_SP, - Token::lit(token::Str, Symbol::intern(&format!( + TokenStream::from(TokenTree::token( + TokenKind::lit(token::Str, Symbol::intern(&format!( "assertion failed: {}", pprust::expr_to_string(&cond_expr).escape_debug() )), None), + DUMMY_SP, )) }).into(), delim: MacDelimiter::Parenthesis, @@ -103,7 +103,8 @@ fn parse_assert<'a>( // // Parse this as an actual message, and suggest inserting a comma. Eventually, this should be // turned into an error. - let custom_message = if let token::Literal(token::Lit { kind: token::Str, .. }) = parser.token { + let custom_message = if let token::Literal(token::Lit { kind: token::Str, .. }) + = parser.token.kind { let mut err = cx.struct_span_warn(parser.span, "unexpected string literal"); let comma_span = cx.source_map().next_point(parser.prev_span); err.span_suggestion_short( diff --git a/src/libsyntax_ext/concat_idents.rs b/src/libsyntax_ext/concat_idents.rs index 77c53f402cc..8f061abc77b 100644 --- a/src/libsyntax_ext/concat_idents.rs +++ b/src/libsyntax_ext/concat_idents.rs @@ -3,7 +3,7 @@ use rustc_data_structures::thin_vec::ThinVec; use syntax::ast; use syntax::ext::base::{self, *}; use syntax::feature_gate; -use syntax::parse::token; +use syntax::parse::token::{self, Token}; use syntax::ptr::P; use syntax_pos::Span; use syntax_pos::symbol::{Symbol, sym}; @@ -30,7 +30,7 @@ pub fn expand_syntax_ext<'cx>(cx: &'cx mut ExtCtxt<'_>, for (i, e) in tts.iter().enumerate() { if i & 1 == 1 { match *e { - TokenTree::Token(_, token::Comma) => {} + TokenTree::Token(Token { kind: token::Comma, .. }) => {} _ => { cx.span_err(sp, "concat_idents! expecting comma."); return DummyResult::any(sp); @@ -38,8 +38,8 @@ pub fn expand_syntax_ext<'cx>(cx: &'cx mut ExtCtxt<'_>, } } else { match *e { - TokenTree::Token(_, token::Ident(ident, _)) => - res_str.push_str(&ident.as_str()), + TokenTree::Token(Token { kind: token::Ident(name, _), .. }) => + res_str.push_str(&name.as_str()), _ => { cx.span_err(sp, "concat_idents! requires ident args."); return DummyResult::any(sp); diff --git a/src/libsyntax_ext/deriving/custom.rs b/src/libsyntax_ext/deriving/custom.rs index 975d96951dc..98465d75e46 100644 --- a/src/libsyntax_ext/deriving/custom.rs +++ b/src/libsyntax_ext/deriving/custom.rs @@ -8,7 +8,7 @@ use syntax::attr::{mark_used, mark_known}; use syntax::source_map::Span; use syntax::ext::base::*; use syntax::parse; -use syntax::parse::token::{self, Token}; +use syntax::parse::token; use syntax::tokenstream; use syntax::visit::Visitor; use syntax_pos::DUMMY_SP; @@ -68,8 +68,8 @@ impl MultiItemModifier for ProcMacroDerive { // Mark attributes as known, and used. MarkAttrs(&self.attrs).visit_item(&item); - let token = Token::Interpolated(Lrc::new(token::NtItem(item))); - let input = tokenstream::TokenTree::Token(DUMMY_SP, token).into(); + let token = token::Interpolated(Lrc::new(token::NtItem(item))); + let input = tokenstream::TokenTree::token(token, DUMMY_SP).into(); let server = proc_macro_server::Rustc::new(ecx); let stream = match self.client.run(&EXEC_STRATEGY, server, input) { diff --git a/src/libsyntax_ext/format.rs b/src/libsyntax_ext/format.rs index b5be45547cf..c78215b77a9 100644 --- a/src/libsyntax_ext/format.rs +++ b/src/libsyntax_ext/format.rs @@ -149,16 +149,16 @@ fn parse_args<'a>( } // accept trailing commas if named || (p.token.is_ident() && p.look_ahead(1, |t| *t == token::Eq)) { named = true; - let ident = if let token::Ident(i, _) = p.token { + let name = if let token::Ident(name, _) = p.token.kind { p.bump(); - i + name } else { return Err(ecx.struct_span_err( p.span, "expected ident, positional arguments cannot follow named arguments", )); }; - let name: &str = &ident.as_str(); + let name: &str = &name.as_str(); p.expect(&token::Eq)?; let e = p.parse_expr()?; diff --git a/src/libsyntax_ext/proc_macro_decls.rs b/src/libsyntax_ext/proc_macro_decls.rs index de8b689396f..29297aa913e 100644 --- a/src/libsyntax_ext/proc_macro_decls.rs +++ b/src/libsyntax_ext/proc_macro_decls.rs @@ -132,7 +132,7 @@ impl<'a> CollectProcMacros<'a> { } }; - if !trait_ident.can_be_raw() { + if !trait_ident.name.can_be_raw() { self.handler.span_err(trait_attr.span, &format!("`{}` cannot be a name of derive macro", trait_ident)); } @@ -166,7 +166,7 @@ impl<'a> CollectProcMacros<'a> { return None; } }; - if !ident.can_be_raw() { + if !ident.name.can_be_raw() { self.handler.span_err( attr.span, &format!("`{}` cannot be a name of derive helper attribute", ident), diff --git a/src/libsyntax_ext/proc_macro_server.rs b/src/libsyntax_ext/proc_macro_server.rs index cc05ecf8df5..00a420d3fa8 100644 --- a/src/libsyntax_ext/proc_macro_server.rs +++ b/src/libsyntax_ext/proc_macro_server.rs @@ -55,7 +55,7 @@ impl FromInternal<(TreeAndJoint, &'_ ParseSess, &'_ mut Vec<Self>)> use syntax::parse::token::*; let joint = is_joint == Joint; - let (span, token) = match tree { + let Token { kind, span } = match tree { tokenstream::TokenTree::Delimited(span, delim, tts) => { let delimiter = Delimiter::from_internal(delim); return TokenTree::Group(Group { @@ -64,7 +64,7 @@ impl FromInternal<(TreeAndJoint, &'_ ParseSess, &'_ mut Vec<Self>)> span, }); } - tokenstream::TokenTree::Token(span, token) => (span, token), + tokenstream::TokenTree::Token(token) => token, }; macro_rules! tt { @@ -93,7 +93,7 @@ impl FromInternal<(TreeAndJoint, &'_ ParseSess, &'_ mut Vec<Self>)> }}; } - match token { + match kind { Eq => op!('='), Lt => op!('<'), Le => op!('<', '='), @@ -142,11 +142,10 @@ impl FromInternal<(TreeAndJoint, &'_ ParseSess, &'_ mut Vec<Self>)> Question => op!('?'), SingleQuote => op!('\''), - Ident(ident, false) if ident.name == kw::DollarCrate => - tt!(Ident::dollar_crate()), - Ident(ident, is_raw) => tt!(Ident::new(ident.name, is_raw)), - Lifetime(ident) => { - let ident = ident.without_first_quote(); + Ident(name, false) if name == kw::DollarCrate => tt!(Ident::dollar_crate()), + Ident(name, is_raw) => tt!(Ident::new(name, is_raw)), + Lifetime(name) => { + let ident = ast::Ident::new(name, span).without_first_quote(); stack.push(tt!(Ident::new(ident.name, false))); tt!(Punct::new('\'', true)) } @@ -159,12 +158,12 @@ impl FromInternal<(TreeAndJoint, &'_ ParseSess, &'_ mut Vec<Self>)> escaped.extend(ch.escape_debug()); } let stream = vec![ - Ident(ast::Ident::new(sym::doc, span), false), + Ident(sym::doc, false), Eq, - Token::lit(token::Str, Symbol::intern(&escaped), None), + TokenKind::lit(token::Str, Symbol::intern(&escaped), None), ] .into_iter() - .map(|token| tokenstream::TokenTree::Token(span, token)) + .map(|kind| tokenstream::TokenTree::token(kind, span)) .collect(); stack.push(TokenTree::Group(Group { delimiter: Delimiter::Bracket, @@ -211,8 +210,7 @@ impl ToInternal<TokenStream> for TokenTree<Group, Punct, Ident, Literal> { .into(); } TokenTree::Ident(self::Ident { sym, is_raw, span }) => { - let token = Ident(ast::Ident::new(sym, span), is_raw); - return tokenstream::TokenTree::Token(span, token).into(); + return tokenstream::TokenTree::token(Ident(sym, is_raw), span).into(); } TokenTree::Literal(self::Literal { lit: token::Lit { kind: token::Integer, symbol, suffix }, @@ -220,9 +218,9 @@ impl ToInternal<TokenStream> for TokenTree<Group, Punct, Ident, Literal> { }) if symbol.as_str().starts_with("-") => { let minus = BinOp(BinOpToken::Minus); let symbol = Symbol::intern(&symbol.as_str()[1..]); - let integer = Token::lit(token::Integer, symbol, suffix); - let a = tokenstream::TokenTree::Token(span, minus); - let b = tokenstream::TokenTree::Token(span, integer); + let integer = TokenKind::lit(token::Integer, symbol, suffix); + let a = tokenstream::TokenTree::token(minus, span); + let b = tokenstream::TokenTree::token(integer, span); return vec![a, b].into_iter().collect(); } TokenTree::Literal(self::Literal { @@ -231,17 +229,17 @@ impl ToInternal<TokenStream> for TokenTree<Group, Punct, Ident, Literal> { }) if symbol.as_str().starts_with("-") => { let minus = BinOp(BinOpToken::Minus); let symbol = Symbol::intern(&symbol.as_str()[1..]); - let float = Token::lit(token::Float, symbol, suffix); - let a = tokenstream::TokenTree::Token(span, minus); - let b = tokenstream::TokenTree::Token(span, float); + let float = TokenKind::lit(token::Float, symbol, suffix); + let a = tokenstream::TokenTree::token(minus, span); + let b = tokenstream::TokenTree::token(float, span); return vec![a, b].into_iter().collect(); } TokenTree::Literal(self::Literal { lit, span }) => { - return tokenstream::TokenTree::Token(span, Literal(lit)).into() + return tokenstream::TokenTree::token(Literal(lit), span).into() } }; - let token = match ch { + let kind = match ch { '=' => Eq, '<' => Lt, '>' => Gt, @@ -267,7 +265,7 @@ impl ToInternal<TokenStream> for TokenTree<Group, Punct, Ident, Literal> { _ => unreachable!(), }; - let tree = tokenstream::TokenTree::Token(span, token); + let tree = tokenstream::TokenTree::token(kind, span); TokenStream::new(vec![(tree, if joint { Joint } else { NonJoint })]) } } @@ -338,7 +336,8 @@ impl Ident { if !Self::is_valid(&string) { panic!("`{:?}` is not a valid identifier", string) } - if is_raw && !ast::Ident::from_interned_str(sym.as_interned_str()).can_be_raw() { + // Get rid of gensyms to conservatively check rawness on the string contents only. + if is_raw && !sym.as_interned_str().as_symbol().can_be_raw() { panic!("`{}` cannot be a raw identifier", string); } Ident { sym, is_raw, span } diff --git a/src/libsyntax_ext/trace_macros.rs b/src/libsyntax_ext/trace_macros.rs index 61ef94560cc..6c74f77ff1f 100644 --- a/src/libsyntax_ext/trace_macros.rs +++ b/src/libsyntax_ext/trace_macros.rs @@ -17,10 +17,10 @@ pub fn expand_trace_macros(cx: &mut ExtCtxt<'_>, } match (tt.len(), tt.first()) { - (1, Some(&TokenTree::Token(_, ref tok))) if tok.is_keyword(kw::True) => { + (1, Some(TokenTree::Token(token))) if token.is_keyword(kw::True) => { cx.set_trace_macros(true); } - (1, Some(&TokenTree::Token(_, ref tok))) if tok.is_keyword(kw::False) => { + (1, Some(TokenTree::Token(token))) if token.is_keyword(kw::False) => { cx.set_trace_macros(false); } _ => cx.span_err(sp, "trace_macros! accepts only `true` or `false`"), |
