From 9e7f84afb0f1cd2b5c2da7cfbf165305489e1a32 Mon Sep 17 00:00:00 2001 From: WindSoilder Date: Thu, 19 Oct 2023 05:23:17 +0800 Subject: [PATCH] Refactor: simplify lex_item impl (#10744) In the final match of `lex_item`, we'll return `Err(ParseError)` in rare case, normally we'll return None. So I think making error part mutable can reduce some code, and it's better if we want to add more lex items. --- crates/nu-parser/src/lex.rs | 74 ++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 42 deletions(-) diff --git a/crates/nu-parser/src/lex.rs b/crates/nu-parser/src/lex.rs index 34701efdf4..50f0909d3a 100644 --- a/crates/nu-parser/src/lex.rs +++ b/crates/nu-parser/src/lex.rs @@ -254,57 +254,47 @@ pub fn lex_item( ); } - match &input[(span.start - span_offset)..(span.end - span_offset)] { - b"out>" | b"o>" => ( - Token { - contents: TokenContents::OutGreaterThan, - span, - }, - None, - ), - b"err>" | b"e>" => ( - Token { - contents: TokenContents::ErrGreaterThan, - span, - }, - None, - ), - b"out+err>" | b"err+out>" | b"o+e>" | b"e+o>" => ( - Token { - contents: TokenContents::OutErrGreaterThan, - span, - }, - None, - ), - b"&&" => ( + let mut err = None; + let output = match &input[(span.start - span_offset)..(span.end - span_offset)] { + b"out>" | b"o>" => Token { + contents: TokenContents::OutGreaterThan, + span, + }, + b"err>" | b"e>" => Token { + contents: TokenContents::ErrGreaterThan, + span, + }, + b"out+err>" | b"err+out>" | b"o+e>" | b"e+o>" => Token { + contents: TokenContents::OutErrGreaterThan, + span, + }, + b"&&" => { + err = Some(ParseError::ShellAndAnd(span)); Token { contents: TokenContents::Item, span, - }, - Some(ParseError::ShellAndAnd(span)), - ), - b"2>" => ( + } + } + b"2>" => { + err = Some(ParseError::ShellErrRedirect(span)); Token { contents: TokenContents::Item, span, - }, - Some(ParseError::ShellErrRedirect(span)), - ), - b"2>&1" => ( + } + } + b"2>&1" => { + err = Some(ParseError::ShellOutErrRedirect(span)); Token { contents: TokenContents::Item, span, - }, - Some(ParseError::ShellOutErrRedirect(span)), - ), - _ => ( - Token { - contents: TokenContents::Item, - span, - }, - None, - ), - } + } + } + _ => Token { + contents: TokenContents::Item, + span, + }, + }; + (output, err) } pub fn lex_signature(