Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/mbe/src/lib.rs')
-rw-r--r--crates/mbe/src/lib.rs48
1 files changed, 30 insertions, 18 deletions
diff --git a/crates/mbe/src/lib.rs b/crates/mbe/src/lib.rs
index 9331798589..2622d7eac1 100644
--- a/crates/mbe/src/lib.rs
+++ b/crates/mbe/src/lib.rs
@@ -16,7 +16,6 @@ mod to_parser_input;
#[cfg(test)]
mod benchmark;
-mod token_map;
use stdx::impl_from;
use tt::Span;
@@ -30,15 +29,12 @@ use crate::{
// FIXME: we probably should re-think `token_tree_to_syntax_node` interfaces
pub use ::parser::TopEntryPoint;
-pub use tt::{Delimiter, DelimiterKind, Punct, SyntaxContext};
-
-pub use crate::{
- syntax_bridge::{
- parse_exprs_with_sep, parse_to_token_tree, parse_to_token_tree_static_span,
- syntax_node_to_token_tree, syntax_node_to_token_tree_modified, token_tree_to_syntax_node,
- SpanMapper,
- },
- token_map::SpanMap,
+pub use tt::{Delimiter, DelimiterKind, Punct};
+
+pub use crate::syntax_bridge::{
+ parse_exprs_with_sep, parse_to_token_tree, parse_to_token_tree_static_span,
+ syntax_node_to_token_tree, syntax_node_to_token_tree_modified, token_tree_to_syntax_node,
+ SpanMapper,
};
pub use crate::syntax_bridge::dummy_test_span_utils::*;
@@ -151,7 +147,12 @@ impl<S: Span> DeclarativeMacro<S> {
}
/// The old, `macro_rules! m {}` flavor.
- pub fn parse_macro_rules(tt: &tt::Subtree<S>, is_2021: bool) -> DeclarativeMacro<S> {
+ pub fn parse_macro_rules(
+ tt: &tt::Subtree<S>,
+ is_2021: bool,
+ // FIXME: Remove this once we drop support for rust 1.76 (defaults to true then)
+ new_meta_vars: bool,
+ ) -> DeclarativeMacro<S> {
// Note: this parsing can be implemented using mbe machinery itself, by
// matching against `$($lhs:tt => $rhs:tt);*` pattern, but implementing
// manually seems easier.
@@ -160,7 +161,7 @@ impl<S: Span> DeclarativeMacro<S> {
let mut err = None;
while src.len() > 0 {
- let rule = match Rule::parse(&mut src, true) {
+ let rule = match Rule::parse(&mut src, true, new_meta_vars) {
Ok(it) => it,
Err(e) => {
err = Some(Box::new(e));
@@ -187,7 +188,12 @@ impl<S: Span> DeclarativeMacro<S> {
}
/// The new, unstable `macro m {}` flavor.
- pub fn parse_macro2(tt: &tt::Subtree<S>, is_2021: bool) -> DeclarativeMacro<S> {
+ pub fn parse_macro2(
+ tt: &tt::Subtree<S>,
+ is_2021: bool,
+ // FIXME: Remove this once we drop support for rust 1.76 (defaults to true then)
+ new_meta_vars: bool,
+ ) -> DeclarativeMacro<S> {
let mut src = TtIter::new(tt);
let mut rules = Vec::new();
let mut err = None;
@@ -195,7 +201,7 @@ impl<S: Span> DeclarativeMacro<S> {
if tt::DelimiterKind::Brace == tt.delimiter.kind {
cov_mark::hit!(parse_macro_def_rules);
while src.len() > 0 {
- let rule = match Rule::parse(&mut src, true) {
+ let rule = match Rule::parse(&mut src, true, new_meta_vars) {
Ok(it) => it,
Err(e) => {
err = Some(Box::new(e));
@@ -214,7 +220,7 @@ impl<S: Span> DeclarativeMacro<S> {
}
} else {
cov_mark::hit!(parse_macro_def_simple);
- match Rule::parse(&mut src, false) {
+ match Rule::parse(&mut src, false, new_meta_vars) {
Ok(rule) => {
if src.len() != 0 {
err = Some(Box::new(ParseError::expected("remaining tokens in macro def")));
@@ -245,13 +251,19 @@ impl<S: Span> DeclarativeMacro<S> {
&self,
tt: &tt::Subtree<S>,
marker: impl Fn(&mut S) + Copy,
+ new_meta_vars: bool,
+ call_site: S,
) -> ExpandResult<tt::Subtree<S>> {
- expander::expand_rules(&self.rules, &tt, marker, self.is_2021)
+ expander::expand_rules(&self.rules, &tt, marker, self.is_2021, new_meta_vars, call_site)
}
}
impl<S: Span> Rule<S> {
- fn parse(src: &mut TtIter<'_, S>, expect_arrow: bool) -> Result<Self, ParseError> {
+ fn parse(
+ src: &mut TtIter<'_, S>,
+ expect_arrow: bool,
+ new_meta_vars: bool,
+ ) -> Result<Self, ParseError> {
let lhs = src.expect_subtree().map_err(|()| ParseError::expected("expected subtree"))?;
if expect_arrow {
src.expect_char('=').map_err(|()| ParseError::expected("expected `=`"))?;
@@ -260,7 +272,7 @@ impl<S: Span> Rule<S> {
let rhs = src.expect_subtree().map_err(|()| ParseError::expected("expected subtree"))?;
let lhs = MetaTemplate::parse_pattern(lhs)?;
- let rhs = MetaTemplate::parse_template(rhs)?;
+ let rhs = MetaTemplate::parse_template(rhs, new_meta_vars)?;
Ok(crate::Rule { lhs, rhs })
}