Struct parsel::ast::Separated

source ·
pub struct Separated<T, P> { /* private fields */ }
Expand description

Parses a given production repeatedly, separated by punctuation. Trailing punctuation is not allowed, and the production must appear at least once in the input. Parsing stops gracefully once there are no more separators left at the head of the input stream.

It can’t be Default because that would mean an empty sequence.

use parsel::Result;
use parsel::ast::{ident, LitInt, Ident, Separated, Many};
use parsel::ast::token::{Plus, PathSep, Comma};

let mut sum: Separated<LitInt, Plus> = parsel::parse_quote! {
    1 + 2 + 4 + 8 + 16 + 32
};
sum.push_value(LitInt::from(64));

assert_eq!(sum.to_string(), "1 + 2 + 4 + 8 + 16 + 32 + 64");

let good_short: Separated<Ident, PathSep> = parsel::parse_quote!(one);
let good_short: Vec<_> = good_short.into_iter().collect();
let expected_short = vec![ident("one")];
assert_eq!(good_short, expected_short);

let good_long: Separated<Ident, PathSep> = parsel::parse_quote! {
    root::module::Item
};
let good_long: Vec<_> = good_long.into_iter().collect();
let expected_long: Many<Ident> = parsel::parse_quote!(root module Item);
let expected_long: Vec<_> = expected_long.into_iter().collect();
assert_eq!(good_long, expected_long);

