@@ -16,7 +16,7 @@ use rustc_span::{Ident, Span};
1616use tracing:: debug;
1717
1818use crate :: DiagAndSess ;
19- use crate :: context:: { EarlyContext , LintContext , LintStore } ;
19+ use crate :: context:: { EarlyContext , EarlyLintPassFactory , LintContext , LintStore } ;
2020use crate :: passes:: { EarlyLintPass , EarlyLintPassObject } ;
2121
2222pub ( super ) mod diagnostics;
@@ -316,7 +316,6 @@ pub fn check_ast_node<'a>(
316316 lint_store : & LintStore ,
317317 registered_tools : & RegisteredTools ,
318318 lint_buffer : Option < LintBuffer > ,
319- builtin_lints : impl EarlyLintPass + ' static ,
320319 check_node : EarlyCheckNode < ' a > ,
321320) {
322321 let context = EarlyContext :: new (
@@ -328,35 +327,20 @@ pub fn check_ast_node<'a>(
328327 lint_buffer. unwrap_or_default ( ) ,
329328 ) ;
330329
331- // Note: `passes` is often empty. In that case, it's faster to run
332- // `builtin_lints` directly rather than bundling it up into the
333- // `RuntimeCombinedEarlyLintPass`.
334- let passes =
335- if pre_expansion { & lint_store. pre_expansion_passes } else { & lint_store. early_passes } ;
336- if passes. is_empty ( ) {
337- check_ast_node_inner ( sess, check_node, context, builtin_lints) ;
330+ let context = if pre_expansion {
331+ let builtin_lints = crate :: BuiltinCombinedPreExpansionLintPass :: new ( ) ;
332+ let passes = & lint_store. pre_expansion_passes ;
333+ run_passes ( check_node, context, builtin_lints, passes)
338334 } else {
339- let mut passes: Vec < _ > = passes. iter ( ) . map ( |mk_pass| ( mk_pass) ( ) ) . collect ( ) ;
340- passes. push ( Box :: new ( builtin_lints) ) ;
341- let pass = RuntimeCombinedEarlyLintPass { passes } ;
342- check_ast_node_inner ( sess, check_node, context, pass) ;
343- }
344- }
345-
346- fn check_ast_node_inner < ' a , T : EarlyLintPass > (
347- sess : & Session ,
348- check_node : EarlyCheckNode < ' a > ,
349- context : EarlyContext < ' _ > ,
350- pass : T ,
351- ) {
352- let mut cx = EarlyContextAndPass { context, pass } ;
353-
354- cx. with_lint_attrs ( check_node. id ( ) , check_node. attrs ( ) , |cx| check_node. check ( cx) ) ;
335+ let builtin_lints = crate :: BuiltinCombinedEarlyLintPass :: new ( ) ;
336+ let passes = & lint_store. early_passes ;
337+ run_passes ( check_node, context, builtin_lints, passes)
338+ } ;
355339
356340 // All of the buffered lints should have been emitted at this point.
357341 // If not, that means that we somehow buffered a lint for a node id
358342 // that was not lint-checked (perhaps it doesn't exist?). This is a bug.
359- for ( id, lints) in cx . context . buffered . map {
343+ for ( id, lints) in context. buffered . map {
360344 if !lints. is_empty ( ) {
361345 assert ! (
362346 sess. dcx( ) . has_errors( ) . is_some( ) ,
@@ -367,3 +351,32 @@ fn check_ast_node_inner<'a, T: EarlyLintPass>(
367351 }
368352 }
369353}
354+
355+ fn run_passes < ' a , ' ecx , T : EarlyLintPass + ' static > (
356+ check_node : EarlyCheckNode < ' a > ,
357+ context : EarlyContext < ' ecx > ,
358+ builtin_lints : T ,
359+ passes : & [ EarlyLintPassFactory ] ,
360+ ) -> EarlyContext < ' ecx > {
361+ // Note: `passes` is often empty. In that case, it's faster to run
362+ // `builtin_lints` directly rather than bundling it up into the
363+ // `RuntimeCombinedEarlyLintPass`.
364+ if passes. is_empty ( ) {
365+ run_pass ( check_node, context, builtin_lints)
366+ } else {
367+ let mut passes: Vec < _ > = passes. iter ( ) . map ( |mk_pass| mk_pass ( ) ) . collect ( ) ;
368+ passes. push ( Box :: new ( builtin_lints) ) ;
369+ let pass = RuntimeCombinedEarlyLintPass { passes } ;
370+ run_pass ( check_node, context, pass)
371+ }
372+ }
373+
374+ fn run_pass < ' a , ' ecx , T : EarlyLintPass > (
375+ check_node : EarlyCheckNode < ' a > ,
376+ context : EarlyContext < ' ecx > ,
377+ pass : T ,
378+ ) -> EarlyContext < ' ecx > {
379+ let mut cx = EarlyContextAndPass { context, pass } ;
380+ cx. with_lint_attrs ( check_node. id ( ) , check_node. attrs ( ) , |cx| check_node. check ( cx) ) ;
381+ cx. context
382+ }
0 commit comments