From 613609cc5eb31a87c08b63b8d5a5ac8123a7b84a Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 2 Oct 2021 20:21:23 +0300 Subject: [PATCH] minor: cleanup --- crates/mbe/src/expander/matcher.rs | 2 +- crates/mbe/src/lib.rs | 6 ++-- crates/mbe/src/parser.rs | 45 ++++++++++++++++++++---------- 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/crates/mbe/src/expander/matcher.rs b/crates/mbe/src/expander/matcher.rs index 233ca08dc13d..06c21dfd70fe 100644 --- a/crates/mbe/src/expander/matcher.rs +++ b/crates/mbe/src/expander/matcher.rs @@ -765,7 +765,7 @@ enum OpDelimited<'a> { #[derive(Debug, Clone, Copy)] struct OpDelimitedIter<'a> { - inner: &'a Vec, + inner: &'a [Op], delimited: Option<&'a tt::Delimiter>, idx: usize, } diff --git a/crates/mbe/src/lib.rs b/crates/mbe/src/lib.rs index 0a1b7cc84897..8470ea0aaf58 100644 --- a/crates/mbe/src/lib.rs +++ b/crates/mbe/src/lib.rs @@ -19,7 +19,7 @@ mod token_map; use std::fmt; use crate::{ - parser::{parse_pattern, parse_template, MetaTemplate, Op}, + parser::{MetaTemplate, Op}, tt_iter::TtIter, }; @@ -275,8 +275,8 @@ impl Rule { .expect_subtree() .map_err(|()| ParseError::Expected("expected subtree".to_string()))?; - let lhs = MetaTemplate(parse_pattern(lhs)?); - let rhs = MetaTemplate(parse_template(rhs)?); + let lhs = MetaTemplate::parse_pattern(lhs)?; + let rhs = MetaTemplate::parse_template(rhs)?; Ok(crate::Rule { lhs, rhs }) } diff --git a/crates/mbe/src/parser.rs b/crates/mbe/src/parser.rs index 0cce4146fb00..f0a9dd4a51e5 100644 --- a/crates/mbe/src/parser.rs +++ b/crates/mbe/src/parser.rs @@ -6,12 +6,38 @@ use syntax::SmolStr; use crate::{tt_iter::TtIter, ParseError}; -pub(crate) fn parse_template(template: &tt::Subtree) -> Result, ParseError> { - parse_inner(template, Mode::Template).into_iter().collect() -} +/// Consider +/// +/// ``` +/// macro_rules! an_macro { +/// ($x:expr + $y:expr) => ($y * $x) +/// } +/// ``` +/// +/// Stuff to the left of `=>` is a [`MetaTemplate`] pattern (which is matched +/// with input). +/// +/// Stuff to the right is a [`MetaTemplate`] template which is used to produce +/// output. +#[derive(Clone, Debug, PartialEq, Eq)] +pub(crate) struct MetaTemplate(pub(crate) Vec); -pub(crate) fn parse_pattern(pattern: &tt::Subtree) -> Result, ParseError> { - parse_inner(pattern, Mode::Pattern).into_iter().collect() +impl MetaTemplate { + pub(crate) fn parse_pattern(pattern: &tt::Subtree) -> Result { + let ops = + parse_inner(pattern, Mode::Pattern).into_iter().collect::>()?; + Ok(MetaTemplate(ops)) + } + + pub(crate) fn parse_template(template: &tt::Subtree) -> Result { + let ops = + parse_inner(template, Mode::Template).into_iter().collect::>()?; + Ok(MetaTemplate(ops)) + } + + pub(crate) fn iter(&self) -> impl Iterator { + self.0.iter() + } } #[derive(Clone, Debug, PartialEq, Eq)] @@ -36,15 +62,6 @@ pub(crate) enum Separator { Puncts(SmallVec<[tt::Punct; 3]>), } -#[derive(Clone, Debug, PartialEq, Eq)] -pub(crate) struct MetaTemplate(pub(crate) Vec); - -impl MetaTemplate { - pub(crate) fn iter(&self) -> impl Iterator { - self.0.iter() - } -} - // Note that when we compare a Separator, we just care about its textual value. impl PartialEq for Separator { fn eq(&self, other: &Separator) -> bool {