Simplify `CfgEval`.

It can contain an owned value instead of a reference.
This commit is contained in:
Nicholas Nethercote 2024-06-27 10:33:46 +10:00
parent 7d97c59438
commit 1680b791d5
1 changed files with 8 additions and 10 deletions

View File

@ -38,16 +38,14 @@ pub(crate) fn cfg_eval(
lint_node_id: NodeId, lint_node_id: NodeId,
) -> Annotatable { ) -> Annotatable {
let features = Some(features); let features = Some(features);
CfgEval { cfg: &mut StripUnconfigured { sess, features, config_tokens: true, lint_node_id } } CfgEval(StripUnconfigured { sess, features, config_tokens: true, lint_node_id })
.configure_annotatable(annotatable) .configure_annotatable(annotatable)
// Since the item itself has already been configured by the `InvocationCollector`, // Since the item itself has already been configured by the `InvocationCollector`,
// we know that fold result vector will contain exactly one element. // we know that fold result vector will contain exactly one element.
.unwrap() .unwrap()
} }
struct CfgEval<'a, 'b> { struct CfgEval<'a>(StripUnconfigured<'a>);
cfg: &'a mut StripUnconfigured<'b>,
}
fn flat_map_annotatable( fn flat_map_annotatable(
vis: &mut impl MutVisitor, vis: &mut impl MutVisitor,
@ -125,9 +123,9 @@ fn has_cfg_or_cfg_attr(annotatable: &Annotatable) -> bool {
res.is_break() res.is_break()
} }
impl CfgEval<'_, '_> { impl CfgEval<'_> {
fn configure<T: HasAttrs + HasTokens>(&mut self, node: T) -> Option<T> { fn configure<T: HasAttrs + HasTokens>(&mut self, node: T) -> Option<T> {
self.cfg.configure(node) self.0.configure(node)
} }
fn configure_annotatable(&mut self, mut annotatable: Annotatable) -> Option<Annotatable> { fn configure_annotatable(&mut self, mut annotatable: Annotatable) -> Option<Annotatable> {
@ -196,7 +194,7 @@ impl CfgEval<'_, '_> {
// Re-parse the tokens, setting the `capture_cfg` flag to save extra information // Re-parse the tokens, setting the `capture_cfg` flag to save extra information
// to the captured `AttrTokenStream` (specifically, we capture // to the captured `AttrTokenStream` (specifically, we capture
// `AttrTokenTree::AttributesData` for all occurrences of `#[cfg]` and `#[cfg_attr]`) // `AttrTokenTree::AttributesData` for all occurrences of `#[cfg]` and `#[cfg_attr]`)
let mut parser = Parser::new(&self.cfg.sess.psess, orig_tokens, None); let mut parser = Parser::new(&self.0.sess.psess, orig_tokens, None);
parser.capture_cfg = true; parser.capture_cfg = true;
match parse_annotatable_with(&mut parser) { match parse_annotatable_with(&mut parser) {
Ok(a) => annotatable = a, Ok(a) => annotatable = a,
@ -212,16 +210,16 @@ impl CfgEval<'_, '_> {
} }
} }
impl MutVisitor for CfgEval<'_, '_> { impl MutVisitor for CfgEval<'_> {
#[instrument(level = "trace", skip(self))] #[instrument(level = "trace", skip(self))]
fn visit_expr(&mut self, expr: &mut P<ast::Expr>) { fn visit_expr(&mut self, expr: &mut P<ast::Expr>) {
self.cfg.configure_expr(expr, false); self.0.configure_expr(expr, false);
mut_visit::noop_visit_expr(expr, self); mut_visit::noop_visit_expr(expr, self);
} }
#[instrument(level = "trace", skip(self))] #[instrument(level = "trace", skip(self))]
fn visit_method_receiver_expr(&mut self, expr: &mut P<ast::Expr>) { fn visit_method_receiver_expr(&mut self, expr: &mut P<ast::Expr>) {
self.cfg.configure_expr(expr, true); self.0.configure_expr(expr, true);
mut_visit::noop_visit_expr(expr, self); mut_visit::noop_visit_expr(expr, self);
} }