From 45454ced01f9493fad8425b2b402d6563c61287c Mon Sep 17 00:00:00 2001 From: KtorZ Date: Thu, 16 Feb 2023 14:33:19 +0100 Subject: [PATCH] Make tracing configurable, when relevant. Tracing is now turn OFF by default when: - building project - building documentation - building dependencies It can be turned ON only when building project using `--keep-traces`. That means it's not possible to build dependencies with traces. The address `--rebuild` flag will also rebuild without traces. Tracing is however turn ON by default when: - checking the project (and running tests). In this scenario, tracing can be disabled using `--no-traces` (if for example, one want to analyze the execution units of specific functions without having to manually remove traces from code). --- crates/aiken-lang/src/ast.rs | 10 ++++++++++ crates/aiken-project/src/lib.rs | 20 +++++++++++++------- crates/aiken-project/src/options.rs | 3 +++ crates/aiken/src/cmd/blueprint/address.rs | 11 ++++++----- crates/aiken/src/cmd/build.rs | 14 ++++++++++++-- crates/aiken/src/cmd/check.rs | 13 ++++++++++++- 6 files changed, 56 insertions(+), 15 deletions(-) diff --git a/crates/aiken-lang/src/ast.rs b/crates/aiken-lang/src/ast.rs index 8127cd3f..fe6723ad 100644 --- a/crates/aiken-lang/src/ast.rs +++ b/crates/aiken-lang/src/ast.rs @@ -1023,6 +1023,16 @@ pub enum Tracing { KeepTraces, } +impl From for Tracing { + fn from(keep: bool) -> Self { + if keep { + Tracing::KeepTraces + } else { + Tracing::NoTraces + } + } +} + #[derive(Copy, Clone, PartialEq, Eq)] pub struct Span { pub start: usize, diff --git a/crates/aiken-project/src/lib.rs b/crates/aiken-project/src/lib.rs index 5f9f9a3a..51f5f4f5 100644 --- a/crates/aiken-project/src/lib.rs +++ b/crates/aiken-project/src/lib.rs @@ -106,9 +106,10 @@ where }) } - pub fn build(&mut self, uplc: bool) -> Result<(), Error> { + pub fn build(&mut self, uplc: bool, tracing: Tracing) -> Result<(), Error> { let options = Options { code_gen_mode: CodeGenMode::Build(uplc), + tracing, }; self.compile(options) @@ -130,7 +131,7 @@ where let parsed_modules = self.parse_sources(self.config.name.clone())?; - self.type_check(parsed_modules)?; + self.type_check(parsed_modules, Tracing::NoTraces)?; self.event_listener.handle_event(Event::GeneratingDocFiles { output_path: destination.clone(), @@ -157,8 +158,10 @@ where match_tests: Option>, verbose: bool, exact_match: bool, + tracing: Tracing, ) -> Result<(), Error> { let options = Options { + tracing, code_gen_mode: if skip_tests { CodeGenMode::NoOp } else { @@ -209,7 +212,7 @@ where let parsed_modules = self.parse_sources(self.config.name.clone())?; - self.type_check(parsed_modules)?; + self.type_check(parsed_modules, options.tracing)?; match options.code_gen_mode { CodeGenMode::Build(uplc_dump) => { @@ -391,7 +394,7 @@ where let parsed_modules = self.parse_sources(package.name)?; - self.type_check(parsed_modules)?; + self.type_check(parsed_modules, Tracing::NoTraces)?; } Ok(()) @@ -474,7 +477,11 @@ where } } - fn type_check(&mut self, mut parsed_modules: ParsedModules) -> Result<(), Error> { + fn type_check( + &mut self, + mut parsed_modules: ParsedModules, + tracing: Tracing, + ) -> Result<(), Error> { let processing_sequence = parsed_modules.sequence()?; for name in processing_sequence { @@ -496,8 +503,7 @@ where kind, &self.config.name.to_string(), &self.module_types, - // TODO: Make configurable - Tracing::KeepTraces, + tracing, &mut type_warnings, ) .map_err(|error| Error::Type { diff --git a/crates/aiken-project/src/options.rs b/crates/aiken-project/src/options.rs index 53ec15bf..2da0d13d 100644 --- a/crates/aiken-project/src/options.rs +++ b/crates/aiken-project/src/options.rs @@ -1,5 +1,8 @@ +use aiken_lang::ast::Tracing; + pub struct Options { pub code_gen_mode: CodeGenMode, + pub tracing: Tracing, } pub enum CodeGenMode { diff --git a/crates/aiken/src/cmd/blueprint/address.rs b/crates/aiken/src/cmd/blueprint/address.rs index a6cdd4bb..4eacfdff 100644 --- a/crates/aiken/src/cmd/blueprint/address.rs +++ b/crates/aiken/src/cmd/blueprint/address.rs @@ -1,4 +1,5 @@ use crate::with_project; +use aiken_lang::ast::Tracing; use std::path::PathBuf; #[derive(clap::Args)] @@ -8,19 +9,19 @@ pub struct Args { /// Path to project directory: Option, - /// Name of the validator's module within the project. Optional if there's only one validator. + /// Name of the validator's module within the project. Optional if there's only one validator #[clap(short, long)] module: Option, - /// Name of the validator within the module. Optional if there's only one validator. + /// Name of the validator within the module. Optional if there's only one validator #[clap(short, long)] validator: Option, - /// Stake address to attach, if any. + /// Stake address to attach, if any #[clap(long)] delegated_to: Option, - /// Force the project to be rebuilt, otherwise relies on existing artifacts (i.e. plutus.json). + /// Force the project to be rebuilt, otherwise relies on existing artifacts (i.e. plutus.json) #[clap(long)] rebuild: bool, } @@ -36,7 +37,7 @@ pub fn exec( ) -> miette::Result<()> { with_project(directory, |p| { if rebuild { - p.build(false)?; + p.build(false, Tracing::NoTraces)?; } let title = module.as_ref().map(|m| { diff --git a/crates/aiken/src/cmd/build.rs b/crates/aiken/src/cmd/build.rs index bca77253..f735dcb6 100644 --- a/crates/aiken/src/cmd/build.rs +++ b/crates/aiken/src/cmd/build.rs @@ -9,8 +9,18 @@ pub struct Args { /// Also dump textual uplc #[clap(short, long)] uplc: bool, + + /// Do not remove traces when generating code + #[clap(short, long)] + keep_traces: bool, } -pub fn exec(Args { directory, uplc }: Args) -> miette::Result<()> { - crate::with_project(directory, |p| p.build(uplc)) +pub fn exec( + Args { + directory, + uplc, + keep_traces, + }: Args, +) -> miette::Result<()> { + crate::with_project(directory, |p| p.build(uplc, keep_traces.into())) } diff --git a/crates/aiken/src/cmd/check.rs b/crates/aiken/src/cmd/check.rs index 9c52a358..b6c0f312 100644 --- a/crates/aiken/src/cmd/check.rs +++ b/crates/aiken/src/cmd/check.rs @@ -24,6 +24,10 @@ pub struct Args { /// It forces test names to match exactly #[clap(short, long)] exact_match: bool, + + /// Remove traces when generating code (including tests) + #[clap(long)] + no_traces: bool, } pub fn exec( @@ -33,9 +37,16 @@ pub fn exec( debug, match_tests, exact_match, + no_traces, }: Args, ) -> miette::Result<()> { crate::with_project(directory, |p| { - p.check(skip_tests, match_tests.clone(), debug, exact_match) + p.check( + skip_tests, + match_tests.clone(), + debug, + exact_match, + (!no_traces).into(), + ) }) }