From 00982e477ede7f94bb0bbf2ffd2576be631123b7 Mon Sep 17 00:00:00 2001 From: Mitchell Mackert <98185767+gr00vytvniks@users.noreply.github.com> Date: Wed, 21 Jun 2023 17:46:34 -0500 Subject: [PATCH] Add flag to reverse errors (#4142) Adds the ability to reverse errors and warnings in either the command line or via a BuildProfile. closes #3860 --- forc-pkg/src/manifest.rs | 3 +++ forc-pkg/src/pkg.rs | 24 ++++++++++++++++++++--- forc-plugins/forc-client/src/op/deploy.rs | 1 + forc-plugins/forc-client/src/op/run.rs | 1 + forc-util/src/lib.rs | 20 +++++++++++++++---- forc/src/cli/commands/test.rs | 1 + forc/src/cli/shared.rs | 3 +++ forc/src/ops/forc_build.rs | 1 + forc/src/ops/forc_contract_id.rs | 1 + forc/src/ops/forc_predicate_root.rs | 1 + 10 files changed, 49 insertions(+), 7 deletions(-) diff --git a/forc-pkg/src/manifest.rs b/forc-pkg/src/manifest.rs index 11e2fc158cb..77cdf38bae2 100644 --- a/forc-pkg/src/manifest.rs +++ b/forc-pkg/src/manifest.rs @@ -226,6 +226,7 @@ pub struct BuildProfile { pub json_abi_with_callpaths: bool, #[serde(default)] pub error_on_warnings: bool, + pub reverse_results: bool, } impl DependencyDetails { @@ -697,6 +698,7 @@ impl BuildProfile { include_tests: false, json_abi_with_callpaths: false, error_on_warnings: false, + reverse_results: false, } } @@ -714,6 +716,7 @@ impl BuildProfile { include_tests: false, json_abi_with_callpaths: false, error_on_warnings: false, + reverse_results: false, } } } diff --git a/forc-pkg/src/pkg.rs b/forc-pkg/src/pkg.rs index 7d98d460a97..393f1c1c4bb 100644 --- a/forc-pkg/src/pkg.rs +++ b/forc-pkg/src/pkg.rs @@ -266,6 +266,8 @@ pub struct PrintOpts { pub intermediate_asm: bool, /// Print the generated Sway IR (Intermediate Representation). pub ir: bool, + /// Output build errors and warnings in reverse order. + pub reverse_order: bool, } #[derive(Default, Clone)] @@ -1804,8 +1806,9 @@ pub fn compile( let sway_build_config = sway_build_config(pkg.manifest_file.dir(), &entry_path, pkg.target, profile)?; let terse_mode = profile.terse; + let reverse_results = profile.reverse_results; let fail = |warnings, errors| { - print_on_failure(engines.se(), terse_mode, warnings, errors); + print_on_failure(engines.se(), terse_mode, warnings, errors, reverse_results); bail!("Failed to compile {}", pkg.name); }; @@ -2314,7 +2317,13 @@ pub fn build( }; let fail = |warnings, errors| { - print_on_failure(engines.se(), profile.terse, warnings, errors); + print_on_failure( + engines.se(), + profile.terse, + warnings, + errors, + profile.reverse_results, + ); bail!("Failed to compile {}", pkg.name); }; @@ -2410,7 +2419,16 @@ pub fn build( contract_id_value.clone(), ) { Ok(o) => o, - Err(errs) => return fail(&[], &errs), + Err(errs) => { + print_on_failure( + engines.se(), + profile.terse, + &[], + &errs, + profile.reverse_results, + ); + bail!("Failed to compile {}", pkg.name); + } }; let mut compiled = compile( diff --git a/forc-plugins/forc-client/src/op/deploy.rs b/forc-plugins/forc-client/src/op/deploy.rs index 8e2cf50e56a..0a8ebdd50c3 100644 --- a/forc-plugins/forc-client/src/op/deploy.rs +++ b/forc-plugins/forc-client/src/op/deploy.rs @@ -241,6 +241,7 @@ fn build_opts_from_cmd(cmd: &cmd::Deploy) -> pkg::BuildOpts { finalized_asm: cmd.print.finalized_asm, intermediate_asm: cmd.print.intermediate_asm, ir: cmd.print.ir, + reverse_order: cmd.print.reverse_order, }, time_phases: cmd.print.time_phases, metrics_outfile: cmd.print.metrics_outfile.clone(), diff --git a/forc-plugins/forc-client/src/op/run.rs b/forc-plugins/forc-client/src/op/run.rs index 33c6d881c14..4bd434b7109 100644 --- a/forc-plugins/forc-client/src/op/run.rs +++ b/forc-plugins/forc-client/src/op/run.rs @@ -160,6 +160,7 @@ fn build_opts_from_cmd(cmd: &cmd::Run) -> pkg::BuildOpts { finalized_asm: cmd.print.finalized_asm, intermediate_asm: cmd.print.intermediate_asm, ir: cmd.print.ir, + reverse_order: cmd.print.reverse_order, }, minify: pkg::MinifyOpts { json_abi: cmd.minify.json_abi, diff --git a/forc-util/src/lib.rs b/forc-util/src/lib.rs index fa34e2a6a4d..8d98422bd0b 100644 --- a/forc-util/src/lib.rs +++ b/forc-util/src/lib.rs @@ -395,15 +395,27 @@ pub fn print_on_failure( terse_mode: bool, warnings: &[CompileWarning], errors: &[CompileError], + reverse_results: bool, ) { let e_len = errors.len(); let w_len = warnings.len(); if !terse_mode { - warnings - .iter() - .for_each(|w| format_warning(source_engine, w)); - errors.iter().for_each(|e| format_err(source_engine, e)); + if reverse_results { + warnings + .iter() + .rev() + .for_each(|w| format_warning(source_engine, w)); + errors + .iter() + .rev() + .for_each(|e| format_err(source_engine, e)); + } else { + warnings + .iter() + .for_each(|w| format_warning(source_engine, w)); + errors.iter().for_each(|e| format_err(source_engine, e)); + } } if e_len == 0 && w_len > 0 { diff --git a/forc/src/cli/commands/test.rs b/forc/src/cli/commands/test.rs index b263fc97576..91a84e75ac8 100644 --- a/forc/src/cli/commands/test.rs +++ b/forc/src/cli/commands/test.rs @@ -201,6 +201,7 @@ fn opts_from_cmd(cmd: Command) -> forc_test::Opts { finalized_asm: cmd.build.print.finalized_asm, intermediate_asm: cmd.build.print.intermediate_asm, ir: cmd.build.print.ir, + reverse_order: cmd.build.print.reverse_order, }, time_phases: cmd.build.print.time_phases, metrics_outfile: cmd.build.print.metrics_outfile, diff --git a/forc/src/cli/shared.rs b/forc/src/cli/shared.rs index 7bf7df3b268..082230e002e 100644 --- a/forc/src/cli/shared.rs +++ b/forc/src/cli/shared.rs @@ -86,6 +86,9 @@ pub struct Print { /// Output the time elapsed over each part of the compilation process. #[clap(long)] pub time_phases: bool, + /// Output build errors and warnings in reverse order. + #[clap(long)] + pub reverse_order: bool, /// Output compilation metrics into file. #[clap(long)] pub metrics_outfile: Option, diff --git a/forc/src/ops/forc_build.rs b/forc/src/ops/forc_build.rs index 5c464432d34..a3fe6fe0a5d 100644 --- a/forc/src/ops/forc_build.rs +++ b/forc/src/ops/forc_build.rs @@ -26,6 +26,7 @@ fn opts_from_cmd(cmd: BuildCommand) -> pkg::BuildOpts { finalized_asm: cmd.build.print.finalized_asm, intermediate_asm: cmd.build.print.intermediate_asm, ir: cmd.build.print.ir, + reverse_order: cmd.build.print.reverse_order, }, time_phases: cmd.build.print.time_phases, metrics_outfile: cmd.build.print.metrics_outfile, diff --git a/forc/src/ops/forc_contract_id.rs b/forc/src/ops/forc_contract_id.rs index 3cbdef52263..e28690a7aec 100644 --- a/forc/src/ops/forc_contract_id.rs +++ b/forc/src/ops/forc_contract_id.rs @@ -62,6 +62,7 @@ fn build_opts_from_cmd(cmd: &ContractIdCommand) -> pkg::BuildOpts { finalized_asm: cmd.print.finalized_asm, intermediate_asm: cmd.print.intermediate_asm, ir: cmd.print.ir, + reverse_order: cmd.print.reverse_order, }, time_phases: cmd.print.time_phases, metrics_outfile: cmd.print.metrics_outfile.clone(), diff --git a/forc/src/ops/forc_predicate_root.rs b/forc/src/ops/forc_predicate_root.rs index a2f95ba71ba..a06c4535ddb 100644 --- a/forc/src/ops/forc_predicate_root.rs +++ b/forc/src/ops/forc_predicate_root.rs @@ -30,6 +30,7 @@ fn build_opts_from_cmd(cmd: PredicateRootCommand) -> pkg::BuildOpts { finalized_asm: cmd.print.finalized_asm, intermediate_asm: cmd.print.intermediate_asm, ir: cmd.print.ir, + reverse_order: cmd.print.reverse_order, }, time_phases: cmd.print.time_phases, metrics_outfile: cmd.print.metrics_outfile,