diff options
Diffstat (limited to 'vendor/winnow/src/combinator/parser.rs')
-rw-r--r-- | vendor/winnow/src/combinator/parser.rs | 265 |
1 files changed, 140 insertions, 125 deletions
diff --git a/vendor/winnow/src/combinator/parser.rs b/vendor/winnow/src/combinator/parser.rs index 12b223a2e..969c2d525 100644 --- a/vendor/winnow/src/combinator/parser.rs +++ b/vendor/winnow/src/combinator/parser.rs @@ -1,8 +1,8 @@ -use crate::error::{ContextError, ErrMode, ErrorKind, FromExternalError, ParseError}; +use crate::error::{AddContext, ErrMode, ErrorKind, FromExternalError, ParserError}; use crate::lib::std::borrow::Borrow; use crate::lib::std::ops::Range; +use crate::stream::StreamIsPartial; use crate::stream::{Location, Stream}; -use crate::stream::{Offset, StreamIsPartial}; use crate::trace::trace; use crate::trace::trace_result; use crate::*; @@ -20,7 +20,8 @@ impl<'p, P> ByRef<'p, P> { } impl<'p, I, O, E, P: Parser<I, O, E>> Parser<I, O, E> for ByRef<'p, P> { - fn parse_next(&mut self, i: I) -> IResult<I, O, E> { + #[inline(always)] + fn parse_next(&mut self, i: &mut I) -> PResult<O, E> { self.p.parse_next(i) } } @@ -62,24 +63,22 @@ where F: Parser<I, O, E>, G: Fn(O) -> O2, { - fn parse_next(&mut self, i: I) -> IResult<I, O2, E> { + #[inline] + fn parse_next(&mut self, i: &mut I) -> PResult<O2, E> { match self.parser.parse_next(i) { Err(e) => Err(e), - Ok((i, o)) => Ok((i, (self.map)(o))), + Ok(o) => Ok((self.map)(o)), } } } -#[deprecated(since = "0.4.2", note = "Replaced with `TryMap`")] -pub use TryMap as MapRes; - /// Implementation of [`Parser::try_map`] #[cfg_attr(nightly, warn(rustdoc::missing_doc_code_examples))] pub struct TryMap<F, G, I, O, O2, E, E2> where F: Parser<I, O, E>, G: FnMut(O) -> Result<O2, E2>, - I: Clone, + I: Stream, E: FromExternalError<I, E2>, { parser: F, @@ -95,7 +94,7 @@ impl<F, G, I, O, O2, E, E2> TryMap<F, G, I, O, O2, E, E2> where F: Parser<I, O, E>, G: FnMut(O) -> Result<O2, E2>, - I: Clone, + I: Stream, E: FromExternalError<I, E2>, { pub(crate) fn new(parser: F, map: G) -> Self { @@ -115,16 +114,17 @@ impl<F, G, I, O, O2, E, E2> Parser<I, O2, E> for TryMap<F, G, I, O, O2, E, E2> where F: Parser<I, O, E>, G: FnMut(O) -> Result<O2, E2>, - I: Clone, + I: Stream, E: FromExternalError<I, E2>, { - fn parse_next(&mut self, input: I) -> IResult<I, O2, E> { - let i = input.clone(); - let (input, o) = self.parser.parse_next(input)?; - let res = match (self.map)(o) { - Ok(o2) => Ok((input, o2)), - Err(e) => Err(ErrMode::from_external_error(i, ErrorKind::Verify, e)), - }; + #[inline] + fn parse_next(&mut self, input: &mut I) -> PResult<O2, E> { + let start = input.checkpoint(); + let o = self.parser.parse_next(input)?; + let res = (self.map)(o).map_err(|err| { + input.reset(start); + ErrMode::from_external_error(input, ErrorKind::Verify, err) + }); trace_result("verify", &res); res } @@ -136,8 +136,8 @@ pub struct VerifyMap<F, G, I, O, O2, E> where F: Parser<I, O, E>, G: FnMut(O) -> Option<O2>, - I: Clone, - E: ParseError<I>, + I: Stream, + E: ParserError<I>, { parser: F, map: G, @@ -151,8 +151,8 @@ impl<F, G, I, O, O2, E> VerifyMap<F, G, I, O, O2, E> where F: Parser<I, O, E>, G: FnMut(O) -> Option<O2>, - I: Clone, - E: ParseError<I>, + I: Stream, + E: ParserError<I>, { pub(crate) fn new(parser: F, map: G) -> Self { Self { @@ -170,16 +170,17 @@ impl<F, G, I, O, O2, E> Parser<I, O2, E> for VerifyMap<F, G, I, O, O2, E> where F: Parser<I, O, E>, G: FnMut(O) -> Option<O2>, - I: Clone, - E: ParseError<I>, -{ - fn parse_next(&mut self, input: I) -> IResult<I, O2, E> { - let i = input.clone(); - let (input, o) = self.parser.parse_next(input)?; - let res = match (self.map)(o) { - Some(o2) => Ok((input, o2)), - None => Err(ErrMode::from_error_kind(i, ErrorKind::Verify)), - }; + I: Stream, + E: ParserError<I>, +{ + #[inline] + fn parse_next(&mut self, input: &mut I) -> PResult<O2, E> { + let start = input.checkpoint(); + let o = self.parser.parse_next(input)?; + let res = (self.map)(o).ok_or_else(|| { + input.reset(start); + ErrMode::from_error_kind(input, ErrorKind::Verify) + }); trace_result("verify", &res); res } @@ -192,6 +193,7 @@ where F: Parser<I, O, E>, G: Parser<O, O2, E>, O: StreamIsPartial, + I: Stream, { outer: F, inner: G, @@ -206,6 +208,7 @@ where F: Parser<I, O, E>, G: Parser<O, O2, E>, O: StreamIsPartial, + I: Stream, { pub(crate) fn new(outer: F, inner: G) -> Self { Self { @@ -224,12 +227,18 @@ where F: Parser<I, O, E>, G: Parser<O, O2, E>, O: StreamIsPartial, + I: Stream, { - fn parse_next(&mut self, i: I) -> IResult<I, O2, E> { - let (i, mut o) = self.outer.parse_next(i)?; + #[inline(always)] + fn parse_next(&mut self, i: &mut I) -> PResult<O2, E> { + let start = i.checkpoint(); + let mut o = self.outer.parse_next(i)?; let _ = o.complete(); - let (_, o2) = self.inner.parse_next(o)?; - Ok((i, o2)) + let o2 = self.inner.parse_next(&mut o).map_err(|err| { + i.reset(start); + err + })?; + Ok(o2) } } @@ -240,7 +249,7 @@ where P: Parser<I, O, E>, I: Stream, O: crate::stream::ParseSlice<O2>, - E: ParseError<I>, + E: ParserError<I>, { p: P, i: core::marker::PhantomData<I>, @@ -254,7 +263,7 @@ where P: Parser<I, O, E>, I: Stream, O: crate::stream::ParseSlice<O2>, - E: ParseError<I>, + E: ParserError<I>, { pub(crate) fn new(p: P) -> Self { Self { @@ -272,17 +281,18 @@ where P: Parser<I, O, E>, I: Stream, O: crate::stream::ParseSlice<O2>, - E: ParseError<I>, -{ - fn parse_next(&mut self, i: I) -> IResult<I, O2, E> { - let input = i.clone(); - let (i, o) = self.p.parse_next(i)?; - - let res = o - .parse_slice() - .ok_or_else(|| ErrMode::from_error_kind(input, ErrorKind::Verify)); + E: ParserError<I>, +{ + #[inline] + fn parse_next(&mut self, i: &mut I) -> PResult<O2, E> { + let start = i.checkpoint(); + let o = self.p.parse_next(i)?; + let res = o.parse_slice().ok_or_else(|| { + i.reset(start); + ErrMode::from_error_kind(i, ErrorKind::Verify) + }); trace_result("verify", &res); - Ok((i, res?)) + res } } @@ -328,8 +338,9 @@ where G: FnMut(O) -> H, H: Parser<I, O2, E>, { - fn parse_next(&mut self, i: I) -> IResult<I, O2, E> { - let (i, o) = self.f.parse_next(i)?; + #[inline(always)] + fn parse_next(&mut self, i: &mut I) -> PResult<O2, E> { + let o = self.f.parse_next(i)?; (self.g)(o).parse_next(i) } } @@ -350,14 +361,14 @@ impl<F, I, O, E> Parser<I, O, E> for CompleteErr<F> where I: Stream, F: Parser<I, O, E>, - E: ParseError<I>, + E: ParserError<I>, { - fn parse_next(&mut self, input: I) -> IResult<I, O, E> { - trace("complete_err", |input: I| { - let i = input.clone(); + #[inline] + fn parse_next(&mut self, input: &mut I) -> PResult<O, E> { + trace("complete_err", |input: &mut I| { match (self.f).parse_next(input) { Err(ErrMode::Incomplete(_)) => { - Err(ErrMode::from_error_kind(i, ErrorKind::Complete)) + Err(ErrMode::from_error_kind(input, ErrorKind::Complete)) } rest => rest, } @@ -372,10 +383,10 @@ pub struct Verify<F, G, I, O, O2, E> where F: Parser<I, O, E>, G: Fn(&O2) -> bool, - I: Clone, + I: Stream, O: Borrow<O2>, O2: ?Sized, - E: ParseError<I>, + E: ParserError<I>, { parser: F, filter: G, @@ -389,10 +400,10 @@ impl<F, G, I, O, O2, E> Verify<F, G, I, O, O2, E> where F: Parser<I, O, E>, G: Fn(&O2) -> bool, - I: Clone, + I: Stream, O: Borrow<O2>, O2: ?Sized, - E: ParseError<I>, + E: ParserError<I>, { pub(crate) fn new(parser: F, filter: G) -> Self { Self { @@ -410,20 +421,19 @@ impl<F, G, I, O, O2, E> Parser<I, O, E> for Verify<F, G, I, O, O2, E> where F: Parser<I, O, E>, G: Fn(&O2) -> bool, - I: Clone, + I: Stream, O: Borrow<O2>, O2: ?Sized, - E: ParseError<I>, -{ - fn parse_next(&mut self, input: I) -> IResult<I, O, E> { - let i = input.clone(); - let (input, o) = self.parser.parse_next(input)?; - - let res = if (self.filter)(o.borrow()) { - Ok((input, o)) - } else { - Err(ErrMode::from_error_kind(i, ErrorKind::Verify)) - }; + E: ParserError<I>, +{ + #[inline] + fn parse_next(&mut self, input: &mut I) -> PResult<O, E> { + let start = input.checkpoint(); + let o = self.parser.parse_next(input)?; + let res = (self.filter)(o.borrow()).then_some(o).ok_or_else(|| { + input.reset(start); + ErrMode::from_error_kind(input, ErrorKind::Verify) + }); trace_result("verify", &res); res } @@ -464,10 +474,9 @@ where F: Parser<I, O, E>, O2: Clone, { - fn parse_next(&mut self, input: I) -> IResult<I, O2, E> { - (self.parser) - .parse_next(input) - .map(|(i, _)| (i, self.val.clone())) + #[inline] + fn parse_next(&mut self, input: &mut I) -> PResult<O2, E> { + (self.parser).parse_next(input).map(|_| self.val.clone()) } } @@ -501,8 +510,9 @@ impl<F, I, O, E> Parser<I, (), E> for Void<F, I, O, E> where F: Parser<I, O, E>, { - fn parse_next(&mut self, input: I) -> IResult<I, (), E> { - (self.parser).parse_next(input).map(|(i, _)| (i, ())) + #[inline(always)] + fn parse_next(&mut self, input: &mut I) -> PResult<(), E> { + (self.parser).parse_next(input).map(|_| ()) } } @@ -511,7 +521,7 @@ where pub struct Recognize<F, I, O, E> where F: Parser<I, O, E>, - I: Stream + Offset, + I: Stream, { parser: F, i: core::marker::PhantomData<I>, @@ -522,7 +532,7 @@ where impl<F, I, O, E> Recognize<F, I, O, E> where F: Parser<I, O, E>, - I: Stream + Offset, + I: Stream, { pub(crate) fn new(parser: F) -> Self { Self { @@ -537,14 +547,17 @@ where impl<I, O, E, F> Parser<I, <I as Stream>::Slice, E> for Recognize<F, I, O, E> where F: Parser<I, O, E>, - I: Stream + Offset, + I: Stream, { - fn parse_next(&mut self, input: I) -> IResult<I, <I as Stream>::Slice, E> { - let i = input.clone(); - match (self.parser).parse_next(i) { - Ok((i, _)) => { - let offset = input.offset_to(&i); - Ok(input.next_slice(offset)) + #[inline] + fn parse_next(&mut self, input: &mut I) -> PResult<<I as Stream>::Slice, E> { + let checkpoint = input.checkpoint(); + match (self.parser).parse_next(input) { + Ok(_) => { + let offset = input.offset_from(&checkpoint); + input.reset(checkpoint); + let recognized = input.next_slice(offset); + Ok(recognized) } Err(e) => Err(e), } @@ -556,7 +569,7 @@ where pub struct WithRecognized<F, I, O, E> where F: Parser<I, O, E>, - I: Stream + Offset, + I: Stream, { parser: F, i: core::marker::PhantomData<I>, @@ -567,7 +580,7 @@ where impl<F, I, O, E> WithRecognized<F, I, O, E> where F: Parser<I, O, E>, - I: Stream + Offset, + I: Stream, { pub(crate) fn new(parser: F) -> Self { Self { @@ -582,15 +595,17 @@ where impl<F, I, O, E> Parser<I, (O, <I as Stream>::Slice), E> for WithRecognized<F, I, O, E> where F: Parser<I, O, E>, - I: Stream + Offset, + I: Stream, { - fn parse_next(&mut self, input: I) -> IResult<I, (O, <I as Stream>::Slice), E> { - let i = input.clone(); - match (self.parser).parse_next(i) { - Ok((remaining, result)) => { - let offset = input.offset_to(&remaining); - let (remaining, recognized) = input.next_slice(offset); - Ok((remaining, (result, recognized))) + #[inline] + fn parse_next(&mut self, input: &mut I) -> PResult<(O, <I as Stream>::Slice), E> { + let checkpoint = input.checkpoint(); + match (self.parser).parse_next(input) { + Ok(result) => { + let offset = input.offset_from(&checkpoint); + input.reset(checkpoint); + let recognized = input.next_slice(offset); + Ok((result, recognized)) } Err(e) => Err(e), } @@ -602,7 +617,7 @@ where pub struct Span<F, I, O, E> where F: Parser<I, O, E>, - I: Clone + Location, + I: Stream + Location, { parser: F, i: core::marker::PhantomData<I>, @@ -613,7 +628,7 @@ where impl<F, I, O, E> Span<F, I, O, E> where F: Parser<I, O, E>, - I: Clone + Location, + I: Stream + Location, { pub(crate) fn new(parser: F) -> Self { Self { @@ -628,13 +643,14 @@ where impl<I, O, E, F> Parser<I, Range<usize>, E> for Span<F, I, O, E> where F: Parser<I, O, E>, - I: Clone + Location, + I: Stream + Location, { - fn parse_next(&mut self, input: I) -> IResult<I, Range<usize>, E> { + #[inline] + fn parse_next(&mut self, input: &mut I) -> PResult<Range<usize>, E> { let start = input.location(); - self.parser.parse_next(input).map(move |(remaining, _)| { - let end = remaining.location(); - (remaining, (start..end)) + self.parser.parse_next(input).map(move |_| { + let end = input.location(); + start..end }) } } @@ -644,7 +660,7 @@ where pub struct WithSpan<F, I, O, E> where F: Parser<I, O, E>, - I: Clone + Location, + I: Stream + Location, { parser: F, i: core::marker::PhantomData<I>, @@ -655,7 +671,7 @@ where impl<F, I, O, E> WithSpan<F, I, O, E> where F: Parser<I, O, E>, - I: Clone + Location, + I: Stream + Location, { pub(crate) fn new(parser: F) -> Self { Self { @@ -670,16 +686,15 @@ where impl<F, I, O, E> Parser<I, (O, Range<usize>), E> for WithSpan<F, I, O, E> where F: Parser<I, O, E>, - I: Clone + Location, + I: Stream + Location, { - fn parse_next(&mut self, input: I) -> IResult<I, (O, Range<usize>), E> { + #[inline] + fn parse_next(&mut self, input: &mut I) -> PResult<(O, Range<usize>), E> { let start = input.location(); - self.parser - .parse_next(input) - .map(move |(remaining, output)| { - let end = remaining.location(); - (remaining, (output, (start..end))) - }) + self.parser.parse_next(input).map(move |output| { + let end = input.location(); + (output, (start..end)) + }) } } @@ -718,11 +733,9 @@ where F: Parser<I, O, E>, O: Into<O2>, { - fn parse_next(&mut self, i: I) -> IResult<I, O2, E> { - match self.parser.parse_next(i) { - Ok((i, o)) => Ok((i, o.into())), - Err(err) => Err(err), - } + #[inline] + fn parse_next(&mut self, i: &mut I) -> PResult<O2, E> { + self.parser.parse_next(i).map(|o| o.into()) } } @@ -761,7 +774,8 @@ where F: Parser<I, O, E>, E: Into<E2>, { - fn parse_next(&mut self, i: I) -> IResult<I, O, E2> { + #[inline] + fn parse_next(&mut self, i: &mut I) -> PResult<O, E2> { match self.parser.parse_next(i) { Ok(ok) => Ok(ok), Err(ErrMode::Backtrack(e)) => Err(ErrMode::Backtrack(e.into())), @@ -777,7 +791,7 @@ pub struct Context<F, I, O, E, C> where F: Parser<I, O, E>, I: Stream, - E: ContextError<I, C>, + E: AddContext<I, C>, C: Clone + crate::lib::std::fmt::Debug, { parser: F, @@ -791,7 +805,7 @@ impl<F, I, O, E, C> Context<F, I, O, E, C> where F: Parser<I, O, E>, I: Stream, - E: ContextError<I, C>, + E: AddContext<I, C>, C: Clone + crate::lib::std::fmt::Debug, { pub(crate) fn new(parser: F, context: C) -> Self { @@ -809,17 +823,18 @@ impl<F, I, O, E, C> Parser<I, O, E> for Context<F, I, O, E, C> where F: Parser<I, O, E>, I: Stream, - E: ContextError<I, C>, + E: AddContext<I, C>, C: Clone + crate::lib::std::fmt::Debug, { - fn parse_next(&mut self, i: I) -> IResult<I, O, E> { + #[inline] + fn parse_next(&mut self, i: &mut I) -> PResult<O, E> { #[cfg(feature = "debug")] let name = format!("context={:?}", self.context); #[cfg(not(feature = "debug"))] let name = "context"; - trace(name, move |i: I| { + trace(name, move |i: &mut I| { (self.parser) - .parse_next(i.clone()) + .parse_next(i) .map_err(|err| err.map(|err| err.add_context(i, self.context.clone()))) }) .parse_next(i) |