This commit is contained in:
Lukas Wirth 2024-04-18 11:00:22 +02:00
parent 6bfdd38c69
commit 4135696ea7
4 changed files with 11 additions and 6 deletions

View file

@ -3,7 +3,7 @@
use base_db::{salsa, CrateId, FileId, SourceDatabase}; use base_db::{salsa, CrateId, FileId, SourceDatabase};
use either::Either; use either::Either;
use limit::Limit; use limit::Limit;
use mbe::syntax_node_to_token_tree; use mbe::{syntax_node_to_token_tree, MatchedArmIndex};
use rustc_hash::FxHashSet; use rustc_hash::FxHashSet;
use span::{AstIdMap, Span, SyntaxContextData, SyntaxContextId}; use span::{AstIdMap, Span, SyntaxContextData, SyntaxContextId};
use syntax::{ast, AstNode, Parse, SyntaxElement, SyntaxError, SyntaxNode, SyntaxToken, T}; use syntax::{ast, AstNode, Parse, SyntaxElement, SyntaxError, SyntaxNode, SyntaxToken, T};
@ -546,7 +546,7 @@ fn macro_expand(
db: &dyn ExpandDatabase, db: &dyn ExpandDatabase,
macro_call_id: MacroCallId, macro_call_id: MacroCallId,
loc: MacroCallLoc, loc: MacroCallLoc,
) -> ExpandResult<(CowArc<tt::Subtree>, Option<u32>)> { ) -> ExpandResult<(CowArc<tt::Subtree>, MatchedArmIndex)> {
let _p = tracing::span!(tracing::Level::INFO, "macro_expand").entered(); let _p = tracing::span!(tracing::Level::INFO, "macro_expand").entered();
let (ExpandResult { value: (tt, matched_arm), err }, span) = match loc.def.kind { let (ExpandResult { value: (tt, matched_arm), err }, span) = match loc.def.kind {

View file

@ -9,7 +9,7 @@ use rustc_hash::FxHashMap;
use span::{Edition, Span}; use span::{Edition, Span};
use syntax::SmolStr; use syntax::SmolStr;
use crate::{parser::MetaVarKind, ExpandError, ExpandResult}; use crate::{parser::MetaVarKind, ExpandError, ExpandResult, MatchedArmIndex};
pub(crate) fn expand_rules( pub(crate) fn expand_rules(
rules: &[crate::Rule], rules: &[crate::Rule],
@ -18,7 +18,7 @@ pub(crate) fn expand_rules(
new_meta_vars: bool, new_meta_vars: bool,
call_site: Span, call_site: Span,
def_site_edition: Edition, def_site_edition: Edition,
) -> ExpandResult<(tt::Subtree<Span>, Option<u32>)> { ) -> ExpandResult<(tt::Subtree<Span>, MatchedArmIndex)> {
let mut match_: Option<(matcher::Match, &crate::Rule, usize)> = None; let mut match_: Option<(matcher::Match, &crate::Rule, usize)> = None;
for (idx, rule) in rules.iter().enumerate() { for (idx, rule) in rules.iter().enumerate() {
let new_match = matcher::match_(&rule.lhs, input, def_site_edition); let new_match = matcher::match_(&rule.lhs, input, def_site_edition);
@ -53,7 +53,7 @@ pub(crate) fn expand_rules(
// if we got here, there was no match without errors // if we got here, there was no match without errors
let ExpandResult { value, err: transcribe_err } = let ExpandResult { value, err: transcribe_err } =
transcriber::transcribe(&rule.rhs, &match_.bindings, marker, new_meta_vars, call_site); transcriber::transcribe(&rule.rhs, &match_.bindings, marker, new_meta_vars, call_site);
ExpandResult { value: (value, Some(idx as u32)), err: match_.err.or(transcribe_err) } ExpandResult { value: (value, idx.try_into().ok()), err: match_.err.or(transcribe_err) }
} else { } else {
ExpandResult::new( ExpandResult::new(
( (

View file

@ -122,6 +122,9 @@ impl fmt::Display for CountError {
} }
} }
/// Index of the matched macro arm on successful expansion.
pub type MatchedArmIndex = Option<u32>;
/// This struct contains AST for a single `macro_rules` definition. What might /// This struct contains AST for a single `macro_rules` definition. What might
/// be very confusing is that AST has almost exactly the same shape as /// be very confusing is that AST has almost exactly the same shape as
/// `tt::TokenTree`, but there's a crucial difference: in macro rules, `$ident` /// `tt::TokenTree`, but there's a crucial difference: in macro rules, `$ident`
@ -251,7 +254,7 @@ impl DeclarativeMacro {
new_meta_vars: bool, new_meta_vars: bool,
call_site: Span, call_site: Span,
def_site_edition: Edition, def_site_edition: Edition,
) -> ExpandResult<(tt::Subtree<Span>, Option<u32>)> { ) -> ExpandResult<(tt::Subtree<Span>, MatchedArmIndex)> {
expander::expand_rules(&self.rules, tt, marker, new_meta_vars, call_site, def_site_edition) expander::expand_rules(&self.rules, tt, marker, new_meta_vars, call_site, def_site_edition)
} }
} }

View file

@ -15,6 +15,8 @@ use crate::{
#[derive(Debug, PartialEq, Eq, Clone, Hash)] #[derive(Debug, PartialEq, Eq, Clone, Hash)]
pub struct SpanMap<S> { pub struct SpanMap<S> {
spans: Vec<(TextSize, SpanData<S>)>, spans: Vec<(TextSize, SpanData<S>)>,
/// Index of the matched macro arm on successful expansion for declarative macros.
// FIXME: Does it make sense to have this here?
pub matched_arm: Option<u32>, pub matched_arm: Option<u32>,
} }