mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-28 04:44:57 +00:00
minor: simplify
This commit is contained in:
parent
613609cc5e
commit
4e352275d1
1 changed files with 18 additions and 22 deletions
|
@ -24,20 +24,28 @@ pub(crate) struct MetaTemplate(pub(crate) Vec<Op>);
|
||||||
|
|
||||||
impl MetaTemplate {
|
impl MetaTemplate {
|
||||||
pub(crate) fn parse_pattern(pattern: &tt::Subtree) -> Result<MetaTemplate, ParseError> {
|
pub(crate) fn parse_pattern(pattern: &tt::Subtree) -> Result<MetaTemplate, ParseError> {
|
||||||
let ops =
|
MetaTemplate::parse(pattern, Mode::Pattern)
|
||||||
parse_inner(pattern, Mode::Pattern).into_iter().collect::<Result<_, ParseError>>()?;
|
|
||||||
Ok(MetaTemplate(ops))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn parse_template(template: &tt::Subtree) -> Result<MetaTemplate, ParseError> {
|
pub(crate) fn parse_template(template: &tt::Subtree) -> Result<MetaTemplate, ParseError> {
|
||||||
let ops =
|
MetaTemplate::parse(template, Mode::Template)
|
||||||
parse_inner(template, Mode::Template).into_iter().collect::<Result<_, ParseError>>()?;
|
|
||||||
Ok(MetaTemplate(ops))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn iter(&self) -> impl Iterator<Item = &Op> {
|
pub(crate) fn iter(&self) -> impl Iterator<Item = &Op> {
|
||||||
self.0.iter()
|
self.0.iter()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn parse(tt: &tt::Subtree, mode: Mode) -> Result<MetaTemplate, ParseError> {
|
||||||
|
let mut src = TtIter::new(tt);
|
||||||
|
|
||||||
|
let mut res = Vec::new();
|
||||||
|
while let Some(first) = src.next() {
|
||||||
|
let op = next_op(first, &mut src, mode)?;
|
||||||
|
res.push(op)
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(MetaTemplate(res))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||||
|
@ -96,15 +104,6 @@ enum Mode {
|
||||||
Template,
|
Template,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_inner(tt: &tt::Subtree, mode: Mode) -> Vec<Result<Op, ParseError>> {
|
|
||||||
let mut src = TtIter::new(tt);
|
|
||||||
std::iter::from_fn(move || {
|
|
||||||
let first = src.next()?;
|
|
||||||
Some(next_op(first, &mut src, mode))
|
|
||||||
})
|
|
||||||
.collect()
|
|
||||||
}
|
|
||||||
|
|
||||||
macro_rules! err {
|
macro_rules! err {
|
||||||
($($tt:tt)*) => {
|
($($tt:tt)*) => {
|
||||||
ParseError::UnexpectedToken(($($tt)*).to_string())
|
ParseError::UnexpectedToken(($($tt)*).to_string())
|
||||||
|
@ -128,10 +127,8 @@ fn next_op<'a>(first: &tt::TokenTree, src: &mut TtIter<'a>, mode: Mode) -> Resul
|
||||||
match second {
|
match second {
|
||||||
tt::TokenTree::Subtree(subtree) => {
|
tt::TokenTree::Subtree(subtree) => {
|
||||||
let (separator, kind) = parse_repeat(src)?;
|
let (separator, kind) = parse_repeat(src)?;
|
||||||
let tokens = parse_inner(subtree, mode)
|
let tokens = MetaTemplate::parse(subtree, mode)?;
|
||||||
.into_iter()
|
Op::Repeat { tokens, separator, kind }
|
||||||
.collect::<Result<Vec<Op>, ParseError>>()?;
|
|
||||||
Op::Repeat { tokens: MetaTemplate(tokens), separator, kind }
|
|
||||||
}
|
}
|
||||||
tt::TokenTree::Leaf(leaf) => match leaf {
|
tt::TokenTree::Leaf(leaf) => match leaf {
|
||||||
tt::Leaf::Punct(_) => {
|
tt::Leaf::Punct(_) => {
|
||||||
|
@ -162,9 +159,8 @@ fn next_op<'a>(first: &tt::TokenTree, src: &mut TtIter<'a>, mode: Mode) -> Resul
|
||||||
}
|
}
|
||||||
tt::TokenTree::Leaf(tt) => Op::Leaf(tt.clone()),
|
tt::TokenTree::Leaf(tt) => Op::Leaf(tt.clone()),
|
||||||
tt::TokenTree::Subtree(subtree) => {
|
tt::TokenTree::Subtree(subtree) => {
|
||||||
let tokens =
|
let tokens = MetaTemplate::parse(subtree, mode)?;
|
||||||
parse_inner(subtree, mode).into_iter().collect::<Result<Vec<Op>, ParseError>>()?;
|
Op::Subtree { tokens, delimiter: subtree.delimiter }
|
||||||
Op::Subtree { tokens: MetaTemplate(tokens), delimiter: subtree.delimiter }
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Ok(res)
|
Ok(res)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue