| // SPDX-License-Identifier: Apache-2.0 OR MIT |
| |
| // Based on https://github.com/dtolnay/syn/blob/2.0.37/src/path.rs. |
| |
| use syn::{ |
| ext::IdentExt, |
| parse::{ParseStream, Result}, |
| punctuated::Punctuated, |
| Ident, Path, PathArguments, PathSegment, Token, |
| }; |
| |
| fn parse_path_segment(input: ParseStream<'_>) -> Result<PathSegment> { |
| if input.peek(Token![super]) || input.peek(Token![self]) || input.peek(Token![crate]) { |
| 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<Path> { |
| 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 |
| }, |
| }) |
| } |