parse lifetimes
This commit is contained in:
parent
53fc09c02f
commit
47f4c1e8c2
6 changed files with 402 additions and 12 deletions
|
|
@ -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(
|
||||
"",
|
||||
),
|
||||
}
|
||||
"#)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue