summaryrefslogtreecommitdiffstats
path: root/vendor/winnow/src/combinator/parser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/winnow/src/combinator/parser.rs')
-rw-r--r--vendor/winnow/src/combinator/parser.rs265
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)