let bad_trailing: Result<Separated<Ident, PathSep>> = parsel::parse_str(r"
    root::module::Item::
");
assert!(bad_trailing.is_err());

let bad_empty: Result<Separated<Ident, PathSep>> = parsel::parse_str("");
assert!(bad_empty.is_err());

Implementations§

source§

impl<T, P> Separated<T, P>

source

pub fn len(&self) -> NonZeroUsize

source

pub fn into_inner(self) -> Punctuated<T, P>

source

pub fn first(&self) -> &T

source

pub fn first_mut(&mut self) -> &mut T

source

pub fn last(&self) -> &T

source

pub fn last_mut(&mut self) -> &mut T

source

pub fn insert(&mut self, index: usize, value: T)
where P: Default,

insert() is allowed because it doesn’t ever make the sequence empty, nor does it add trailing punctuation, so it doesn’t violate the invariants of the type.

source

pub fn push(&mut self, punct: P, value: T)

push() is allowed because it doesn’t ever make the sequence empty, nor does it add trailing punctuation, so it doesn’t violate the invariants of the type.

source

pub fn push_value(&mut self, value: T)
where P: Default,

push_value() is allowed because it doesn’t ever make the sequence empty, nor does it add trailing punctuation, so it doesn’t violate the invariants of the type.

source

pub fn iter(&self) -> Iter<'_, T>

source

pub fn iter_mut(&mut self) -> IterMut<'_, T>

source

pub fn into_pairs(self) -> IntoPairs<T, P>

source

pub fn pairs(&self) -> Pairs<'_, T, P>

source

pub fn pairs_mut(&mut self) -> PairsMut<'_, T, P>

source

pub fn into_first_rest(self) -> (T, Vec<(P, T)>)

Returns the first value and the remaining (punctuation, value) pairs.

let singleton: Separated<LitInt, Comma> = parsel::parse_quote!(137);
let (first, rest) = singleton.into_first_rest();
assert_eq!(first, LitInt::from(137));
assert_eq!(rest, []);

let triplet: Separated<LitInt, Comma> = parsel::parse_quote!(731, 813, 139);
let (first, rest) = triplet.into_first_rest();
assert_eq!(first, LitInt::from(731));
assert_eq!(rest, [
    (Comma::default(), LitInt::from(813)),
    (Comma::default(), LitInt::from(139)),
]);
source

pub fn into_last_rest(self) -> (T, Vec<(T, P)>)

Returns the last value and the preceding (value, punctuation) pairs.

let singleton: Separated<LitChar, Semi> = parsel::parse_quote!('W');
let (last, rest) = singleton.into_last_rest();
assert_eq!(last, LitChar::from('W'));
assert_eq!(rest, []);

let triplet: Separated<LitChar, Semi> = parsel::parse_quote!('"'; 'é'; '\'');
let (last, rest) = triplet.into_last_rest();
assert_eq!(last, LitChar::from('\''));
assert_eq!(rest, [
    (LitChar::from('"'), Semi::default()),
    (LitChar::from('é'), Semi::default()),
]);

Methods from Deref<Target = Punctuated<T, P>>§

source

pub fn is_empty(&self) -> bool

Determines whether this punctuated sequence is empty, meaning it contains no syntax tree nodes or punctuation.

source

pub fn len(&self) -> usize

Returns the number of syntax tree nodes in this punctuated sequence.

This is the number of nodes of type T, not counting the punctuation of type P.

source

pub fn first(&self) -> Option<&T>

Borrows the first element in this sequence.

source

pub fn last(&self) -> Option<&T>

Borrows the last element in this sequence.

source

pub fn iter(&self) -> Iter<'_, T>

Returns an iterator over borrowed syntax tree nodes of type &T.

source

pub fn pairs(&self) -> Pairs<'_, T, P>

Returns an iterator over the contents of this sequence as borrowed punctuated pairs.

source

pub fn trailing_punct(&self) -> bool

Determines whether this punctuated sequence ends with a trailing punctuation.

source

pub fn empty_or_trailing(&self) -> bool

Returns true if either this Punctuated is empty, or it has a trailing punctuation.

Equivalent to punctuated.is_empty() || punctuated.trailing_punct().

Trait Implementations§

source§

impl<T, P> AsRef<Punctuated<T, P>> for Separated<T, P>

See the documentation of impl Deref for Separated for why this can’t be AsMut.

source§

fn as_ref(&self) -> &Punctuated<T, P>

Converts this type into a shared reference of the (usually inferred) input type.
source§

impl<T, P> Borrow<Punctuated<T, P>> for Separated<T, P>

See the documentation of impl Deref for Separated for why this can’t be BorrowMut.

source§

fn borrow(&self) -> &Punctuated<T, P>

Immutably borrows from an owned value. Read more
source§

impl<T: Clone, P: Clone> Clone for Separated<T, P>

source§

fn clone(&self) -> Separated<T, P>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<T, P> Debug for Separated<T, P>
where T: Debug, P: Debug,

source§

fn fmt(&self, formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<T, P> Deref for Separated<T, P>

It can’t be DerefMut, because then users could .pop() the last remaining item, resulting in an empty Separated. They could push a trailing separator, too, which also violates internal invariants.

§

type Target = Punctuated<T, P>

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.
source§

impl<T, P> Display for Separated<T, P>
where T: ToTokens, P: ToTokens,

source§

fn fmt(&self, formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<T, P> Extend<(P, T)> for Separated<T, P>

Extend<(P, T)> can be implemented because it never causes the sequence to become empty, nor does it add any trailing punctuation.

source§

fn extend<I>(&mut self, iter: I)
where I: IntoIterator<Item = (P, T)>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, item: A)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
source§

impl<T, P> Extend<T> for Separated<T, P>
where P: Default,

Extend<Pair<T, P>> is not provided because it requires either an empty sequence or one with trailing punctuation.

FromIterator impls are missing because the input iterator could be empty.

source§

fn extend<I>(&mut self, iter: I)
where I: IntoIterator<Item = T>,

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, item: A)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
source§

impl<T, P> From<Separated<T, P>> for Punctuated<T, P>

source§

fn from(separated: Separated<T, P>) -> Self

Converts to this type from the input type.
source§

impl<T, P> FromStr for Separated<T, P>
where T: Parse, P: Parse,

§

type Err = Error

The associated error which can be returned from parsing.
source§

fn from_str(string: &str) -> Result<Self>

Parses a string s to return a value of this type. Read more
source§

impl<T: Hash, P: Hash> Hash for Separated<T, P>

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl<T, P> Index<usize> for Separated<T, P>

§

type Output = T

The returned type after indexing.
source§

fn index(&self, index: usize) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl<T, P> IndexMut<usize> for Separated<T, P>

source§

fn index_mut(&mut self, index: usize) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl<'a, T, P> IntoIterator for &'a Separated<T, P>

§

type Item = &'a T

The type of the elements being iterated over.
§

type IntoIter = Iter<'a, T>

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
source§

impl<'a, T, P> IntoIterator for &'a mut Separated<T, P>

§

type Item = &'a mut T

The type of the elements being iterated over.
§

type IntoIter = IterMut<'a, T>

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
source§

impl<T, P> IntoIterator for Separated<T, P>

§

type Item = T

The type of the elements being iterated over.
§

type IntoIter = IntoIter<T>

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
source§

impl<T, P> Parse for Separated<T, P>
where T: Parse, P: Parse,

source§

fn parse(input: ParseStream<'_>) -> Result<Self>

source§

impl<T: PartialEq, P: PartialEq> PartialEq for Separated<T, P>

source§

fn eq(&self, other: &Separated<T, P>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<T, P> ToTokens for Separated<T, P>
where T: ToTokens, P: ToTokens,

source§

fn to_tokens(&self, tokens: &mut TokenStream)

Write self to the given TokenStream. Read more
source§

fn to_token_stream(&self) -> TokenStream

Convert self directly into a TokenStream object. Read more
source§

fn into_token_stream(self) -> TokenStream
where Self: Sized,

Convert self directly into a TokenStream object. Read more
source§

impl<T, P> TryFrom<Punctuated<T, P>> for Separated<T, P>
where T: ToTokens, P: ToTokens,

§

type Error = Error

The type returned in the event of a conversion error.
source§

fn try_from(inner: Punctuated<T, P>) -> Result<Self>

Performs the conversion.
source§

impl<T: Eq, P: Eq> Eq for Separated<T, P>

source§

impl<T, P> StructuralPartialEq for Separated<T, P>

Auto Trait Implementations§

§

impl<T, P> Freeze for Separated<T, P>

§

impl<T, P> RefUnwindSafe for Separated<T, P>

§

impl<T, P> Send for Separated<T, P>
where T: Send, P: Send,

§

impl<T, P> Sync for Separated<T, P>
where T: Sync, P: Sync,

§

impl<T, P> Unpin for Separated<T, P>
where T: Unpin, P: Unpin,

§

impl<T, P> UnwindSafe for Separated<T, P>
where T: UnwindSafe, P: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> Spanned for T
where T: Spanned + ?Sized,

source§

fn span(&self) -> Span

Returns a Span covering the complete contents of this syntax tree node, or Span::call_site() if this node is empty.
source§

impl<T> SpannedExt for T
where T: Spanned + ?Sized,

source§

fn span(&self) -> Span

source§

fn format_span(&self) -> SpanDisplay

source§

fn source_substring<'s>(&self, source: &'s str) -> &'s str

source§

fn byte_range(&self, source: &str) -> Range<usize>

TODO(H2CO3): a faster, less naive implementation would be great. We should use the byte offset of start to compute that of end, sparing the double scan of the source up until the start location. Read more
source§

fn char_range(&self, source: &str) -> Range<usize>

TODO(H2CO3): a faster, less naive implementation would be great. We should use the char offset of start to compute that of end, sparing the double scan of the source up until the start location. Read more
source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.