diff --git a/Cargo.lock b/Cargo.lock index b311bc608ca..274eac0bce2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2244,6 +2244,10 @@ checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" name = "nargo" version = "0.3.2" dependencies = [ + "acvm 0.8.0", + "iter-extended", + "noirc_abi", + "noirc_driver", "rustc_version 0.4.0", "serde", "thiserror", diff --git a/crates/arena/src/lib.rs b/crates/arena/src/lib.rs index 51c73d7f6a8..fc19f44ab6e 100644 --- a/crates/arena/src/lib.rs +++ b/crates/arena/src/lib.rs @@ -1,6 +1,7 @@ #![forbid(unsafe_code)] #![warn(unused_crate_dependencies, unused_extern_crates)] #![warn(unreachable_pub)] +#![warn(clippy::semicolon_if_nothing_returned)] // For now we use a wrapper around generational-arena pub use generational_arena::{Arena, Index}; diff --git a/crates/fm/src/lib.rs b/crates/fm/src/lib.rs index 49fac9b0178..cc87129fc0d 100644 --- a/crates/fm/src/lib.rs +++ b/crates/fm/src/lib.rs @@ -1,6 +1,7 @@ #![forbid(unsafe_code)] #![warn(unused_crate_dependencies, unused_extern_crates)] #![warn(unreachable_pub)] +#![warn(clippy::semicolon_if_nothing_returned)] mod file_map; mod file_reader; @@ -136,7 +137,7 @@ mod tests { let file_id = fm.add_file(&file_path, FileType::Normal).unwrap(); - assert!(fm.path(file_id).ends_with("foo")) + assert!(fm.path(file_id).ends_with("foo")); } #[test] fn path_resolve_sub_module() { diff --git a/crates/iter-extended/src/lib.rs b/crates/iter-extended/src/lib.rs index a022ad00b9e..aef89b58b30 100644 --- a/crates/iter-extended/src/lib.rs +++ b/crates/iter-extended/src/lib.rs @@ -1,6 +1,7 @@ #![forbid(unsafe_code)] #![warn(unused_crate_dependencies, unused_extern_crates)] #![warn(unreachable_pub)] +#![warn(clippy::semicolon_if_nothing_returned)] use std::collections::BTreeMap; diff --git a/crates/nargo/Cargo.toml b/crates/nargo/Cargo.toml index d24d238ea36..430d926cc9e 100644 --- a/crates/nargo/Cargo.toml +++ b/crates/nargo/Cargo.toml @@ -11,6 +11,10 @@ edition.workspace = true rustc_version = "0.4.0" [dependencies] +acvm.workspace = true +noirc_abi.workspace = true +noirc_driver.workspace = true +iter-extended.workspace = true toml.workspace = true serde.workspace = true thiserror.workspace = true diff --git a/crates/nargo_cli/src/artifacts/contract.rs b/crates/nargo/src/artifacts/contract.rs similarity index 72% rename from crates/nargo_cli/src/artifacts/contract.rs rename to crates/nargo/src/artifacts/contract.rs index fdc096d3c66..95f1ce9576d 100644 --- a/crates/nargo_cli/src/artifacts/contract.rs +++ b/crates/nargo/src/artifacts/contract.rs @@ -9,13 +9,13 @@ use serde::{Deserialize, Serialize}; /// - The ACIR bytecode has had an optimization pass applied to tailor it for the backend. /// - Proving and verification keys have been pregenerated based on this ACIR. #[derive(Serialize, Deserialize)] -pub(crate) struct PreprocessedContract { +pub struct PreprocessedContract { /// The name of the contract. - pub(crate) name: String, + pub name: String, /// The identifier of the proving backend which this contract has been compiled for. - pub(crate) backend: String, + pub backend: String, /// Each of the contract's functions are compiled into a separate program stored in this `Vec`. - pub(crate) functions: Vec, + pub functions: Vec, } /// Each function in the contract will be compiled as a separate noir program. @@ -23,19 +23,19 @@ pub(crate) struct PreprocessedContract { /// A contract function unlike a regular Noir program however can have additional properties. /// One of these being a function type. #[derive(Debug, Serialize, Deserialize)] -pub(crate) struct PreprocessedContractFunction { - pub(crate) name: String, +pub struct PreprocessedContractFunction { + pub name: String, - pub(crate) function_type: ContractFunctionType, + pub function_type: ContractFunctionType, - pub(crate) abi: Abi, + pub abi: Abi, #[serde( serialize_with = "super::serialize_circuit", deserialize_with = "super::deserialize_circuit" )] - pub(crate) bytecode: Circuit, + pub bytecode: Circuit, - pub(crate) proving_key: Vec, - pub(crate) verification_key: Vec, + pub proving_key: Vec, + pub verification_key: Vec, } diff --git a/crates/nargo_cli/src/artifacts/mod.rs b/crates/nargo/src/artifacts/mod.rs similarity index 95% rename from crates/nargo_cli/src/artifacts/mod.rs rename to crates/nargo/src/artifacts/mod.rs index b5fd4c8389b..400254bfb0d 100644 --- a/crates/nargo_cli/src/artifacts/mod.rs +++ b/crates/nargo/src/artifacts/mod.rs @@ -7,8 +7,8 @@ use acvm::acir::circuit::Circuit; use serde::{Deserialize, Deserializer, Serialize, Serializer}; -pub(crate) mod contract; -pub(crate) mod program; +pub mod contract; +pub mod program; // TODO: move these down into ACVM. fn serialize_circuit(circuit: &Circuit, s: S) -> Result diff --git a/crates/nargo_cli/src/artifacts/program.rs b/crates/nargo/src/artifacts/program.rs similarity index 74% rename from crates/nargo_cli/src/artifacts/program.rs rename to crates/nargo/src/artifacts/program.rs index fd76d1af98f..288a5dba99b 100644 --- a/crates/nargo_cli/src/artifacts/program.rs +++ b/crates/nargo/src/artifacts/program.rs @@ -8,16 +8,16 @@ use serde::{Deserialize, Serialize}; /// - The ACIR bytecode has had an optimization pass applied to tailor it for the backend. /// - Proving and verification keys have been pregenerated based on this ACIR. #[derive(Serialize, Deserialize, Debug)] -pub(crate) struct PreprocessedProgram { - pub(crate) backend: String, - pub(crate) abi: Abi, +pub struct PreprocessedProgram { + pub backend: String, + pub abi: Abi, #[serde( serialize_with = "super::serialize_circuit", deserialize_with = "super::deserialize_circuit" )] - pub(crate) bytecode: Circuit, + pub bytecode: Circuit, - pub(crate) proving_key: Vec, - pub(crate) verification_key: Vec, + pub proving_key: Vec, + pub verification_key: Vec, } diff --git a/crates/nargo/src/errors.rs b/crates/nargo/src/errors.rs new file mode 100644 index 00000000000..59cec4552ef --- /dev/null +++ b/crates/nargo/src/errors.rs @@ -0,0 +1,13 @@ +use acvm::OpcodeResolutionError; +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum NargoError { + /// Error while compiling Noir into ACIR. + #[error("Failed to compile circuit")] + CompilationError, + + /// ACIR circuit solving error + #[error(transparent)] + SolvingError(#[from] OpcodeResolutionError), +} diff --git a/crates/nargo/src/lib.rs b/crates/nargo/src/lib.rs index 9e98f9e3581..24605de7849 100644 --- a/crates/nargo/src/lib.rs +++ b/crates/nargo/src/lib.rs @@ -1,9 +1,15 @@ #![forbid(unsafe_code)] #![warn(unused_crate_dependencies, unused_extern_crates)] #![warn(unreachable_pub)] +#![warn(clippy::semicolon_if_nothing_returned)] //! Nargo is the package manager for Noir //! This name was used because it sounds like `cargo` and //! Noir Package Manager abbreviated is npm, which is already taken. +pub mod artifacts; +mod errors; pub mod manifest; +pub mod ops; + +pub use self::errors::NargoError; diff --git a/crates/nargo/src/ops/codegen_verifier.rs b/crates/nargo/src/ops/codegen_verifier.rs new file mode 100644 index 00000000000..ead125699b4 --- /dev/null +++ b/crates/nargo/src/ops/codegen_verifier.rs @@ -0,0 +1,10 @@ +use acvm::SmartContract; + +use crate::NargoError; + +pub fn codegen_verifier( + backend: &impl SmartContract, + verification_key: &[u8], +) -> Result { + Ok(backend.eth_contract_from_vk(verification_key)) +} diff --git a/crates/nargo/src/ops/execute.rs b/crates/nargo/src/ops/execute.rs new file mode 100644 index 00000000000..eb82df60d41 --- /dev/null +++ b/crates/nargo/src/ops/execute.rs @@ -0,0 +1,20 @@ +use acvm::PartialWitnessGenerator; +use acvm::{acir::circuit::Circuit, pwg::block::Blocks}; +use noirc_abi::WitnessMap; + +use crate::NargoError; + +pub fn execute_circuit( + backend: &impl PartialWitnessGenerator, + circuit: Circuit, + mut initial_witness: WitnessMap, +) -> Result { + let mut blocks = Blocks::default(); + let (unresolved_opcodes, oracles) = + backend.solve(&mut initial_witness, &mut blocks, circuit.opcodes)?; + if !unresolved_opcodes.is_empty() || !oracles.is_empty() { + todo!("Add oracle support to nargo execute") + } + + Ok(initial_witness) +} diff --git a/crates/nargo/src/ops/mod.rs b/crates/nargo/src/ops/mod.rs new file mode 100644 index 00000000000..8efd7ced437 --- /dev/null +++ b/crates/nargo/src/ops/mod.rs @@ -0,0 +1,11 @@ +pub use self::codegen_verifier::codegen_verifier; +pub use self::execute::execute_circuit; +pub use self::preprocess::{preprocess_contract, preprocess_program}; +pub use self::prove::prove; +pub use self::verify::verify_proof; + +mod codegen_verifier; +mod execute; +mod preprocess; +mod prove; +mod verify; diff --git a/crates/nargo/src/ops/preprocess.rs b/crates/nargo/src/ops/preprocess.rs new file mode 100644 index 00000000000..ea7c29e00b9 --- /dev/null +++ b/crates/nargo/src/ops/preprocess.rs @@ -0,0 +1,57 @@ +use acvm::ProofSystemCompiler; +use iter_extended::vecmap; +use noirc_driver::{CompiledContract, CompiledProgram}; + +use crate::artifacts::{ + contract::{PreprocessedContract, PreprocessedContractFunction}, + program::PreprocessedProgram, +}; + +// TODO: pull this from backend. +const BACKEND_IDENTIFIER: &str = "acvm-backend-barretenberg"; + +pub fn preprocess_program( + backend: &impl ProofSystemCompiler, + compiled_program: CompiledProgram, +) -> PreprocessedProgram { + // TODO: currently `compiled_program`'s bytecode is already optimized for the backend. + // In future we'll need to apply those optimizations here. + let optimized_bytecode = compiled_program.circuit; + let (proving_key, verification_key) = backend.preprocess(&optimized_bytecode); + + PreprocessedProgram { + backend: String::from(BACKEND_IDENTIFIER), + abi: compiled_program.abi, + bytecode: optimized_bytecode, + proving_key, + verification_key, + } +} + +pub fn preprocess_contract( + backend: &impl ProofSystemCompiler, + compiled_contract: CompiledContract, +) -> PreprocessedContract { + let preprocessed_contract_functions = vecmap(compiled_contract.functions, |func| { + // TODO: currently `func`'s bytecode is already optimized for the backend. + // In future we'll need to apply those optimizations here. + let optimized_bytecode = func.bytecode; + let (proving_key, verification_key) = backend.preprocess(&optimized_bytecode); + + PreprocessedContractFunction { + name: func.name, + function_type: func.function_type, + abi: func.abi, + + bytecode: optimized_bytecode, + proving_key, + verification_key, + } + }); + + PreprocessedContract { + name: compiled_contract.name, + backend: String::from(BACKEND_IDENTIFIER), + functions: preprocessed_contract_functions, + } +} diff --git a/crates/nargo/src/ops/prove.rs b/crates/nargo/src/ops/prove.rs new file mode 100644 index 00000000000..fc7ddcd4cb6 --- /dev/null +++ b/crates/nargo/src/ops/prove.rs @@ -0,0 +1,16 @@ +use acvm::acir::circuit::Circuit; +use acvm::ProofSystemCompiler; +use noirc_abi::WitnessMap; + +use crate::NargoError; + +pub fn prove( + backend: &impl ProofSystemCompiler, + circuit: &Circuit, + solved_witness: WitnessMap, + proving_key: &[u8], +) -> Result, NargoError> { + let proof = backend.prove_with_pk(circuit, solved_witness, proving_key); + + Ok(proof) +} diff --git a/crates/nargo/src/ops/verify.rs b/crates/nargo/src/ops/verify.rs new file mode 100644 index 00000000000..5109d2291db --- /dev/null +++ b/crates/nargo/src/ops/verify.rs @@ -0,0 +1,17 @@ +use acvm::acir::circuit::Circuit; +use acvm::ProofSystemCompiler; +use noirc_abi::WitnessMap; + +use crate::NargoError; + +pub fn verify_proof( + backend: &impl ProofSystemCompiler, + circuit: &Circuit, + proof: &[u8], + public_inputs: WitnessMap, + verification_key: &[u8], +) -> Result { + let valid_proof = backend.verify_with_vk(proof, public_inputs, circuit, verification_key); + + Ok(valid_proof) +} diff --git a/crates/nargo_cli/src/cli/codegen_verifier_cmd.rs b/crates/nargo_cli/src/cli/codegen_verifier_cmd.rs index b05626e4398..717ef662a42 100644 --- a/crates/nargo_cli/src/cli/codegen_verifier_cmd.rs +++ b/crates/nargo_cli/src/cli/codegen_verifier_cmd.rs @@ -13,9 +13,11 @@ pub(crate) struct CodegenVerifierCommand { } pub(crate) fn run(args: CodegenVerifierCommand, config: NargoConfig) -> Result<(), CliError> { - let compiled_program = compile_circuit(&config.program_dir, &args.compile_options)?; - let backend = crate::backends::ConcreteBackend; + + let compiled_program = compile_circuit(&backend, &config.program_dir, &args.compile_options)?; + + // TODO: replace with `nargo::ops::codegen_verifier` #[allow(deprecated)] let smart_contract_string = backend.eth_contract_from_cs(compiled_program.circuit); diff --git a/crates/nargo_cli/src/cli/compile_cmd.rs b/crates/nargo_cli/src/cli/compile_cmd.rs index 57b7d161a9a..8557e7e1fe3 100644 --- a/crates/nargo_cli/src/cli/compile_cmd.rs +++ b/crates/nargo_cli/src/cli/compile_cmd.rs @@ -5,7 +5,8 @@ use std::path::Path; use clap::Args; -use crate::preprocess::{preprocess_contract, preprocess_program}; +use nargo::ops::{preprocess_contract, preprocess_program}; + use crate::resolver::DependencyResolutionError; use crate::{constants::TARGET_DIR, errors::CliError, resolver::Resolver}; @@ -29,33 +30,39 @@ pub(crate) struct CompileCommand { pub(crate) fn run(args: CompileCommand, config: NargoConfig) -> Result<(), CliError> { let circuit_dir = config.program_dir.join(TARGET_DIR); + let backend = crate::backends::ConcreteBackend; + // If contracts is set we're compiling every function in a 'contract' rather than just 'main'. if args.contracts { - let mut driver = setup_driver(&config.program_dir)?; + let mut driver = setup_driver(&backend, &config.program_dir)?; let compiled_contracts = driver .compile_contracts(&args.compile_options) .map_err(|_| CliError::CompilationError)?; - let preprocessed_contracts = vecmap(compiled_contracts, preprocess_contract); + let preprocessed_contracts = + vecmap(compiled_contracts, |contract| preprocess_contract(&backend, contract)); for contract in preprocessed_contracts { save_contract_to_file(&contract, &args.circuit_name, &circuit_dir); } } else { - let program = compile_circuit(&config.program_dir, &args.compile_options)?; - let preprocessed_program = preprocess_program(program); + let program = compile_circuit(&backend, &config.program_dir, &args.compile_options)?; + let preprocessed_program = preprocess_program(&backend, program); save_program_to_file(&preprocessed_program, &args.circuit_name, circuit_dir); } Ok(()) } -fn setup_driver(program_dir: &Path) -> Result { - let backend = crate::backends::ConcreteBackend; +fn setup_driver( + backend: &impl ProofSystemCompiler, + program_dir: &Path, +) -> Result { Resolver::resolve_root_manifest(program_dir, backend.np_language()) } pub(crate) fn compile_circuit( + backend: &impl ProofSystemCompiler, program_dir: &Path, compile_options: &CompileOptions, ) -> Result { - let mut driver = setup_driver(program_dir)?; + let mut driver = setup_driver(backend, program_dir)?; driver.compile_main(compile_options).map_err(|_| CliError::CompilationError) } diff --git a/crates/nargo_cli/src/cli/execute_cmd.rs b/crates/nargo_cli/src/cli/execute_cmd.rs index 4a3d89585bf..9d1429bbda7 100644 --- a/crates/nargo_cli/src/cli/execute_cmd.rs +++ b/crates/nargo_cli/src/cli/execute_cmd.rs @@ -1,6 +1,5 @@ use std::path::Path; -use acvm::pwg::block::Blocks; use acvm::PartialWitnessGenerator; use clap::Args; use noirc_abi::input_parser::{Format, InputValue}; @@ -47,13 +46,15 @@ fn execute_with_path( program_dir: &Path, compile_options: &CompileOptions, ) -> Result<(Option, WitnessMap), CliError> { - let compiled_program = compile_circuit(program_dir, compile_options)?; + let backend = crate::backends::ConcreteBackend; + + let compiled_program = compile_circuit(&backend, program_dir, compile_options)?; // Parse the initial witness values from Prover.toml let (inputs_map, _) = read_inputs_from_file(program_dir, PROVER_INPUT_FILE, Format::Toml, &compiled_program.abi)?; - let solved_witness = execute_program(&compiled_program, &inputs_map)?; + let solved_witness = execute_program(&backend, &compiled_program, &inputs_map)?; let public_abi = compiled_program.abi.public_abi(); let (_, return_value) = public_abi.decode(&solved_witness)?; @@ -62,21 +63,14 @@ fn execute_with_path( } pub(crate) fn execute_program( + backend: &impl PartialWitnessGenerator, compiled_program: &CompiledProgram, inputs_map: &InputMap, ) -> Result { - let mut solved_witness = compiled_program.abi.encode(inputs_map, None)?; + let initial_witness = compiled_program.abi.encode(inputs_map, None)?; - let backend = crate::backends::ConcreteBackend; - let mut blocks = Blocks::default(); - let (unresolved_opcodes, oracles) = backend.solve( - &mut solved_witness, - &mut blocks, - compiled_program.circuit.opcodes.clone(), - )?; - if !unresolved_opcodes.is_empty() || !oracles.is_empty() { - todo!("Add oracle support to nargo execute") - } + let solved_witness = + nargo::ops::execute_circuit(backend, compiled_program.circuit.clone(), initial_witness)?; Ok(solved_witness) } diff --git a/crates/nargo_cli/src/cli/fs/program.rs b/crates/nargo_cli/src/cli/fs/program.rs index 7da55ed9642..a3b5f4026bd 100644 --- a/crates/nargo_cli/src/cli/fs/program.rs +++ b/crates/nargo_cli/src/cli/fs/program.rs @@ -1,9 +1,8 @@ use std::path::{Path, PathBuf}; -use crate::{ - artifacts::{contract::PreprocessedContract, program::PreprocessedProgram}, - errors::CliError, -}; +use nargo::artifacts::{contract::PreprocessedContract, program::PreprocessedProgram}; + +use crate::errors::CliError; use super::{create_named_dir, write_to_file}; diff --git a/crates/nargo_cli/src/cli/gates_cmd.rs b/crates/nargo_cli/src/cli/gates_cmd.rs index 71edd4101fe..a5093b4d775 100644 --- a/crates/nargo_cli/src/cli/gates_cmd.rs +++ b/crates/nargo_cli/src/cli/gates_cmd.rs @@ -23,10 +23,11 @@ fn count_gates_with_path>( program_dir: P, compile_options: &CompileOptions, ) -> Result<(), CliError> { - let compiled_program = compile_circuit(program_dir.as_ref(), compile_options)?; - let num_opcodes = compiled_program.circuit.opcodes.len(); let backend = crate::backends::ConcreteBackend; + let compiled_program = compile_circuit(&backend, program_dir.as_ref(), compile_options)?; + let num_opcodes = compiled_program.circuit.opcodes.len(); + println!( "Total ACIR opcodes generated for language {:?}: {}", backend.np_language(), diff --git a/crates/nargo_cli/src/cli/print_acir_cmd.rs b/crates/nargo_cli/src/cli/print_acir_cmd.rs index dbc0fea86de..589cc490f40 100644 --- a/crates/nargo_cli/src/cli/print_acir_cmd.rs +++ b/crates/nargo_cli/src/cli/print_acir_cmd.rs @@ -22,7 +22,9 @@ fn print_acir_with_path>( program_dir: P, compile_options: &CompileOptions, ) -> Result<(), CliError> { - let compiled_program = compile_circuit(program_dir.as_ref(), compile_options)?; + let backend = crate::backends::ConcreteBackend; + + let compiled_program = compile_circuit(&backend, program_dir.as_ref(), compile_options)?; println!("{}", compiled_program.circuit); Ok(()) diff --git a/crates/nargo_cli/src/cli/prove_cmd.rs b/crates/nargo_cli/src/cli/prove_cmd.rs index 2c26758cdd0..2bde33d7983 100644 --- a/crates/nargo_cli/src/cli/prove_cmd.rs +++ b/crates/nargo_cli/src/cli/prove_cmd.rs @@ -1,7 +1,8 @@ use std::path::{Path, PathBuf}; -use acvm::ProofSystemCompiler; use clap::Args; +use nargo::artifacts::program::PreprocessedProgram; +use nargo::ops::preprocess_program; use noirc_abi::input_parser::Format; use noirc_driver::{CompileOptions, CompiledProgram}; @@ -15,11 +16,9 @@ use super::{ }, }; use crate::{ - artifacts::program::PreprocessedProgram, cli::{execute_cmd::execute_program, verify_cmd::verify_proof}, constants::{PROOFS_DIR, PROVER_INPUT_FILE, TARGET_DIR, VERIFIER_INPUT_FILE}, errors::CliError, - preprocess::preprocess_program, }; /// Create proof for this program. The proof is returned as a hex encoded string. @@ -66,11 +65,14 @@ pub(crate) fn prove_with_path>( check_proof: bool, compile_options: &CompileOptions, ) -> Result, CliError> { + let backend = crate::backends::ConcreteBackend; + let preprocessed_program = match circuit_build_path { Some(circuit_build_path) => read_program_from_file(circuit_build_path)?, None => { - let compiled_program = compile_circuit(program_dir.as_ref(), compile_options)?; - preprocess_program(compiled_program) + let compiled_program = + compile_circuit(&backend, program_dir.as_ref(), compile_options)?; + preprocess_program(&backend, compiled_program) } }; @@ -86,7 +88,7 @@ pub(crate) fn prove_with_path>( &compiled_program.abi, )?; - let solved_witness = execute_program(&compiled_program, &inputs_map)?; + let solved_witness = execute_program(&backend, &compiled_program, &inputs_map)?; // Write public inputs into Verifier.toml let public_abi = compiled_program.abi.clone().public_abi(); @@ -100,12 +102,13 @@ pub(crate) fn prove_with_path>( Format::Toml, )?; - let backend = crate::backends::ConcreteBackend; - let proof = backend.prove_with_pk(&compiled_program.circuit, solved_witness, &proving_key); + let proof = + nargo::ops::prove(&backend, &compiled_program.circuit, solved_witness, &proving_key)?; if check_proof { let no_proof_name = "".into(); verify_proof( + &backend, &compiled_program, public_inputs, return_value, diff --git a/crates/nargo_cli/src/cli/test_cmd.rs b/crates/nargo_cli/src/cli/test_cmd.rs index 665591f188d..d168e6c39ca 100644 --- a/crates/nargo_cli/src/cli/test_cmd.rs +++ b/crates/nargo_cli/src/cli/test_cmd.rs @@ -1,7 +1,8 @@ use std::{collections::BTreeMap, io::Write, path::Path}; -use acvm::{pwg::block::Blocks, PartialWitnessGenerator, ProofSystemCompiler}; +use acvm::ProofSystemCompiler; use clap::Args; +use nargo::ops::execute_circuit; use noirc_driver::{CompileOptions, Driver}; use noirc_frontend::node_interner::FuncId; use termcolor::{Color, ColorChoice, ColorSpec, StandardStream, WriteColor}; @@ -79,23 +80,15 @@ fn run_test( config: &CompileOptions, ) -> Result<(), CliError> { let backend = crate::backends::ConcreteBackend; - let mut blocks = Blocks::default(); let program = driver .compile_no_check(config, main) .map_err(|_| CliError::Generic(format!("Test '{test_name}' failed to compile")))?; - let mut solved_witness = BTreeMap::new(); - // Run the backend to ensure the PWG evaluates functions like std::hash::pedersen, // otherwise constraints involving these expressions will not error. - match backend.solve(&mut solved_witness, &mut blocks, program.circuit.opcodes) { - Ok((unresolved_opcodes, oracles)) => { - if !unresolved_opcodes.is_empty() || !oracles.is_empty() { - todo!("Add oracle support to nargo test") - } - Ok(()) - } + match execute_circuit(&backend, program.circuit, BTreeMap::new()) { + Ok(_) => Ok(()), Err(error) => { let writer = StandardStream::stderr(ColorChoice::Always); let mut writer = writer.lock(); diff --git a/crates/nargo_cli/src/cli/verify_cmd.rs b/crates/nargo_cli/src/cli/verify_cmd.rs index da686842ffa..c966615f82e 100644 --- a/crates/nargo_cli/src/cli/verify_cmd.rs +++ b/crates/nargo_cli/src/cli/verify_cmd.rs @@ -1,14 +1,14 @@ use super::compile_cmd::compile_circuit; use super::fs::{inputs::read_inputs_from_file, load_hex_data, program::read_program_from_file}; use super::{InputMap, NargoConfig}; -use crate::artifacts::program::PreprocessedProgram; -use crate::preprocess::preprocess_program; use crate::{ constants::{PROOFS_DIR, PROOF_EXT, TARGET_DIR, VERIFIER_INPUT_FILE}, errors::CliError, }; use acvm::ProofSystemCompiler; use clap::Args; +use nargo::artifacts::program::PreprocessedProgram; +use nargo::ops::preprocess_program; use noirc_abi::input_parser::{Format, InputValue}; use noirc_driver::{CompileOptions, CompiledProgram}; use std::path::{Path, PathBuf}; @@ -43,11 +43,14 @@ fn verify_with_path>( circuit_build_path: Option

, compile_options: CompileOptions, ) -> Result<(), CliError> { + let backend = crate::backends::ConcreteBackend; + let preprocessed_program = match circuit_build_path { Some(circuit_build_path) => read_program_from_file(circuit_build_path)?, None => { - let compiled_program = compile_circuit(program_dir.as_ref(), &compile_options)?; - preprocess_program(compiled_program) + let compiled_program = + compile_circuit(&backend, program_dir.as_ref(), &compile_options)?; + preprocess_program(&backend, compiled_program) } }; @@ -60,6 +63,7 @@ fn verify_with_path>( read_inputs_from_file(program_dir, VERIFIER_INPUT_FILE, Format::Toml, &public_abi)?; verify_proof( + &backend, &compiled_program, public_inputs_map, return_value, @@ -70,6 +74,7 @@ fn verify_with_path>( } pub(crate) fn verify_proof( + backend: &impl ProofSystemCompiler, compiled_program: &CompiledProgram, public_inputs_map: InputMap, return_value: Option, @@ -80,9 +85,13 @@ pub(crate) fn verify_proof( let public_abi = compiled_program.abi.clone().public_abi(); let public_inputs = public_abi.encode(&public_inputs_map, return_value)?; - let backend = crate::backends::ConcreteBackend; - let valid_proof = - backend.verify_with_vk(proof, public_inputs, &compiled_program.circuit, verification_key); + let valid_proof = nargo::ops::verify_proof( + backend, + &compiled_program.circuit, + proof, + public_inputs, + verification_key, + )?; if valid_proof { Ok(()) diff --git a/crates/nargo_cli/src/errors.rs b/crates/nargo_cli/src/errors.rs index f1a78c9f6b4..f6537b550ea 100644 --- a/crates/nargo_cli/src/errors.rs +++ b/crates/nargo_cli/src/errors.rs @@ -1,5 +1,5 @@ -use acvm::OpcodeResolutionError; use hex::FromHexError; +use nargo::NargoError; use noirc_abi::errors::{AbiError, InputParserError}; use std::path::PathBuf; use thiserror::Error; @@ -39,7 +39,7 @@ pub(crate) enum CliError { #[error(transparent)] AbiError(#[from] AbiError), - /// ACIR circuit solving error + /// Error from Nargo #[error(transparent)] - SolvingError(#[from] OpcodeResolutionError), + NargoError(#[from] NargoError), } diff --git a/crates/nargo_cli/src/lib.rs b/crates/nargo_cli/src/lib.rs index 7f6ccdcdd5b..a943e580632 100644 --- a/crates/nargo_cli/src/lib.rs +++ b/crates/nargo_cli/src/lib.rs @@ -1,6 +1,7 @@ #![forbid(unsafe_code)] #![warn(unused_crate_dependencies, unused_extern_crates)] #![warn(unreachable_pub)] +#![warn(clippy::semicolon_if_nothing_returned)] //! Nargo is the package manager for Noir //! This name was used because it sounds like `cargo` and @@ -12,14 +13,12 @@ use std::{ path::{Path, PathBuf}, }; -mod artifacts; mod backends; pub mod cli; mod constants; mod errors; mod git; mod manifest; -mod preprocess; mod resolver; use nargo::manifest::InvalidPackageError; diff --git a/crates/noirc_abi/src/lib.rs b/crates/noirc_abi/src/lib.rs index 1a5293b160c..dbd935dcde0 100644 --- a/crates/noirc_abi/src/lib.rs +++ b/crates/noirc_abi/src/lib.rs @@ -1,6 +1,7 @@ #![forbid(unsafe_code)] #![warn(unused_crate_dependencies, unused_extern_crates)] #![warn(unreachable_pub)] +#![warn(clippy::semicolon_if_nothing_returned)] use std::{collections::BTreeMap, str}; @@ -283,11 +284,11 @@ impl Abi { InputValue::String(string) => { let str_as_fields = string.bytes().map(|byte| FieldElement::from_be_bytes_reduce(&[byte])); - encoded_value.extend(str_as_fields) + encoded_value.extend(str_as_fields); } InputValue::Struct(object) => { for value in object.into_values() { - encoded_value.extend(Self::encode_value(value)?) + encoded_value.extend(Self::encode_value(value)?); } } } @@ -442,6 +443,6 @@ mod test { } // We also decode the return value (we can do this immediately as we know it shares a witness with an input). - assert_eq!(return_value.unwrap(), reconstructed_inputs["thing2"]) + assert_eq!(return_value.unwrap(), reconstructed_inputs["thing2"]); } } diff --git a/crates/noirc_driver/src/lib.rs b/crates/noirc_driver/src/lib.rs index 293c65ab8a2..c6d0a08e4d8 100644 --- a/crates/noirc_driver/src/lib.rs +++ b/crates/noirc_driver/src/lib.rs @@ -1,6 +1,7 @@ #![forbid(unsafe_code)] #![warn(unused_crate_dependencies, unused_extern_crates)] #![warn(unreachable_pub)] +#![warn(clippy::semicolon_if_nothing_returned)] use acvm::Language; use clap::Args; diff --git a/crates/noirc_errors/src/lib.rs b/crates/noirc_errors/src/lib.rs index 9bb1ebaef81..ab154639d13 100644 --- a/crates/noirc_errors/src/lib.rs +++ b/crates/noirc_errors/src/lib.rs @@ -1,6 +1,7 @@ #![forbid(unsafe_code)] #![warn(unused_crate_dependencies, unused_extern_crates)] #![warn(unreachable_pub)] +#![warn(clippy::semicolon_if_nothing_returned)] mod position; pub mod reporter; diff --git a/crates/noirc_evaluator/src/lib.rs b/crates/noirc_evaluator/src/lib.rs index 3880a32fd99..4c1b05381f5 100644 --- a/crates/noirc_evaluator/src/lib.rs +++ b/crates/noirc_evaluator/src/lib.rs @@ -1,6 +1,7 @@ #![forbid(unsafe_code)] #![warn(unused_crate_dependencies, unused_extern_crates)] #![warn(unreachable_pub)] +#![warn(clippy::semicolon_if_nothing_returned)] mod errors; mod ssa; @@ -175,7 +176,7 @@ impl Evaluator { AbiType::Array { length, typ } => { let witnesses = self.generate_array_witnesses(length, typ)?; - ir_gen.abi_array(name, Some(def), typ.as_ref(), *length, witnesses.clone()); + ir_gen.abi_array(name, Some(def), typ.as_ref(), *length, &witnesses); witnesses } AbiType::Integer { sign: _, width } => { @@ -203,13 +204,13 @@ impl Evaluator { let mut struct_witnesses: BTreeMap> = BTreeMap::new(); self.generate_struct_witnesses(&mut struct_witnesses, &new_fields)?; - ir_gen.abi_struct(name, Some(def), fields, struct_witnesses.clone()); - struct_witnesses.values().flatten().cloned().collect() + ir_gen.abi_struct(name, Some(def), fields, &struct_witnesses); + struct_witnesses.values().flatten().copied().collect() } AbiType::String { length } => { let typ = AbiType::Integer { sign: noirc_abi::Sign::Unsigned, width: 8 }; let witnesses = self.generate_array_witnesses(length, &typ)?; - ir_gen.abi_array(name, Some(def), &typ, *length, witnesses.clone()); + ir_gen.abi_array(name, Some(def), &typ, *length, &witnesses); witnesses } }; @@ -253,7 +254,7 @@ impl Evaluator { let new_name = format!("{name}.{inner_name}"); new_fields.insert(new_name, value.clone()); } - self.generate_struct_witnesses(struct_witnesses, &new_fields)? + self.generate_struct_witnesses(struct_witnesses, &new_fields)?; } AbiType::String { length } => { let typ = AbiType::Integer { sign: noirc_abi::Sign::Unsigned, width: 8 }; diff --git a/crates/noirc_evaluator/src/ssa/acir_gen/constraints.rs b/crates/noirc_evaluator/src/ssa/acir_gen/constraints.rs index 978bfe49008..8257e0c9f9a 100644 --- a/crates/noirc_evaluator/src/ssa/acir_gen/constraints.rs +++ b/crates/noirc_evaluator/src/ssa/acir_gen/constraints.rs @@ -361,7 +361,7 @@ pub(crate) fn bound_constraint_with_offset( 0 => evaluator.push_opcode(AcirOpcode::Arithmetic(aof)), 1 => { let expr = boolean_expr(&aof, evaluator); - evaluator.push_opcode(AcirOpcode::Arithmetic(expr)) + evaluator.push_opcode(AcirOpcode::Arithmetic(expr)); } 2 => { let y = expression_to_witness(boolean_expr(&aof, evaluator), evaluator); diff --git a/crates/noirc_evaluator/src/ssa/acir_gen/internal_var.rs b/crates/noirc_evaluator/src/ssa/acir_gen/internal_var.rs index a640c9db601..8e6e16776a9 100644 --- a/crates/noirc_evaluator/src/ssa/acir_gen/internal_var.rs +++ b/crates/noirc_evaluator/src/ssa/acir_gen/internal_var.rs @@ -36,7 +36,7 @@ impl InternalVar { &self.expression } pub(crate) fn set_id(&mut self, id: NodeId) { - self.id = Some(id) + self.id = Some(id); } pub(crate) fn get_id(&self) -> Option { self.id diff --git a/crates/noirc_evaluator/src/ssa/acir_gen/operations/intrinsics.rs b/crates/noirc_evaluator/src/ssa/acir_gen/operations/intrinsics.rs index 73e46c266dc..7d6f7e2c32c 100644 --- a/crates/noirc_evaluator/src/ssa/acir_gen/operations/intrinsics.rs +++ b/crates/noirc_evaluator/src/ssa/acir_gen/operations/intrinsics.rs @@ -149,7 +149,7 @@ fn prepare_inputs( let mut inputs: Vec = Vec::new(); for argument in arguments { - inputs.extend(resolve_node_id(argument, acir_gen, cfg, evaluator)) + inputs.extend(resolve_node_id(argument, acir_gen, cfg, evaluator)); } inputs } @@ -212,7 +212,7 @@ fn resolve_array( arr_element.set_witness(witness); acir_gen.memory.insert(array.id, i, arr_element); - inputs.push(func_input) + inputs.push(func_input); } inputs @@ -329,7 +329,7 @@ fn evaluate_println( fn format_field_string(field: FieldElement) -> String { let mut trimmed_field = field.to_hex().trim_start_matches('0').to_owned(); if trimmed_field.len() % 2 != 0 { - trimmed_field = "0".to_owned() + &trimmed_field + trimmed_field = "0".to_owned() + &trimmed_field; }; "0x".to_owned() + &trimmed_field } diff --git a/crates/noirc_evaluator/src/ssa/conditional.rs b/crates/noirc_evaluator/src/ssa/conditional.rs index 36eb2b41f09..c7a9adc7a02 100644 --- a/crates/noirc_evaluator/src/ssa/conditional.rs +++ b/crates/noirc_evaluator/src/ssa/conditional.rs @@ -855,14 +855,14 @@ impl DecisionTree { && left_arrays.is_empty() && right_arrays.is_empty() => { - candidates.push(Segment::new(left_node, right_node)) + candidates.push(Segment::new(left_node, right_node)); } ( Operation::Store { array_id: left_array, index: left_index, .. }, Operation::Store { array_id: right_array, index: right_index, .. }, ) if left_array == right_array && left_index == right_index => { - candidates.push(Segment::new(left_node, right_node)) + candidates.push(Segment::new(left_node, right_node)); } _ => (), } diff --git a/crates/noirc_evaluator/src/ssa/context.rs b/crates/noirc_evaluator/src/ssa/context.rs index 0154b36debc..c7d4dba9799 100644 --- a/crates/noirc_evaluator/src/ssa/context.rs +++ b/crates/noirc_evaluator/src/ssa/context.rs @@ -163,7 +163,7 @@ impl SsaContext { result = format!("{var}"); } if result.is_empty() { - result = format!("unknown {:?}", id.0.into_raw_parts().0) + result = format!("unknown {:?}", id.0.into_raw_parts().0); } result } @@ -250,7 +250,7 @@ impl SsaContext { pub(crate) fn print_instructions(&self, instructions: &[NodeId]) { for id in instructions { - self.print_node(*id) + self.print_node(*id); } } diff --git a/crates/noirc_evaluator/src/ssa/inline.rs b/crates/noirc_evaluator/src/ssa/inline.rs index 08aac4975ff..2cab6018f58 100644 --- a/crates/noirc_evaluator/src/ssa/inline.rs +++ b/crates/noirc_evaluator/src/ssa/inline.rs @@ -241,7 +241,7 @@ fn inline( decision, )?; if result && nested_call { - result = false + result = false; } } Ok(result) diff --git a/crates/noirc_evaluator/src/ssa/integer.rs b/crates/noirc_evaluator/src/ssa/integer.rs index 9a48286f42f..2bdbf80c9e8 100644 --- a/crates/noirc_evaluator/src/ssa/integer.rs +++ b/crates/noirc_evaluator/src/ssa/integer.rs @@ -319,7 +319,7 @@ fn block_overflow( if let Some(r_const) = ctx.get_as_constant(rhs) { let r_type = ctx[rhs].get_type(); if r_const.to_u128() > r_type.bits() as u128 { - ins.mark = Mark::ReplaceWith(ctx.zero_with_type(ins.res_type)) + ins.mark = Mark::ReplaceWith(ctx.zero_with_type(ins.res_type)); } else { let rhs = ctx .get_or_create_const(FieldElement::from(2_i128).pow(&r_const), r_type); diff --git a/crates/noirc_evaluator/src/ssa/node.rs b/crates/noirc_evaluator/src/ssa/node.rs index 215308162d4..8819a96e1c3 100644 --- a/crates/noirc_evaluator/src/ssa/node.rs +++ b/crates/noirc_evaluator/src/ssa/node.rs @@ -1225,7 +1225,7 @@ impl Operation { Cond { condition, val_true: lhs, val_false: rhs } => { *condition = f(*condition); *lhs = f(*lhs); - *rhs = f(*rhs) + *rhs = f(*rhs); } Load { index, .. } => *index = f(*index), Store { index, value, predicate, .. } => { @@ -1291,7 +1291,7 @@ impl Operation { Nop => (), Call { func, arguments, .. } => { f(*func); - arguments.iter().copied().for_each(f) + arguments.iter().copied().for_each(f); } Return(values) => values.iter().copied().for_each(f), Result { call_instruction, .. } => { diff --git a/crates/noirc_evaluator/src/ssa/optimizations.rs b/crates/noirc_evaluator/src/ssa/optimizations.rs index d92a04d1fd6..2e9370961fc 100644 --- a/crates/noirc_evaluator/src/ssa/optimizations.rs +++ b/crates/noirc_evaluator/src/ssa/optimizations.rs @@ -469,7 +469,7 @@ fn cse_block_with_anchor( let mut activate_cse = true; // We do not want to replace any print intrinsics as we want them to remain in order and unchanged if let builtin::Opcode::Println(_) = opcode { - activate_cse = false + activate_cse = false; } for arg in args { diff --git a/crates/noirc_evaluator/src/ssa/ssa_gen.rs b/crates/noirc_evaluator/src/ssa/ssa_gen.rs index e819d83f55d..8205dc8e10c 100644 --- a/crates/noirc_evaluator/src/ssa/ssa_gen.rs +++ b/crates/noirc_evaluator/src/ssa/ssa_gen.rs @@ -10,7 +10,7 @@ use crate::{ {block, builtin, node, ssa_form}, }, }; -use acvm::FieldElement; +use acvm::{acir::native_types::Witness, FieldElement}; use iter_extended::vecmap; use noirc_errors::Location; use noirc_frontend::{ @@ -98,7 +98,7 @@ impl IrGenerator { ident_def: Option, el_type: &noirc_abi::AbiType, len: u64, - witness: Vec, + witness: &[Witness], ) -> NodeId { let element_type = self.get_object_type_from_abi(el_type); let (v_id, array_idx) = self.new_array(name, element_type, len as u32, ident_def); @@ -125,30 +125,24 @@ impl IrGenerator { struct_name: &str, ident_def: Option, fields: &BTreeMap, - witnesses: BTreeMap>, + witnesses: &BTreeMap>, ) -> Value { let values = vecmap(fields, |(name, field_typ)| { let new_name = format!("{struct_name}.{name}"); match field_typ { noirc_abi::AbiType::Array { length, typ } => { - let v_id = - self.abi_array(&new_name, None, typ, *length, witnesses[&new_name].clone()); + let v_id = self.abi_array(&new_name, None, typ, *length, &witnesses[&new_name]); Value::Node(v_id) } noirc_abi::AbiType::Struct { fields, .. } => { let new_name = format!("{struct_name}.{name}"); - self.abi_struct(&new_name, None, fields, witnesses.clone()) + self.abi_struct(&new_name, None, fields, witnesses) } noirc_abi::AbiType::String { length } => { let typ = noirc_abi::AbiType::Integer { sign: noirc_abi::Sign::Unsigned, width: 8 }; - let v_id = self.abi_array( - &new_name, - None, - &typ, - *length, - witnesses[&new_name].clone(), - ); + let v_id = + self.abi_array(&new_name, None, &typ, *length, &witnesses[&new_name]); Value::Node(v_id) } _ => { diff --git a/crates/noirc_frontend/src/graph/mod.rs b/crates/noirc_frontend/src/graph/mod.rs index 1e054ee6699..47426606da1 100644 --- a/crates/noirc_frontend/src/graph/mod.rs +++ b/crates/noirc_frontend/src/graph/mod.rs @@ -120,9 +120,9 @@ impl CrateGraph { return; } for dep in graph[source].dependencies.iter() { - go(graph, visited, res, dep.crate_id) + go(graph, visited, res, dep.crate_id); } - res.push(source) + res.push(source); } } @@ -163,7 +163,7 @@ impl CrateGraph { } impl CrateData { fn add_dep(&mut self, name: CrateName, crate_id: CrateId) { - self.dependencies.push(Dependency { crate_id, name }) + self.dependencies.push(Dependency { crate_id, name }); } } impl std::ops::Index for CrateGraph { diff --git a/crates/noirc_frontend/src/hir/def_collector/dc_crate.rs b/crates/noirc_frontend/src/hir/def_collector/dc_crate.rs index b61376f39ae..55f2464dc62 100644 --- a/crates/noirc_frontend/src/hir/def_collector/dc_crate.rs +++ b/crates/noirc_frontend/src/hir/def_collector/dc_crate.rs @@ -30,7 +30,7 @@ pub struct UnresolvedFunctions { impl UnresolvedFunctions { pub fn push_fn(&mut self, mod_id: LocalModuleId, func_id: FuncId, func: NoirFunction) { - self.functions.push((mod_id, func_id, func)) + self.functions.push((mod_id, func_id, func)); } } @@ -243,7 +243,7 @@ fn collect_impls( } else if typ != Type::Error && crate_id == LOCAL_CRATE { let span = *span; let error = DefCollectorErrorKind::NonStructTypeInImpl { span }; - errors.push(error.into_file_diagnostic(unresolved.file_id)) + errors.push(error.into_file_diagnostic(unresolved.file_id)); } } } @@ -261,7 +261,7 @@ where Errs: IntoIterator, Err: Into, { - errors.extend(new_errors.into_iter().map(|err| err.into().in_file(file))) + errors.extend(new_errors.into_iter().map(|err| err.into().in_file(file))); } /// Separate the globals Vec into two. The first element in the tuple will be the @@ -476,6 +476,6 @@ fn type_check_functions( errors: &mut Vec, ) { for (file, func) in file_func_ids { - extend_errors(errors, file, type_check_func(interner, func)) + extend_errors(errors, file, type_check_func(interner, func)); } } diff --git a/crates/noirc_frontend/src/hir/def_collector/dc_mod.rs b/crates/noirc_frontend/src/hir/def_collector/dc_mod.rs index bee7f1755c8..989d87e0720 100644 --- a/crates/noirc_frontend/src/hir/def_collector/dc_mod.rs +++ b/crates/noirc_frontend/src/hir/def_collector/dc_mod.rs @@ -37,7 +37,7 @@ pub fn collect_defs( // First resolve the module declarations for decl in ast.module_decls { - collector.parse_module_declaration(context, &decl, crate_id, errors) + collector.parse_module_declaration(context, &decl, crate_id, errors); } collector.collect_submodules(context, crate_id, ast.submodules, file_id, errors); diff --git a/crates/noirc_frontend/src/hir/resolution/import.rs b/crates/noirc_frontend/src/hir/resolution/import.rs index bd8f3e5e634..79176d74afc 100644 --- a/crates/noirc_frontend/src/hir/resolution/import.rs +++ b/crates/noirc_frontend/src/hir/resolution/import.rs @@ -168,7 +168,7 @@ fn resolve_name_in_module( return Err(PathResolutionError::ExternalContractUsed(segment.clone())); } - current_ns = found_ns + current_ns = found_ns; } Ok(current_ns) diff --git a/crates/noirc_frontend/src/hir/resolution/resolver.rs b/crates/noirc_frontend/src/hir/resolution/resolver.rs index e0e282e0e02..cfb354498ab 100644 --- a/crates/noirc_frontend/src/hir/resolution/resolver.rs +++ b/crates/noirc_frontend/src/hir/resolution/resolver.rs @@ -121,7 +121,7 @@ impl<'a> Resolver<'a> { } fn push_err(&mut self, err: ResolverError) { - self.errors.push(err) + self.errors.push(err); } fn current_lambda_index(&self) -> usize { @@ -410,7 +410,7 @@ impl<'a> Resolver<'a> { }); // Fix the generic count so we can continue typechecking - args.resize_with(expected_generic_count, || Type::Error) + args.resize_with(expected_generic_count, || Type::Error); } Type::Struct(struct_type, args) @@ -555,7 +555,7 @@ impl<'a> Resolver<'a> { name: generic.0.contents.clone(), first_span: *first_span, second_span: span, - }) + }); } else { self.generics.push((name, typevar.clone(), span)); } @@ -616,7 +616,7 @@ impl<'a> Resolver<'a> { for (pattern, typ, visibility) in func.parameters().iter().cloned() { if visibility == noirc_abi::AbiVisibility::Public && !self.pub_allowed(func) { - self.push_err(ResolverError::UnnecessaryPub { ident: func.name_ident().clone() }) + self.push_err(ResolverError::UnnecessaryPub { ident: func.name_ident().clone() }); } let pattern = self.resolve_pattern(pattern, DefinitionKind::Local(None)); @@ -634,13 +634,13 @@ impl<'a> Resolver<'a> { && return_type.as_ref() != &Type::Unit && func.def.return_visibility != noirc_abi::AbiVisibility::Public { - self.push_err(ResolverError::NecessaryPub { ident: func.name_ident().clone() }) + self.push_err(ResolverError::NecessaryPub { ident: func.name_ident().clone() }); } if attributes == Some(Attribute::Test) && !parameters.is_empty() { self.push_err(ResolverError::TestFunctionHasParameters { span: func.name_ident().span(), - }) + }); } let mut typ = Type::Function(parameter_types, return_type); @@ -1017,7 +1017,7 @@ impl<'a> Resolver<'a> { } Pattern::Mutable(pattern, span) => { if let Some(first_mut) = mutable { - self.push_err(ResolverError::UnnecessaryMut { first_mut, second_mut: span }) + self.push_err(ResolverError::UnnecessaryMut { first_mut, second_mut: span }); } let pattern = self.resolve_pattern_mutable(*pattern, Some(span), definition); @@ -1491,7 +1491,7 @@ mod test { fn path_unresolved_error(err: ResolverError, expected_unresolved_path: &str) { match err { ResolverError::PathResolutionError(PathResolutionError::Unresolved(name)) => { - assert_eq!(name.to_string(), expected_unresolved_path) + assert_eq!(name.to_string(), expected_unresolved_path); } _ => unimplemented!("expected an unresolved path"), } diff --git a/crates/noirc_frontend/src/hir/scope/mod.rs b/crates/noirc_frontend/src/hir/scope/mod.rs index 85b7e2e62e9..1a9087a7408 100644 --- a/crates/noirc_frontend/src/hir/scope/mod.rs +++ b/crates/noirc_frontend/src/hir/scope/mod.rs @@ -90,7 +90,7 @@ impl ScopeTree { } pub fn push_scope(&mut self) { - self.0.push(Scope::default()) + self.0.push(Scope::default()); } pub fn pop_scope(&mut self) -> Scope { @@ -135,7 +135,7 @@ impl ScopeForest { } fn extend_current_scope_tree(&mut self) { - self.current_scope_tree().push_scope() + self.current_scope_tree().push_scope(); } fn remove_scope_tree_extension(&mut self) -> Scope { @@ -145,7 +145,7 @@ impl ScopeForest { /// Starting a function requires a new scope tree, as you do not want the functions scope to /// have access to the scope of the caller pub fn start_function(&mut self) { - self.0.push(ScopeTree::default()) + self.0.push(ScopeTree::default()); } /// Ending a function requires that we removes it's whole tree of scope @@ -157,7 +157,7 @@ impl ScopeForest { /// The beginning of a scope always correlates with the start of a block {}. /// This can be in if expressions, for loops, or functions. pub fn start_scope(&mut self) { - self.extend_current_scope_tree() + self.extend_current_scope_tree(); } /// Ends the current scope - this should correspond with the end of a BlockExpression. diff --git a/crates/noirc_frontend/src/hir/type_check/mod.rs b/crates/noirc_frontend/src/hir/type_check/mod.rs index 23907f6b3b4..97b1c71a0bc 100644 --- a/crates/noirc_frontend/src/hir/type_check/mod.rs +++ b/crates/noirc_frontend/src/hir/type_check/mod.rs @@ -101,7 +101,7 @@ impl<'interner> TypeChecker<'interner> { span: Span, make_error: impl FnOnce() -> TypeCheckError, ) { - actual.unify(expected, span, &mut self.errors, make_error) + actual.unify(expected, span, &mut self.errors, make_error); } /// Wrapper of Type::make_subtype_of using self.errors @@ -112,7 +112,7 @@ impl<'interner> TypeChecker<'interner> { span: Span, make_error: impl FnOnce() -> TypeCheckError, ) { - actual.make_subtype_of(expected, span, &mut self.errors, make_error) + actual.make_subtype_of(expected, span, &mut self.errors, make_error); } } @@ -362,7 +362,7 @@ mod test { for ((hir_func, meta), func_id) in func_meta.into_iter().zip(func_ids.clone()) { interner.update_fn(func_id, hir_func); - interner.push_fn_meta(meta, func_id) + interner.push_fn_meta(meta, func_id); } // Type check section diff --git a/crates/noirc_frontend/src/hir_def/types.rs b/crates/noirc_frontend/src/hir_def/types.rs index ff113f83c51..be7d90e089f 100644 --- a/crates/noirc_frontend/src/hir_def/types.rs +++ b/crates/noirc_frontend/src/hir_def/types.rs @@ -126,7 +126,7 @@ pub type Generics = Vec<(TypeVariableId, TypeVariable)>; impl std::hash::Hash for StructType { fn hash(&self, state: &mut H) { - self.id.hash(state) + self.id.hash(state); } } @@ -230,7 +230,7 @@ pub struct Shared(Rc>); impl std::hash::Hash for Shared { fn hash(&self, state: &mut H) { - self.0.borrow().hash(state) + self.0.borrow().hash(state); } } @@ -705,7 +705,7 @@ impl Type { pub fn set_comp_time_span(&mut self, new_span: Span) { match self { Type::FieldElement(comptime) | Type::Integer(comptime, _, _) => { - comptime.set_span(new_span) + comptime.set_span(new_span); } Type::PolymorphicInteger(span, binding) => { if let TypeBinding::Bound(binding) = &mut *binding.borrow_mut() { @@ -865,7 +865,7 @@ impl Type { make_error: impl FnOnce() -> TypeCheckError, ) { if let Err(err_span) = self.try_unify(expected, span) { - Self::issue_errors(expected, err_span, errors, make_error) + Self::issue_errors(expected, err_span, errors, make_error); } } @@ -1006,7 +1006,7 @@ impl Type { make_error: impl FnOnce() -> TypeCheckError, ) { if let Err(err_span) = self.is_subtype_of(expected, span) { - Self::issue_errors(expected, err_span, errors, make_error) + Self::issue_errors(expected, err_span, errors, make_error); } } diff --git a/crates/noirc_frontend/src/lexer/lexer.rs b/crates/noirc_frontend/src/lexer/lexer.rs index da4af04c001..c1ff328a3ed 100644 --- a/crates/noirc_frontend/src/lexer/lexer.rs +++ b/crates/noirc_frontend/src/lexer/lexer.rs @@ -216,7 +216,7 @@ impl<'a> Lexer<'a> { // Therefore, the current character which triggered this function will need to be appended let mut word = String::new(); if let Some(init_char) = initial_char { - word.push(init_char) + word.push(init_char); } // Keep checking that we are not at the EOF diff --git a/crates/noirc_frontend/src/lexer/token.rs b/crates/noirc_frontend/src/lexer/token.rs index 73ff6bfdedb..0df1fc39938 100644 --- a/crates/noirc_frontend/src/lexer/token.rs +++ b/crates/noirc_frontend/src/lexer/token.rs @@ -539,7 +539,7 @@ mod keywords { resolved_token, Token::Keyword(keyword), "Keyword::lookup_keyword returns unexpected Keyword" - ) + ); } } } diff --git a/crates/noirc_frontend/src/lib.rs b/crates/noirc_frontend/src/lib.rs index 2e375e637e0..e7d95d3dfc8 100644 --- a/crates/noirc_frontend/src/lib.rs +++ b/crates/noirc_frontend/src/lib.rs @@ -8,6 +8,7 @@ #![forbid(unsafe_code)] #![warn(unused_crate_dependencies, unused_extern_crates)] #![warn(unreachable_pub)] +#![warn(clippy::semicolon_if_nothing_returned)] pub mod ast; pub mod graph; diff --git a/crates/noirc_frontend/src/node_interner.rs b/crates/noirc_frontend/src/node_interner.rs index 4479fe91135..d8ea11ae89c 100644 --- a/crates/noirc_frontend/src/node_interner.rs +++ b/crates/noirc_frontend/src/node_interner.rs @@ -320,7 +320,7 @@ impl NodeInterner { pub fn update_struct(&mut self, type_id: StructId, f: impl FnOnce(&mut StructType)) { let mut value = self.structs.get_mut(&type_id).unwrap().borrow_mut(); - f(&mut value) + f(&mut value); } /// Returns the interned statement corresponding to `stmt_id` diff --git a/crates/noirc_frontend/src/parser/mod.rs b/crates/noirc_frontend/src/parser/mod.rs index fa0903ee659..788c0eec895 100644 --- a/crates/noirc_frontend/src/parser/mod.rs +++ b/crates/noirc_frontend/src/parser/mod.rs @@ -263,7 +263,7 @@ impl ParsedModule { } fn push_global(&mut self, global: LetStatement) { - self.globals.push(global) + self.globals.push(global); } } diff --git a/crates/noirc_frontend/src/parser/parser.rs b/crates/noirc_frontend/src/parser/parser.rs index 62824023daf..f4793d06368 100644 --- a/crates/noirc_frontend/src/parser/parser.rs +++ b/crates/noirc_frontend/src/parser/parser.rs @@ -856,7 +856,7 @@ where emit(ParserError::with_reason( "Arrays must have at least one element".to_owned(), span, - )) + )); } ExpressionKind::array(elements) }) @@ -1135,7 +1135,7 @@ mod test { match expr_to_array(expr) { ArrayLiteral::Standard(elements) => assert_eq!(elements.len(), 5), ArrayLiteral::Repeated { length, .. } => { - assert_eq!(length.kind, ExpressionKind::integer(5i128.into())) + assert_eq!(length.kind, ExpressionKind::integer(5i128.into())); } } } @@ -1367,7 +1367,7 @@ mod test { for (src, expected_path_kind) in cases { let path = parse_with(path(), src).unwrap(); - assert_eq!(path.kind, expected_path_kind) + assert_eq!(path.kind, expected_path_kind); } parse_all_failing( diff --git a/crates/wasm/src/lib.rs b/crates/wasm/src/lib.rs index 90a9bf0f173..56995c21df5 100644 --- a/crates/wasm/src/lib.rs +++ b/crates/wasm/src/lib.rs @@ -1,6 +1,8 @@ #![forbid(unsafe_code)] #![warn(unused_crate_dependencies, unused_extern_crates)] #![warn(unreachable_pub)] +#![warn(clippy::semicolon_if_nothing_returned)] + use gloo_utils::format::JsValueSerdeExt; use log::Level; use serde::{Deserialize, Serialize};