From e68682f6dba57fedb32ae2219bdf4d237f229786 Mon Sep 17 00:00:00 2001 From: codeworm96 Date: Wed, 28 Mar 2018 23:38:34 +0800 Subject: [PATCH] Remove unreachable! from macros.rs replaced unreachable! with error handling using Option. Closes #2558 --- src/macros.rs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/macros.rs b/src/macros.rs index bd8b86a49d4..61889f5764a 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -687,7 +687,7 @@ fn add_other(&mut self) { self.buf.clear(); } - fn add_meta_variable(&mut self, iter: &mut Cursor) { + fn add_meta_variable(&mut self, iter: &mut Cursor) -> Option<()> { match iter.next() { Some(TokenTree::Token(sp, Token::Ident(ref ident))) => { self.result.push(ParsedMacroArg { @@ -697,8 +697,9 @@ fn add_meta_variable(&mut self, iter: &mut Cursor) { self.buf.clear(); self.is_meta_var = false; + Some(()) } - _ => unreachable!(), + _ => None, } } @@ -716,7 +717,7 @@ fn add_repeat( delim: DelimToken, iter: &mut Cursor, span: Span, - ) { + ) -> Option<()> { let mut buffer = String::new(); let mut first = false; let mut lo = span.lo(); @@ -740,7 +741,7 @@ fn add_repeat( buffer.push_str(&pprust::token_to_string(t)); hi = sp.hi(); } - _ => unreachable!(), + _ => return None, } } @@ -758,6 +759,7 @@ fn add_repeat( kind: MacroArgKind::Repeat(delim, inner, another, self.last_tok.clone()), span: mk_sp(self.lo, self.hi), }); + Some(()) } fn update_buffer(&mut self, lo: BytePos, t: &Token) { @@ -802,7 +804,7 @@ fn need_space_prefix(&self) -> bool { } /// Returns a collection of parsed macro def's arguments. - pub fn parse(mut self, tokens: ThinTokenStream) -> Vec { + pub fn parse(mut self, tokens: ThinTokenStream) -> Option> { let mut iter = (tokens.into(): TokenStream).trees(); while let Some(ref tok) = iter.next() { @@ -819,7 +821,7 @@ pub fn parse(mut self, tokens: ThinTokenStream) -> Vec { self.start_tok = Token::Dollar; } TokenTree::Token(_, Token::Colon) if self.is_meta_var => { - self.add_meta_variable(&mut iter); + self.add_meta_variable(&mut iter)?; } TokenTree::Token(sp, ref t) => self.update_buffer(sp.lo(), t), TokenTree::Delimited(sp, delimited) => { @@ -834,10 +836,10 @@ pub fn parse(mut self, tokens: ThinTokenStream) -> Vec { // Parse the stuff inside delimiters. let mut parser = MacroArgParser::new(); parser.lo = sp.lo(); - let delimited_arg = parser.parse(delimited.tts.clone()); + let delimited_arg = parser.parse(delimited.tts.clone())?; if self.is_meta_var { - self.add_repeat(delimited_arg, delimited.delim, &mut iter, *sp); + self.add_repeat(delimited_arg, delimited.delim, &mut iter, *sp)?; } else { self.add_delimited(delimited_arg, delimited.delim, *sp); } @@ -853,7 +855,7 @@ pub fn parse(mut self, tokens: ThinTokenStream) -> Vec { self.add_other(); } - self.result + Some(self.result) } } @@ -915,7 +917,7 @@ fn format_macro_args( toks: ThinTokenStream, shape: Shape, ) -> Option { - let parsed_args = MacroArgParser::new().parse(toks); + let parsed_args = MacroArgParser::new().parse(toks)?; wrap_macro_args(context, &parsed_args, shape) } -- 2.44.0