diff --git a/tasks/ast_tools/src/codegen.rs b/tasks/ast_tools/src/codegen.rs index 587395cf4aae9..a56fd308703d7 100644 --- a/tasks/ast_tools/src/codegen.rs +++ b/tasks/ast_tools/src/codegen.rs @@ -29,6 +29,7 @@ pub struct AstCodegenResult { pub trait Runner { type Context; + fn verb(&self) -> &'static str; fn name(&self) -> &'static str; fn file_path(&self) -> &'static str; fn run(&mut self, ctx: &Self::Context) -> Result>; @@ -138,7 +139,7 @@ impl AstCodegen { self } - pub fn run(self) -> Result { + pub fn run(mut self) -> Result { let modules = self .files .into_iter() @@ -148,62 +149,37 @@ impl AstCodegen { .map_ok(|it| it.map(rust_ast::Module::analyze)) .collect::>>>>()???; - // early passes - let ctx = { - let ctx = EarlyCtx::new(modules); - for mut runner in self.passes { - let name = runner.name(); - log!("Pass {name}... "); - runner.run(&ctx)?; + // Early passes + let early_ctx = EarlyCtx::new(modules); + let mut outputs = run_passes(&mut self.passes, &early_ctx)?; + + // Late passes + let late_ctx = early_ctx.into_late_ctx(); + outputs.extend(run_passes(&mut self.derives, &late_ctx)?); + outputs.extend(run_passes(&mut self.generators, &late_ctx)?); + + Ok(AstCodegenResult { outputs, schema: late_ctx.schema }) + } +} + +fn run_passes(runners: &mut [Box>], ctx: &C) -> Result> { + let mut outputs = vec![]; + for runner in runners { + log!("{} {}... ", runner.verb(), runner.name()); + + let result = runner.run(ctx); + match result { + Ok(runner_outputs) => { logln!("Done!"); + let generator_path = runner.file_path(); + outputs + .extend(runner_outputs.into_iter().map(|output| output.output(generator_path))); } - ctx.into_late_ctx() - }; - - let derives = self - .derives - .into_iter() - .map(|mut runner| { - let name = runner.name(); - log!("Derive {name}... "); - let result = runner.run(&ctx); - match result { - Ok(outputs) => { - logln!("Done!"); - let generator_path = runner.file_path(); - Ok(outputs.into_iter().map(|output| output.output(generator_path))) - } - Err(err) => { - logln!("FAILED"); - Err(err) - } - } - }) - .flatten_ok(); - - let outputs = self - .generators - .into_iter() - .map(|mut runner| { - let name = runner.name(); - log!("Generate {name}... "); - let result = runner.run(&ctx); - match result { - Ok(outputs) => { - logln!("Done!"); - let generator_path = runner.file_path(); - Ok(outputs.into_iter().map(|output| output.output(generator_path))) - } - Err(err) => { - logln!("FAILED"); - Err(err) - } - } - }) - .flatten_ok(); - - let outputs = derives.chain(outputs).collect::>>()?; - - Ok(AstCodegenResult { outputs, schema: ctx.schema }) + Err(err) => { + logln!("FAILED"); + return Err(err); + } + } } + Ok(outputs) } diff --git a/tasks/ast_tools/src/derives/mod.rs b/tasks/ast_tools/src/derives/mod.rs index 7258741c6407d..3c3da8e395f8a 100644 --- a/tasks/ast_tools/src/derives/mod.rs +++ b/tasks/ast_tools/src/derives/mod.rs @@ -127,6 +127,10 @@ macro_rules! define_derive { impl $($lifetime)? Runner for $ident $($lifetime)? { type Context = LateCtx; + fn verb(&self) -> &'static str { + "Derive" + } + fn name(&self) -> &'static str { stringify!($ident) } diff --git a/tasks/ast_tools/src/generators/mod.rs b/tasks/ast_tools/src/generators/mod.rs index 5f4738e132b78..2437f862a999a 100644 --- a/tasks/ast_tools/src/generators/mod.rs +++ b/tasks/ast_tools/src/generators/mod.rs @@ -36,6 +36,10 @@ macro_rules! define_generator { impl $($lifetime)? Runner for $ident $($lifetime)? { type Context = LateCtx; + fn verb(&self) -> &'static str { + "Generate" + } + fn name(&self) -> &'static str { stringify!($ident) } diff --git a/tasks/ast_tools/src/passes/mod.rs b/tasks/ast_tools/src/passes/mod.rs index 917c656551d78..a4a6036b3227c 100644 --- a/tasks/ast_tools/src/passes/mod.rs +++ b/tasks/ast_tools/src/passes/mod.rs @@ -47,6 +47,10 @@ macro_rules! define_pass { impl $($lifetime)? Runner for $ident $($lifetime)? { type Context = EarlyCtx; + fn verb(&self) -> &'static str { + "Run pass" + } + fn name(&self) -> &'static str { stringify!($ident) }