35 lines · 1.2 KB · Rust
RawDownload
// SPDX-License-Identifier: Apache-2.0 OR MIT use crate::parse::ParseStream;use proc_macro2::{Delimiter, TokenStream};use std::cmp::Ordering;use std::iter; pub(crate) fn between<'a>(begin: ParseStream<'a>, end: ParseStream<'a>) -> TokenStream {    let end = end.cursor();    let mut cursor = begin.cursor();    assert!(crate::buffer::same_buffer(end, cursor));     let mut tokens = TokenStream::new();    while cursor != end {        let (tt, next) = cursor.token_tree().unwrap();         if crate::buffer::cmp_assuming_same_buffer(end, next) == Ordering::Less {            // A syntax node can cross the boundary of a None-delimited group            // due to such groups being transparent to the parser in most cases.            // Any time this occurs the group is known to be semantically            // irrelevant. https://github.com/dtolnay/syn/issues/1235            if let Some((inside, _span, after)) = cursor.group(Delimiter::None) {                assert!(next == after);                cursor = inside;                continue;            } else {                panic!("verbatim end must not be inside a delimited group");            }        }         tokens.extend(iter::once(tt));        cursor = next;    }    tokens}