1
Fork 0

2 - Make more use of let_chains

Continuation of #94376.

cc #53667
This commit is contained in:
Caio 2022-02-26 13:45:36 -03:00
parent 6f681a8eb3
commit ef5601b321
5 changed files with 50 additions and 56 deletions

View file

@ -75,12 +75,11 @@ impl NestedMetaItem {
pub fn name_value_literal(&self) -> Option<(Symbol, &Lit)> { pub fn name_value_literal(&self) -> Option<(Symbol, &Lit)> {
self.meta_item().and_then(|meta_item| { self.meta_item().and_then(|meta_item| {
meta_item.meta_item_list().and_then(|meta_item_list| { meta_item.meta_item_list().and_then(|meta_item_list| {
if meta_item_list.len() == 1 { if meta_item_list.len() == 1
if let Some(ident) = meta_item.ident() { && let Some(ident) = meta_item.ident()
if let Some(lit) = meta_item_list[0].literal() { && let Some(lit) = meta_item_list[0].literal()
return Some((ident.name, lit)); {
} return Some((ident.name, lit));
}
} }
None None
}) })

View file

@ -12,11 +12,12 @@
#![feature(crate_visibility_modifier)] #![feature(crate_visibility_modifier)]
#![feature(if_let_guard)] #![feature(if_let_guard)]
#![feature(label_break_value)] #![feature(label_break_value)]
#![feature(nll)] #![feature(let_chains)]
#![feature(min_specialization)] #![feature(min_specialization)]
#![recursion_limit = "256"] #![feature(nll)]
#![feature(slice_internals)] #![feature(slice_internals)]
#![feature(stmt_expr_attributes)] #![feature(stmt_expr_attributes)]
#![recursion_limit = "256"]
#[macro_use] #[macro_use]
extern crate rustc_macros; extern crate rustc_macros;

View file

@ -504,10 +504,8 @@ impl Token {
/// Returns `true` if the token is an interpolated path. /// Returns `true` if the token is an interpolated path.
fn is_path(&self) -> bool { fn is_path(&self) -> bool {
if let Interpolated(ref nt) = self.kind { if let Interpolated(ref nt) = self.kind && let NtPath(..) = **nt {
if let NtPath(..) = **nt { return true;
return true;
}
} }
false false
} }
@ -516,10 +514,10 @@ impl Token {
/// That is, is this a pre-parsed expression dropped into the token stream /// That is, is this a pre-parsed expression dropped into the token stream
/// (which happens while parsing the result of macro expansion)? /// (which happens while parsing the result of macro expansion)?
pub fn is_whole_expr(&self) -> bool { pub fn is_whole_expr(&self) -> bool {
if let Interpolated(ref nt) = self.kind { if let Interpolated(ref nt) = self.kind
if let NtExpr(_) | NtLiteral(_) | NtPath(_) | NtIdent(..) | NtBlock(_) = **nt { && let NtExpr(_) | NtLiteral(_) | NtPath(_) | NtIdent(..) | NtBlock(_) = **nt
return true; {
} return true;
} }
false false
@ -527,10 +525,8 @@ impl Token {
// Is the token an interpolated block (`$b:block`)? // Is the token an interpolated block (`$b:block`)?
pub fn is_whole_block(&self) -> bool { pub fn is_whole_block(&self) -> bool {
if let Interpolated(ref nt) = self.kind { if let Interpolated(ref nt) = self.kind && let NtBlock(..) = **nt {
if let NtBlock(..) = **nt { return true;
return true;
}
} }
false false
} }

View file

@ -497,42 +497,40 @@ impl TokenStreamBuilder {
// If `self` is not empty and the last tree within the last stream is a // If `self` is not empty and the last tree within the last stream is a
// token tree marked with `Joint`... // token tree marked with `Joint`...
if let Some(TokenStream(ref mut last_stream_lrc)) = self.0.last_mut() { if let Some(TokenStream(ref mut last_stream_lrc)) = self.0.last_mut()
if let Some((TokenTree::Token(last_token), Spacing::Joint)) = last_stream_lrc.last() { && let Some((TokenTree::Token(last_token), Spacing::Joint)) = last_stream_lrc.last()
// ...and `stream` is not empty and the first tree within it is // ...and `stream` is not empty and the first tree within it is
// a token tree... // a token tree...
let TokenStream(ref mut stream_lrc) = stream; && let TokenStream(ref mut stream_lrc) = stream
if let Some((TokenTree::Token(token), spacing)) = stream_lrc.first() { && let Some((TokenTree::Token(token), spacing)) = stream_lrc.first()
// ...and the two tokens can be glued together... // ...and the two tokens can be glued together...
if let Some(glued_tok) = last_token.glue(&token) { && let Some(glued_tok) = last_token.glue(&token)
// ...then do so, by overwriting the last token {
// tree in `self` and removing the first token tree // ...then do so, by overwriting the last token
// from `stream`. This requires using `make_mut()` // tree in `self` and removing the first token tree
// on the last stream in `self` and on `stream`, // from `stream`. This requires using `make_mut()`
// and in practice this doesn't cause cloning 99.9% // on the last stream in `self` and on `stream`,
// of the time. // and in practice this doesn't cause cloning 99.9%
// of the time.
// Overwrite the last token tree with the merged // Overwrite the last token tree with the merged
// token. // token.
let last_vec_mut = Lrc::make_mut(last_stream_lrc); let last_vec_mut = Lrc::make_mut(last_stream_lrc);
*last_vec_mut.last_mut().unwrap() = (TokenTree::Token(glued_tok), *spacing); *last_vec_mut.last_mut().unwrap() = (TokenTree::Token(glued_tok), *spacing);
// Remove the first token tree from `stream`. (This // Remove the first token tree from `stream`. (This
// is almost always the only tree in `stream`.) // is almost always the only tree in `stream`.)
let stream_vec_mut = Lrc::make_mut(stream_lrc); let stream_vec_mut = Lrc::make_mut(stream_lrc);
stream_vec_mut.remove(0); stream_vec_mut.remove(0);
// Don't push `stream` if it's empty -- that could // Don't push `stream` if it's empty -- that could
// block subsequent token gluing, by getting // block subsequent token gluing, by getting
// between two token trees that should be glued // between two token trees that should be glued
// together. // together.
if !stream.is_empty() { if !stream.is_empty() {
self.0.push(stream); self.0.push(stream);
}
return;
}
}
} }
return;
} }
self.0.push(stream); self.0.push(stream);
} }

View file

@ -222,10 +222,10 @@ impl Lit {
} }
token::Literal(lit) => lit, token::Literal(lit) => lit,
token::Interpolated(ref nt) => { token::Interpolated(ref nt) => {
if let token::NtExpr(expr) | token::NtLiteral(expr) = &**nt { if let token::NtExpr(expr) | token::NtLiteral(expr) = &**nt
if let ast::ExprKind::Lit(lit) = &expr.kind { && let ast::ExprKind::Lit(lit) = &expr.kind
return Ok(lit.clone()); {
} return Ok(lit.clone());
} }
return Err(LitError::NotLiteral); return Err(LitError::NotLiteral);
} }