parse lifetimes

This commit is contained in:
Jana Dönszelmann 2026-04-03 17:24:45 +02:00
parent 53fc09c02f
commit 47f4c1e8c2
No known key found for this signature in database
6 changed files with 402 additions and 12 deletions

View file

@ -263,11 +263,30 @@ impl<'a> Atom<'a> {
impl<'a> Token<'a> {
fn parse_without_separator<E: ParserError<&'a str> + 'a>() -> impl Parser<&'a str, Self, E> {
use winnow::{combinator::*, prelude::*};
use winnow::{combinator::*, prelude::*, token::*};
let delimited: Box<dyn Parser<&'a str, Self, E>> =
Box::new(Delimited::parse().map(Self::Delimited));
let lifetime = (
"'",
alt((
repeat::<_, _, Cow<'a, str>, _, _>(
1..=3,
any.verify(|i: &char| i.is_ascii_lowercase() || *i == '_'),
)
.take(),
"{erased}",
)),
peek(alt((
any::<&str, _>
.verify(|i: &char| !i.is_alphabetic() && *i != '\'')
.value(()),
eof::<&str, _>.value(()),
))),
)
.map(|(_, lifetime, _)| Token::Lifetime(lifetime.into()));
trace(
"token-without-sep",
alt((
@ -276,6 +295,7 @@ impl<'a> Token<'a> {
"None".value(Self::None),
Number::parse().map(Self::Number),
Path::parse().map(Self::Path),
lifetime,
AnyString::parse().map(Self::String),
delimited,
Atom::parse(|| {
@ -1116,14 +1136,8 @@ mod tests {
leading_space: Space(
"",
),
token: String(
AnyString {
prefix: "",
ty: Single,
contents: "_, ",
num_hashtags: 0,
suffix: "",
},
token: Lifetime(
"_",
),
},
Segment {
@ -1132,10 +1146,18 @@ mod tests {
),
token: Atom(
Text(
"_",
",",
),
),
},
Segment {
leading_space: Space(
" ",
),
token: Lifetime(
"_",
),
},
],
trailing_space: Space(
"",
@ -1251,4 +1273,342 @@ mod tests {
}
"#);
}
#[test]
fn parse_ex2() {
assert_debug_snapshot!(parse(r#"super_combine_consts::<rustc_type_ir::relate::solver_relating::SolverRelating<'_, rustc_infer::infer::InferCtxt<'_>, rustc_middle::ty::context::TyCtxt<'_>>>(?1c, ?2c)"#), @r#"
Segments {
segments: [
Segment {
leading_space: Space(
"",
),
token: Separated {
before: Atom(
Text(
"super_combine_consts",
),
),
space_before: Space(
"",
),
separator: DoubleColon,
after: Segment {
leading_space: Space(
"",
),
token: Delimited(
Delimited {
prefix: None,
delimiter: Angle,
contents: Segments {
segments: [
Segment {
leading_space: Space(
"",
),
token: Separated {
before: Atom(
Text(
"rustc_type_ir",
),
),
space_before: Space(
"",
),
separator: DoubleColon,
after: Segment {
leading_space: Space(
"",
),
token: Separated {
before: Atom(
Text(
"relate",
),
),
space_before: Space(
"",
),
separator: DoubleColon,
after: Segment {
leading_space: Space(
"",
),
token: Separated {
before: Atom(
Text(
"solver_relating",
),
),
space_before: Space(
"",
),
separator: DoubleColon,
after: Segment {
leading_space: Space(
"",
),
token: Delimited(
Delimited {
prefix: Some(
(
Text(
"SolverRelating",
),
Space(
"",
),
),
),
delimiter: Angle,
contents: Segments {
segments: [
Segment {
leading_space: Space(
"",
),
token: Lifetime(
"_",
),
},
Segment {
leading_space: Space(
"",
),
token: Atom(
Text(
",",
),
),
},
Segment {
leading_space: Space(
" ",
),
token: Separated {
before: Atom(
Text(
"rustc_infer",
),
),
space_before: Space(
"",
),
separator: DoubleColon,
after: Segment {
leading_space: Space(
"",
),
token: Separated {
before: Atom(
Text(
"infer",
),
),
space_before: Space(
"",
),
separator: DoubleColon,
after: Segment {
leading_space: Space(
"",
),
token: Delimited(
Delimited {
prefix: Some(
(
Text(
"InferCtxt",
),
Space(
"",
),
),
),
delimiter: Angle,
contents: Segments {
segments: [
Segment {
leading_space: Space(
"",
),
token: Lifetime(
"_",
),
},
],
trailing_space: Space(
"",
),
},
},
),
},
},
},
},
},
Segment {
leading_space: Space(
"",
),
token: Atom(
Text(
",",
),
),
},
Segment {
leading_space: Space(
" ",
),
token: Separated {
before: Atom(
Text(
"rustc_middle",
),
),
space_before: Space(
"",
),
separator: DoubleColon,
after: Segment {
leading_space: Space(
"",
),
token: Separated {
before: Atom(
Text(
"ty",
),
),
space_before: Space(
"",
),
separator: DoubleColon,
after: Segment {
leading_space: Space(
"",
),
token: Separated {
before: Atom(
Text(
"context",
),
),
space_before: Space(
"",
),
separator: DoubleColon,
after: Segment {
leading_space: Space(
"",
),
token: Delimited(
Delimited {
prefix: Some(
(
Text(
"TyCtxt",
),
Space(
"",
),
),
),
delimiter: Angle,
contents: Segments {
segments: [
Segment {
leading_space: Space(
"",
),
token: Lifetime(
"_",
),
},
],
trailing_space: Space(
"",
),
},
},
),
},
},
},
},
},
},
},
],
trailing_space: Space(
"",
),
},
},
),
},
},
},
},
},
},
},
],
trailing_space: Space(
"",
),
},
},
),
},
},
},
Segment {
leading_space: Space(
"",
),
token: Delimited(
Delimited {
prefix: None,
delimiter: Paren,
contents: Segments {
segments: [
Segment {
leading_space: Space(
"",
),
token: Atom(
Text(
"?1c,",
),
),
},
Segment {
leading_space: Space(
" ",
),
token: Atom(
Text(
"?2c",
),
),
},
],
trailing_space: Space(
"",
),
},
},
),
},
],
trailing_space: Space(
"",
),
}
"#)
}
}