use syn::{ ext::IdentExt, parse::{ParseStream, Result}, punctuated::Punctuated, Ident, Path, PathArguments, PathSegment, Token, }; fn parse_path_segment(input: ParseStream<'_>) -> Result { if input.peek(Token![super]) || input.peek(Token![self]) || input.peek(Token![crate]) || input.peek(Token![extern]) { let ident = input.call(Ident::parse_any)?; return Ok(PathSegment::from(ident)); } let ident = if input.peek(Token![Self]) { input.call(Ident::parse_any)? } else { input.parse()? }; if input.peek(Token![::]) && input.peek3(Token![<]) { Ok(PathSegment { ident, arguments: PathArguments::AngleBracketed(input.parse()?), }) } else { Ok(PathSegment::from(ident)) } } pub(crate) fn parse_path(input: ParseStream<'_>) -> Result { Ok(Path { leading_colon: input.parse()?, segments: { let mut segments = Punctuated::new(); let value = parse_path_segment(input)?; segments.push_value(value); while input.peek(Token![::]) { let punct: Token![::] = input.parse()?; segments.push_punct(punct); let value = parse_path_segment(input)?; segments.push_value(value); } segments }, }) }