diff --git a/Cargo.lock b/Cargo.lock index b22faf3e8c..dc6660f7c3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1427,6 +1427,7 @@ dependencies = [ "derivative", "eyre", "leo-input", + "leo-span", "pest", "serde", "tendril", diff --git a/errors/Cargo.toml b/errors/Cargo.toml index c1528740d8..2f49f02fec 100644 --- a/errors/Cargo.toml +++ b/errors/Cargo.toml @@ -16,11 +16,15 @@ categories = [ "cryptography::cryptocurrencies", "web-programming" ] include = [ "Cargo.toml", "src", "README.md", "LICENSE.md" ] license = "GPL-3.0" edition = "2021" -rust-version = "1.56.1" +rust-version = "1.56" [dependencies] colored = "2.0.0" +[dependencies.leo-span] +path = "../span" +version = "1.5.3" + [dependencies.leo-input] path = "../input" version = "1.5.3" diff --git a/errors/src/asg/asg_errors.rs b/errors/src/asg/asg_errors.rs index b507af18e4..4447d1aa1a 100644 --- a/errors/src/asg/asg_errors.rs +++ b/errors/src/asg/asg_errors.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify @@ -416,7 +416,7 @@ create_errors!( @formatted duplicate_alias_definition { args: (name: impl Display), - msg: format!("a alias named \"{}\" already exists in this scope", name), + msg: format!("an alias named \"{}\" already exists in this scope", name), help: None, } @@ -468,10 +468,67 @@ create_errors!( help: None, } + /// For when operator is used on an unsupported type. @formatted operator_allowed_only_for_type { args: (operator: impl Display, type_: impl Display, received: impl Display), msg: format!("operator '{}' is only allowed for type '{}', received: '{}'", operator, type_, received), help: None, } + + /// For when a user tries to call a circuit variable as a function. + @formatted + circuit_const_call { + args: (circuit_name: impl Display, name: impl Display), + msg: format!("cannot call const member '{}' of circuit '{}'", name, circuit_name), + help: None, + } + + /// For when `input` variable is accessed inside a const function. + @formatted + illegal_input_variable_reference_in_const_function { + args: (), + msg: "input access is illegal in const functions", + help: None, + } + + /// For when non-const function is called from a const context. + @formatted + calling_non_const_in_const_context { + args: (), + msg: "non-const functions cannot be called from const context", + help: None, + } + + /// For when const function modifier is added to the main function. + @formatted + main_cannot_be_const { + args: (), + msg: "main function cannot be const", + help: None, + } + + /// For when const function has non-const inputs or self. + @formatted + const_function_cannot_have_inputs { + args: (), + msg: "const function cannot have non-const input", + help: None, + } + + /// For when `main` is annotated. + @formatted + main_cannot_have_annotations { + args: (), + msg: "main function cannot have annotations", + help: None, + } + + /// For when unsupported annotation is added. + @formatted + unsupported_annotation { + args: (name: impl Display), + msg: format!("annotation `{}` does not exist", name), + help: None, + } ); diff --git a/errors/src/asg/mod.rs b/errors/src/asg/mod.rs index 8e7bb75e7d..515dade3c9 100644 --- a/errors/src/asg/mod.rs +++ b/errors/src/asg/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify diff --git a/errors/src/ast/ast_errors.rs b/errors/src/ast/ast_errors.rs index 9274ecd23d..fa2c6b6f81 100644 --- a/errors/src/ast/ast_errors.rs +++ b/errors/src/ast/ast_errors.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify @@ -38,7 +38,7 @@ create_errors!( @backtraced failed_to_create_ast_json_file { args: (path: impl Debug, error: impl ErrorArg), - msg: format!("failed to creat ast json file `{:?}` {}", path, error), + msg: format!("failed to create ast json file `{:?}` {}", path, error), help: None, } @@ -130,5 +130,4 @@ create_errors!( msg: format!("failed to convert ast to a json value {}", error), help: None, } - ); diff --git a/errors/src/ast/mod.rs b/errors/src/ast/mod.rs index b783e63d57..34c67fa4f3 100644 --- a/errors/src/ast/mod.rs +++ b/errors/src/ast/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify diff --git a/errors/src/cli/cli_errors.rs b/errors/src/cli/cli_errors.rs index 28f8b9b77e..86e1146ba0 100644 --- a/errors/src/cli/cli_errors.rs +++ b/errors/src/cli/cli_errors.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify diff --git a/errors/src/cli/mod.rs b/errors/src/cli/mod.rs index 1ed1b9473f..7590bce552 100644 --- a/errors/src/cli/mod.rs +++ b/errors/src/cli/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify diff --git a/errors/src/common/backtraced.rs b/errors/src/common/backtraced.rs index 67c0fab0f1..b98b4e1275 100644 --- a/errors/src/common/backtraced.rs +++ b/errors/src/common/backtraced.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify diff --git a/errors/src/common/formatted.rs b/errors/src/common/formatted.rs index 5987f19fe7..3e4cc5dc4c 100644 --- a/errors/src/common/formatted.rs +++ b/errors/src/common/formatted.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify @@ -14,13 +14,14 @@ // You should have received a copy of the GNU General Public License // along with the Leo library. If not, see . -use crate::{BacktracedError, Span, INDENT}; +use crate::{BacktracedError, INDENT}; -use std::fmt; +use leo_span::Span; use backtrace::Backtrace; use color_backtrace::{BacktracePrinter, Verbosity}; use colored::Colorize; +use std::fmt; /// Formatted compiler error type /// undefined value `x` diff --git a/errors/src/common/macros.rs b/errors/src/common/macros.rs index 21745f00fd..f284845e4c 100644 --- a/errors/src/common/macros.rs +++ b/errors/src/common/macros.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify @@ -28,7 +28,7 @@ macro_rules! create_errors { }; ($(#[$error_type_docs:meta])* $error_type:ident, exit_code_mask: $exit_code_mask:expr, error_code_prefix: $error_code_prefix:expr, $($(#[$docs:meta])* @$formatted_or_backtraced_list:ident $names:ident { args: ($($arg_names:ident: $arg_types:ty$(,)?)*), msg: $messages:expr, help: $helps:expr, })*) => { #[allow(unused_imports)] // Allow unused for errors that only use formatted or backtraced errors. - use crate::{BacktracedError, FormattedError, LeoErrorCode, Span}; + use crate::{BacktracedError, FormattedError, LeoErrorCode}; use backtrace::Backtrace; @@ -83,7 +83,7 @@ macro_rules! create_errors { // Formatted errors always takes a span. $(#[$error_func_docs])* // Expands additional arguments for the error defining function. - pub fn $error_name($($arg_names: $arg_types,)* span: &Span) -> Self { + pub fn $error_name($($arg_names: $arg_types,)* span: &leo_span::Span) -> Self { Self::FormattedError( FormattedError::new_from_span( $message, diff --git a/errors/src/common/mod.rs b/errors/src/common/mod.rs index a8a9bc4c77..183d41c62a 100644 --- a/errors/src/common/mod.rs +++ b/errors/src/common/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify @@ -27,20 +27,6 @@ pub use self::formatted::*; pub mod macros; pub use self::macros::*; -/// This module contains the common span object for Leo crates. -pub mod span; -pub use self::span::Span; - -/// This module contains a custome serialize/deserialize -/// implementation for Span. -pub mod span_json; -pub use self::span_json::*; - -/// This module contains information on how to serialize and -/// deserialze StrTendril type. -pub mod tendril_json; -pub use self::tendril_json::*; - /// This module contains traits for making errors easily. pub mod traits; pub use self::traits::*; diff --git a/errors/src/common/span.rs b/errors/src/common/span.rs deleted file mode 100644 index a04ab738b4..0000000000 --- a/errors/src/common/span.rs +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. -// This file is part of the Leo library. - -// The Leo library is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// The Leo library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with the Leo library. If not, see . - -use std::{fmt, sync::Arc, usize}; - -use pest::Span as PestSpan; -use serde::ser::{Serialize, SerializeStruct, Serializer}; -use serde::Deserialize; -use tendril::StrTendril; - -/// The span type which tracks where formatted errors originate from in a Leo file. -/// This is used in many spots throughout the rest of the Leo crates. -#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, PartialEq)] -pub struct Span { - /// The line number where the error started. - pub line_start: usize, - /// The line number where the error stopped. - pub line_stop: usize, - /// The column number where the error started. - pub col_start: usize, - /// The column number where the error stopped. - pub col_stop: usize, - /// The path to the Leo file containing the error. - pub path: Arc, - #[serde(with = "crate::tendril_json")] - /// The content of the file between the above boundries. - pub content: StrTendril, -} - -impl Span { - /// Generate a new span from where: - /// - the Leo line starts. - /// - the Leo line stops. - /// - the Leo column starts. - /// - the Leo column stops. - /// - the path to the Leo file. - /// - the content of those specified bounds. - pub fn new( - line_start: usize, - line_stop: usize, - col_start: usize, - col_stop: usize, - path: Arc, - content: StrTendril, - ) -> Self { - Self { - line_start, - line_stop, - col_start, - col_stop, - path, - content, - } - } -} - -impl Serialize for Span { - /// Custom serialization for testing purposes. - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - let mut state = serializer.serialize_struct("Color", 3)?; - state.serialize_field("line_start", &self.line_start)?; - state.serialize_field("line_stop", &self.line_stop)?; - state.serialize_field("col_start", &self.col_start)?; - state.serialize_field("col_stop", &self.col_stop)?; - // This is for testing purposes since the tests are run on a variety of OSes. - if std::env::var("LEO_TESTFRAMEWORK") - .unwrap_or_default() - .trim() - .to_owned() - .is_empty() - { - state.serialize_field("path", &self.path)?; - } else { - state.serialize_field("path", "")?; - } - state.serialize_field("content", &self.content[..])?; - state.end() - } -} - -/// Conversion from a pest span where the leo-input library uses these. -impl fmt::Display for Span { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - if self.line_start == self.line_stop { - write!(f, "{}:{}-{}", self.line_start, self.col_start, self.col_stop) - } else { - write!( - f, - "{}:{}-{}:{}", - self.line_start, self.col_start, self.line_stop, self.col_stop - ) - } - } -} - -impl<'ast> From> for Span { - fn from(span: PestSpan) -> Self { - let start = span.start_pos().line_col(); - let end = span.end_pos().line_col(); - - Span::new( - start.0, - end.0, - start.1, - end.1, - Arc::new(String::new()), - span.as_str().into(), - ) - } -} - -impl std::ops::Add for &Span { - type Output = Span; - - fn add(self, other: &Span) -> Span { - self.clone() + other.clone() - } -} - -impl std::ops::Add for Span { - type Output = Self; - - #[allow(clippy::comparison_chain)] - fn add(self, other: Self) -> Self { - if self.line_start == other.line_stop { - Span { - line_start: self.line_start, - line_stop: self.line_stop, - col_start: self.col_start.min(other.col_start), - col_stop: self.col_stop.max(other.col_stop), - path: self.path, - content: self.content, - } - } else { - let mut new_content = vec![]; - let self_lines = self.content.lines().collect::>(); - let other_lines = other.content.lines().collect::>(); - for line in self.line_start.min(other.line_start)..self.line_stop.max(other.line_stop) + 1 { - if line >= self.line_start && line <= self.line_stop { - new_content.push( - self_lines - .get(line - self.line_start) - .copied() - .unwrap_or_default() - .to_string(), - ); - } else if line >= other.line_start && line <= other.line_stop { - new_content.push( - other_lines - .get(line - other.line_start) - .copied() - .unwrap_or_default() - .to_string(), - ); - } else if new_content.last().map(|x| *x != "...").unwrap_or(true) { - new_content.push(format!("{:<1$}...", " ", other.col_start + 4)); - } - } - let new_content = new_content.join("\n").into(); - if self.line_start < other.line_stop { - Span { - line_start: self.line_start, - line_stop: other.line_stop, - col_start: self.col_start, - col_stop: other.col_stop, - path: self.path, - content: new_content, - } - } else { - Span { - line_start: other.line_start, - line_stop: self.line_stop, - col_start: other.col_start, - col_stop: self.col_stop, - path: self.path, - content: new_content, - } - } - } - } -} diff --git a/errors/src/common/span_json.rs b/errors/src/common/span_json.rs deleted file mode 100644 index 6627ead7e1..0000000000 --- a/errors/src/common/span_json.rs +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. -// This file is part of the Leo library. - -// The Leo library is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// The Leo library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with the Leo library. If not, see . -use crate::Span; - -use std::fmt; - -use serde::de::{MapAccess, Visitor}; -use serde::ser::SerializeMap; -use serde::{Deserializer, Serializer}; - -/// The AST contains a few tuple-like enum variants the contain spans -/// #[derive(Serialize, Deserialize)] outputs these fields as anonmyous -/// mappings, which makes them difficult to remove from the JSON AST. -/// This function provides a custom serialization that maps the keyword -/// `span` to the span information. -pub fn serialize(span: &Span, serializer: S) -> Result { - let mut map = serializer.serialize_map(Some(1))?; - map.serialize_entry("span", span)?; - map.end() -} - -/// Custom deserialization to enable removing spans from enums. -pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result { - deserializer.deserialize_map(SpanMapVisitor) -} - -/// This visitor is used by the deserializer to unwrap mappings -/// and extract span information. -struct SpanMapVisitor; - -impl<'de> Visitor<'de> for SpanMapVisitor { - type Value = Span; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("Mapping from `span` keyword to span information") - } - - fn visit_map>(self, mut access: M) -> Result { - let (_, value): (String, Span) = access.next_entry()?.unwrap(); - Ok(value) - } -} diff --git a/errors/src/common/tendril_json.rs b/errors/src/common/tendril_json.rs deleted file mode 100644 index bbbe571bcd..0000000000 --- a/errors/src/common/tendril_json.rs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. -// This file is part of the Leo library. - -// The Leo library is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// The Leo library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with the Leo library. If not, see . - -use serde::{Deserialize, Deserializer, Serializer}; -use tendril::StrTendril; - -/// Serialization for the StrTendril type. -pub fn serialize(tendril: &StrTendril, serializer: S) -> Result { - serializer.serialize_str(&tendril[..]) -} - -/// Deserialization for the StrTendril type. -pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result { - Ok(String::deserialize(deserializer)?.into()) -} diff --git a/errors/src/common/traits.rs b/errors/src/common/traits.rs index a1bbfc3dbf..ee3c8ac719 100644 --- a/errors/src/common/traits.rs +++ b/errors/src/common/traits.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify diff --git a/errors/src/compiler/compiler_errors.rs b/errors/src/compiler/compiler_errors.rs index 9055d19ae5..be14c95d06 100644 --- a/errors/src/compiler/compiler_errors.rs +++ b/errors/src/compiler/compiler_errors.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify @@ -87,31 +87,6 @@ create_errors!( help: None, } - /// For when a user tries to user console assert outside of a test function. - @formatted - console_assertion_depends_on_input { - args: (), - msg: "console.assert() does not produce constraints and cannot use inputs. \ - Assertions should only be used in @test functions", - help: None, - } - - /// For when a console assert fails. - @formatted - console_assertion_failed { - args: (), - msg: "console.assert(...) failed", - help: None, - } - - /// For when a console assert value is not a boolean. - @formatted - console_assertion_must_be_boolean { - args: (), - msg: "Assertion expression must evaluate to a boolean value", - help: None, - } - /// For when a experssion gadget oepration cannot be enforced due to a SnarkVM syntehsis error. @formatted cannot_enforce_expression { @@ -131,30 +106,6 @@ create_errors!( help: None, } - /// For when an array length goes out of the legal bounds of 2^32. - @formatted - array_length_out_of_bounds { - args: (), - msg: "array length cannot be >= 2^32", - help: None, - } - - /// For when an array index goes out of the legal bounds of 2^32. - @formatted - array_index_out_of_legal_bounds { - args: (), - msg: "array index cannot be >= 2^32", - help: None, - } - - /// For when a boolean expression does not resolve to a boolean type. - @formatted - conditional_boolean_expression_fails_to_resolve_to_bool { - args: (actual: impl Display), - msg: format!("if, else conditional must resolve to a boolean, found `{}`", actual), - help: None, - } - /// For when the expected circuit member could not be found. @formatted expected_circuit_member { @@ -163,38 +114,6 @@ create_errors!( help: None, } - /// For when the operation has no implementation on the type of variable received. - @formatted - incompatible_types { - args: (operation: impl Display), - msg: format!("no implementation for `{}`", operation), - help: None, - } - - /// For when a tuple index goes out of the tuples size bounds. - @formatted - tuple_index_out_of_bounds { - args: (index: impl Display), - msg: format!("cannot access index {} of tuple out of bounds", index), - help: None, - } - - /// For when an array index goes out of the arrays size bounds. - @formatted - array_index_out_of_bounds { - args: (index: impl Display), - msg: format!("cannot access index {} of array out of bounds", index), - help: None, - } - - /// For when a invalid array slice length is requested. - @formatted - array_invalid_slice_length { - args: (), - msg: "illegal length of slice", - help: None, - } - /// For when an array index does not resolve to an integer type. @formatted invalid_index_expression { @@ -203,57 +122,6 @@ create_errors!( help: None, } - /// For when a typed array receives an assignment of an array with a different length. - @formatted - unexpected_array_length { - args: (expected: impl Display, actual: impl Display), - msg: format!("expected array length {}, found one with length {}", expected, actual), - help: None, - } - - /// For when the circuit static member does not exist. - @formatted - invalid_circuit_static_member_access { - args: (member: impl Display), - msg: format!("invalid circuit static member `{}` must be accessed using `::` syntax", member), - help: None, - } - - /// For when a user is trying to use an array in access expression before it is declared. - @formatted - undefined_array { - args: (actual: impl Display), - msg: format!("array `{}` must be declared before it is used in an expression", actual), - help: None, - } - - /// For when the user is trying to us a circuit that is not yet declared. - @formatted - undefined_circuit { - args: (actual: impl Display), - msg: format!( - "circuit `{}` must be declared before it is used in an expression", - actual - ), - help: None, - } - - /// For when the user tries to use an identifier not declared in scope. - @formatted - undefined_identifier { - args: (name: impl Display), - msg: format!("Cannot find value `{}` in this scope", name), - help: None, - } - - /// For when the user tries to access an undefined circuit member. - @formatted - undefined_circuit_member_access { - args: (circuit: impl Display, member: impl Display), - msg: format!("Circuit `{}` has no member `{}`", circuit, member), - help: None, - } - /// For when the input variable type mismatches the declared function input type. @formatted input_variable_type_mismatch { @@ -265,30 +133,6 @@ create_errors!( help: None, } - /// For when the declared function input variable was expected to be constant - /// but the input file did not have it in the constants section. - @formatted - expected_const_input_variable { - args: (variable: impl Display), - msg: format!( - "Expected input variable `{}` to be constant. Move input variable `{}` to [constants] section of input file", - variable, variable - ), - help: None, - } - - /// For when the declared function input variable was expected to be mutable - /// but the input file did not have it in the main section. - @formatted - expected_non_const_input_variable { - args: (variable: impl Display), - msg: format!( - "Expected input variable `{}` to be non-constant. Move input variable `{}` to [main] section of input file", - variable, variable - ), - help: None, - } - /// For when the declared function input variable was expected to be a valid array /// in the input file. @formatted @@ -330,7 +174,7 @@ create_errors!( help: None, } - /// For when the declared function input variable was expected to be a valid tuple + /// For when the declared function input variable was not defined /// in the input file. @formatted function_input_not_found { @@ -339,6 +183,14 @@ create_errors!( help: None, } + /// For when the declared function input register was not defined + @formatted + function_missing_input_register { + args: (expected: impl Display), + msg: format!("missing input '{}' for registers", expected), + help: None, + } + /// For when the declared function input variable was defined twice /// in the input file. @formatted @@ -367,6 +219,14 @@ create_errors!( help: None, } + /// For when a circuit was passed as input + @formatted + circuit_as_input { + args: (), + msg: "input circuits not supported for input", + help: None, + } + /// For when there's an IO error with the output file. @backtraced output_file_io_error { @@ -375,14 +235,6 @@ create_errors!( help: None, } - /// For when the output file cannot be read. - @backtraced - output_file_cannot_read { - args: (path: impl Debug), - msg: format!("Cannot read the provided ouput file - {:?}", path), - help: None, - } - /// For when the output file cannot be removed. @backtraced output_file_cannot_remove { @@ -391,98 +243,6 @@ create_errors!( help: None, } - /// For when the user tries to index a single array more than once. - @formatted - statement_array_assign_index { - args: (), - msg: "Cannot assign single index to array of values", - help: None, - } - - /// For when the user tries to use a non const value as an index. - @formatted - statement_array_assign_index_const { - args: (), - msg: "Cannot assign to non-const array index", - help: None, - } - - /// For when the user tries to assign an index to something not an array of length >= 1; - @formatted - statement_array_assign_interior_index { - args: (), - msg: "Cannot assign single index to interior of array of values", - help: None, - } - - /// For when the user tries to assign a range of values to something that expected a single value. - @formatted - statement_array_assign_range { - args: (), - msg: "Cannot assign range of array values to single value", - help: None, - } - - /// For when the user tries to index a value from an array that is >= the array length. - @formatted - statement_array_assign_index_bounds { - args: (index: impl Display, length: impl Display), - msg: format!( - "Array assign index `{}` out of range for array of length `{}`", - index, length - ), - help: None, - } - - /// For when the user defines an array range values that is >= the array length. - @formatted - statement_array_assign_range_order { - args: (start: impl Display, stop: impl Display, length: impl Display), - msg: format!( - "Array assign range `{}`..`{}` out of range for array of length `{}`", - start, stop, length - ), - help: None, - } - - /// For when the statement conditional boolean fails to resolve to a boolean. - @formatted - statement_conditional_boolean_fails_to_resolve_to_boolean { - args: (actual: impl Display), - msg: format!("If, else conditional must resolve to a boolean, found `{}`", actual), - help: None, - } - - /// For when there was an error in SnarkVM trying to do a bit and operation. - @formatted - statement_indicator_calculation { - args: (name: impl Display), - msg: format!( - "Constraint system failed to evaluate branch selection indicator `{}`", - name - ), - help: None, - } - - /// For when a multi definition statement found a differing number of values and variable names. - @formatted - statement_invalid_number_of_definitions { - args: (expected: impl Display, actual: impl Display), - msg: format!( - "Multiple definition statement expected {} values, found {} variable names", - expected, actual - ), - help: None, - } - - /// For when the user tries to assign multiple variables to a single value. - @formatted - statement_multiple_definition { - args: (value: impl Display), - msg: format!("cannot assign multiple variables to a single value: {}", value), - help: None, - } - /// For when a function returns multiple times. @formatted statement_multiple_returns { @@ -513,65 +273,6 @@ create_errors!( help: None, } - /// For when the user tries to index a single tuple more than once. - @formatted - statement_tuple_assign_index { - args: (), - msg: "Cannot assign single index to tuple of values", - help: None, - } - - /// For when the user tries to index a value from an tuple that is >= the tuple length. - @formatted - statement_tuple_assign_index_bounds { - args: (index: impl Display, length: impl Display), - msg: format!( - "Tuple assign index `{}` out of range for tuple of length `{}`", - index, length - ), - help: None, - } - - /// For when the user doesn't assign or return the expression. - @formatted - statement_unassigned { - args: (), - msg: "Expected assignment of return values for expression", - help: None, - } - - /// For when a statement tries to use an unknown variable. - @formatted - statement_undefined_variable { - args: (name: impl Display), - msg: format!("Attempted to assign to unknown variable `{}`", name), - help: None, - } - - /// For when the user defines a statement that tries to access an unknown circuit member variable. - @formatted - statement_undefined_circuit_variable { - args: (name: impl Display), - msg: format!("Attempted to assign to unknown circuit member variable `{}`", name), - help: None, - } - - /// For when the user uses a nont const value for an iteration range. - @formatted - statement_loop_index_const { - args: (), - msg: "iteration range must be const", - help: None, - } - - /// For when there is an issue with an address value account. - @formatted - address_value_account_error { - args: (error: impl ErrorArg), - msg: format!("account creation failed due to `{}`", error), - help: None, - } - /// For when there is an invalid address value. @formatted address_value_invalid_address { @@ -580,229 +281,6 @@ create_errors!( help: None, } - /// For when an a address value was expected but none was found. - @formatted - address_value_missing_address { - args: (), - msg: "expected address input not found", - help: None, - } - - /// For when an a boolean operation cannot be enforced due to a SnarkVM synthesis error. - @formatted - boolean_value_cannot_enforce { - args: (operation: impl Display, error: impl ErrorArg), - msg: format!( - "the boolean operation `{}` failed due to the synthesis error `{}`", - operation, error, - ), - help: None, - } - - /// For when an a invalid boolean operation is called. - @formatted - boolean_value_cannot_evaluate { - args: (operation: impl Display), - msg: format!("no implementation found for `{}`", operation), - help: None, - } - - /// For when there is an invalid boolean value. - @formatted - boolean_value_invalid_boolean { - args: (actual: impl Display), - msg: format!("expected boolean input type, found `{}`", actual), - help: None, - } - - /// For when an a boolean value was expected but none was found. - @formatted - boolean_value_missing_boolean { - args: (expected: impl Display), - msg: format!("expected boolean input `{}` not found", expected), - help: None, - } - - /// For when there is an invalid char value. - @formatted - char_value_invalid_char { - args: (actual: impl Display), - msg: format!("expected char element input type, found `{}`", actual), - help: None, - } - - /// For when negating a field value fails due to a SnarkVM synthesis error. - @formatted - field_value_negate_operation { - args: (error: impl ErrorArg), - msg: format!("field negation failed due to synthesis error `{}`", error), - help: None, - } - - /// For when an a field operation cannot be enforced due to a SnarkVM synthesis error. - @formatted - field_value_binary_operation { - args: (operation: impl Display, error: impl ErrorArg), - msg: format!( - "the field binary operation `{}` failed due to synthesis error `{}`", - operation, error, - ), - help: None, - } - - /// For when there is an invalid field value. - @formatted - field_value_invalid_field { - args: (actual: impl Display), - msg: format!("expected field element input type, found `{}`", actual), - help: None, - } - - /// For when an a field value was expected but none was found. - @formatted - field_value_missing_field { - args: (expected: impl Display), - msg: format!("expected field input `{}` not found", expected), - help: None, - } - - /// For when negating a group value fails due to a SnarkVM synthesis error. - @formatted - group_value_negate_operation { - args: (error: impl ErrorArg), - msg: format!("group negation failed due to the synthesis error `{}`", error), - help: None, - } - - /// For when an a group operation cannot be enforced due to a SnarkVM synthesis error. - @formatted - group_value_binary_operation { - args: (operation: impl Display, error: impl ErrorArg), - msg: format!( - "the group binary operation `{}` failed due to the synthesis error `{}`", - operation, error, - ), - help: None, - } - - /// For when there is an invalid group value. - @formatted - group_value_invalid_group { - args: (actual: impl Display), - msg: format!("expected group affine point input type, found `{}`", actual), - help: None, - } - - /// For when an a group value was expected but none was found. - @formatted - group_value_missing_group { - args: (expected: impl Display), - msg: format!("expected group input `{}` not found", expected), - help: None, - } - - /// For when the synthesis of a group failed due to a SnarkVM synthesis error. - @formatted - group_value_synthesis_error { - args: (error: impl ErrorArg), - msg: format!("compilation failed due to group synthesis error `{}`", error), - help: None, - } - - /// For when the x coordinate of a group is invalid. - @formatted - group_value_x_invalid { - args: (x: impl Display), - msg: format!("invalid x coordinate `{}`", x), - help: None, - } - - /// For when the y coordinate of a group is invalid. - @formatted - group_value_y_invalid { - args: (y: impl Display), - msg: format!("invalid y coordinate `{}`", y), - help: None, - } - - /// For when the current group value is not on the current supported curve. - @formatted - group_value_not_on_curve { - args: (element: impl Display), - msg: format!("group element `{}` is not on the supported curve", element), - help: None, - } - - /// For when the x coordinate of a group could not be recovered. - @formatted - group_value_x_recover { - args: (), - msg: "could not recover group element from x coordinate", - help: None, - } - - /// For when the y coordinate of a group could not be recovered. - @formatted - group_value_y_recover { - args: (), - msg: "could not recover group element from y coordinate", - help: None, - } - - /// For when a group generator cannot be multiplied by some number. - @formatted - group_value_n_group { - args: (number: impl Display), - msg: format!("cannot multiply group generator by \"{}\"", number), - help: None, - } - - /// For when an a signed integer operation cannot be enforced due to a SnarkVM synthesis error. - @formatted - integer_value_signed { - args: (error: impl ErrorArg), - msg: format!("integer operation failed due to the signed integer error `{}`", error), - help: None, - } - - /// For when an a unsigned integer operation cannot be enforced due to a SnarkVM synthesis error. - @formatted - integer_value_unsigned { - args: (error: impl ErrorArg), - msg: format!( - "integer operation failed due to the unsigned integer error `{}`", - error - ), - help: None, - } - - /// For when an a integer operation cannot be enforced due to a SnarkVM synthesis error. - @formatted - integer_value_synthesis { - args: (error: impl ErrorArg), - msg: format!("integer operation failed due to the synthesis error `{}`", error), - help: None, - } - - /// For when negating a integer value fails due to a SnarkVM synthesis error. - @formatted - integer_value_negate_operation { - args: (), - msg: "integer negation can only be enforced on signed integers", - help: None, - } - - /// For when an a binary integer operation cannot be enforced due to a SnarkVM synthesis error. - @formatted - integer_value_binary_operation { - args: (operation: impl Display), - msg: format!( - "the integer binary operation `{}` can only be enforced on integers of the same type", - operation - ), - help: None, - } - /// For when there is an integer type mismatch, one kind was expected but another was received. @formatted integer_value_integer_type_mismatch { @@ -811,43 +289,35 @@ create_errors!( help: None, } - /// For when there is an invalid integer value. - @formatted - integer_value_invalid_integer { - args: (actual: impl Display), - msg: format!("failed to parse `{}` as expected integer type", actual), - help: None, - } - - /// For when an a integer value was expected but none was found. - @formatted - integer_value_missing_integer { - args: (expected: impl Display), - msg: format!("expected integer input `{}` not found", expected), - help: None, - } - - /// For when an a integer operation has no implementation. - @formatted - integer_value_cannot_evaluate { - args: (operation: impl Display), - msg: format!("no implementation found for `{}`", operation), - help: None, - } - /// For when .len() method is used on non-array values/variables. @formatted lengthof_can_only_be_used_on_arrays { args: (), - msg: "len() can only be called on an array value".to_string(), + msg: "len() can only be called on an array value", help: None, } - /// For when equality operator is used on arrays with different sizes. + /// For when a circuit static const access was execpted. @formatted - array_sizes_must_match_in_eq { - args: (lhs: impl Display, rhs: impl Display), - msg: format!("array sizes must match for comparison; left: {}, right: {}", lhs, rhs), + expected_circuit_static_const_access { + args: (), + msg: "A circuit static const access was expected", + help: None, + } + + /// For when a user tries to assign to a circuit static member. + @formatted + illegal_static_member_assignment { + args: (member: impl Display), + msg: format!("Tried to assign to static member `{}`", member), + help: None, + } + + /// For when arrays with unspecified size are used in main. + @formatted + input_array_size_must_be_specified { + args: (), + msg: "arrays in main function input must have known size", help: None, } ); diff --git a/errors/src/compiler/mod.rs b/errors/src/compiler/mod.rs index 826e7c3274..f44f0a30e6 100644 --- a/errors/src/compiler/mod.rs +++ b/errors/src/compiler/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify diff --git a/errors/src/emitter/mod.rs b/errors/src/emitter/mod.rs new file mode 100644 index 0000000000..273259465d --- /dev/null +++ b/errors/src/emitter/mod.rs @@ -0,0 +1,225 @@ +// Copyright (C) 2019-2022 Aleo Systems Inc. +// This file is part of the Leo library. + +// The Leo library is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// The Leo library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with the Leo library. If not, see . + +use super::LeoError; +use core::default::Default; +use core::fmt; +use std::cell::RefCell; +use std::rc::Rc; + +/// Types that are sinks for compiler errors. +pub trait Emitter { + /// Emit the error `err`. + fn emit_err(&mut self, err: LeoError); +} + +/// A trivial `Emitter` using the standard error. +pub struct StderrEmitter; + +impl Emitter for StderrEmitter { + fn emit_err(&mut self, err: LeoError) { + eprintln!("{}", err); + } +} + +/// A buffer of `T`s. +#[derive(Debug)] +pub struct Buffer(Vec); + +impl Default for Buffer { + fn default() -> Self { + Self(Vec::new()) + } +} + +impl Buffer { + /// Push `x` to the buffer. + pub fn push(&mut self, x: T) { + self.0.push(x); + } + + /// Extract the underlying list of Ts. + pub fn into_inner(self) -> Vec { + self.0 + } +} + +impl fmt::Display for Buffer { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut iter = self.0.iter(); + if let Some(x) = iter.next() { + x.fmt(f)?; + } + for x in iter { + f.write_fmt(format_args!("\n{}", x))?; + } + Ok(()) + } +} + +/// A buffer of `LeoError`s. +pub type ErrBuffer = Buffer; + +/// An `Emitter` that collects into a list. +#[derive(Default, Clone)] +pub struct BufferEmitter(Rc>); + +impl BufferEmitter { + /// Returns a new buffered emitter. + pub fn new() -> Self { + BufferEmitter(<_>::default()) + } + + /// Extracts all the errors collected in this emitter. + pub fn extract(&self) -> ErrBuffer { + self.0.take() + } +} + +impl Emitter for BufferEmitter { + fn emit_err(&mut self, err: LeoError) { + self.0.borrow_mut().push(err); + } +} + +/// Contains the actual data for `Handler`. +/// Modelled this way to afford an API using interior mutability. +struct HandlerInner { + /// Number of errors emitted thus far. + count: usize, + /// The sink through which errors will be emitted. + emitter: Box, +} + +impl HandlerInner { + /// Emit the error `err`. + fn emit_err(&mut self, err: LeoError) { + self.count = self.count.saturating_add(1); + self.emitter.emit_err(err); + } +} + +/// A handler deals with errors and other compiler output. +pub struct Handler { + /// The inner handler. + /// `RefCell` is used here to avoid `&mut` all over the compiler. + inner: RefCell, +} + +impl Default for Handler { + fn default() -> Self { + Self::new(Box::new(StderrEmitter)) + } +} + +impl Handler { + /// Construct a `Handler` using the given `emitter`. + pub fn new(emitter: Box) -> Self { + let inner = RefCell::new(HandlerInner { count: 0, emitter }); + Self { inner } + } + + /// Construct a `Handler` that will append to `buf`. + pub fn new_with_buf() -> (Self, BufferEmitter) { + let buf = BufferEmitter::default(); + let handler = Self::new(Box::new(buf.clone())); + (handler, buf) + } + + /// Runs `logic` provided a handler that collects all errors into the `String`, + /// or if there were none, returns some `T`. + pub fn with(logic: impl for<'a> FnOnce(&'a Handler) -> Result) -> Result { + let (handler, buf) = Handler::new_with_buf(); + handler.extend_if_error(logic(&handler)).map_err(|_| buf.extract()) + } + + /// Emit the error `err`. + pub fn emit_err(&self, err: LeoError) { + self.inner.borrow_mut().emit_err(err); + } + + /// Emits the error `err`. + /// This will immediately abort compilation. + pub fn fatal_err(&self, err: LeoError) -> ! { + let code = err.exit_code(); + self.emit_err(err); + std::process::exit(code); + } + + /// The number of errors thus far. + pub fn err_count(&self) -> usize { + self.inner.borrow().count + } + + /// Did we have any errors thus far? + pub fn had_errors(&self) -> bool { + self.err_count() > 0 + } + + /// Extend handler with `error` given `res = Err(error)`. + #[allow(clippy::result_unit_err)] + pub fn extend_if_error(&self, res: Result) -> Result { + match res { + Ok(_) if self.had_errors() => Err(()), + Ok(x) => Ok(x), + Err(e) => { + self.emit_err(e); + Err(()) + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::ParserError; + use leo_span::Span; + + #[test] + fn fresh_no_errors() { + let handler = Handler::new(Box::new(BufferEmitter::new())); + assert_eq!(handler.err_count(), 0); + assert!(!handler.had_errors()); + } + + #[test] + fn buffer_works() { + let count_err = |s: String| s.lines().filter(|l| l.contains("Error")).count(); + + let res: Result<(), _> = Handler::with(|h| { + let s = Span::default(); + assert_eq!(h.err_count(), 0); + h.emit_err(ParserError::invalid_import_list(&s).into()); + assert_eq!(h.err_count(), 1); + h.emit_err(ParserError::unexpected_eof(&s).into()); + assert_eq!(h.err_count(), 2); + Err(ParserError::spread_in_array_init(&s).into()) + }); + + assert_eq!(count_err(res.unwrap_err().to_string()), 3); + + let res: Result<(), _> = Handler::with(|h| { + let s = Span::default(); + h.emit_err(ParserError::invalid_import_list(&s).into()); + h.emit_err(ParserError::unexpected_eof(&s).into()); + Ok(()) + }); + assert_eq!(count_err(res.unwrap_err().to_string()), 2); + + let () = Handler::with(|_| Ok(())).unwrap(); + } +} diff --git a/errors/src/import/import_errors.rs b/errors/src/import/import_errors.rs index 04e127b048..9ec7b92bcf 100644 --- a/errors/src/import/import_errors.rs +++ b/errors/src/import/import_errors.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify @@ -113,4 +113,12 @@ create_errors!( msg: format!("failed to read the stdlib import file `{}`", import), help: None, } + + /// For when directory name matches file name in the same source folder. + @formatted + conflicting_local_imports { + args: (names: impl Debug), + msg: format!("unable to select import location, conflicting paths are found: `{:?}`", names), + help: None, + } ); diff --git a/errors/src/import/mod.rs b/errors/src/import/mod.rs index 2bb4c05771..66b1280ed5 100644 --- a/errors/src/import/mod.rs +++ b/errors/src/import/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify diff --git a/errors/src/lib.rs b/errors/src/lib.rs index be8dea5aaa..73ecd4d342 100644 --- a/errors/src/lib.rs +++ b/errors/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify @@ -17,6 +17,9 @@ #![deny(clippy::all, clippy::missing_docs_in_private_items)] #![doc = include_str!("../README.md")] +/// Contains traits and types for channels through which errors go. +pub mod emitter; + /// Contains the ASG error definitions. pub mod asg; pub use self::asg::*; @@ -127,7 +130,7 @@ impl LeoError { } } - /// Implment exit code for each type of Error, even the ones that don't have one. + /// Implement exit code for each type of Error, even the ones that don't have one. pub fn exit_code(&self) -> i32 { use LeoError::*; diff --git a/errors/src/package/mod.rs b/errors/src/package/mod.rs index 451e2d99f9..9ff94d8f2b 100644 --- a/errors/src/package/mod.rs +++ b/errors/src/package/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify diff --git a/errors/src/package/package_errors.rs b/errors/src/package/package_errors.rs index b51bb00f58..945c2da8b7 100644 --- a/errors/src/package/package_errors.rs +++ b/errors/src/package/package_errors.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify @@ -27,14 +27,6 @@ create_errors!( exit_code_mask: 5000i32, error_code_prefix: "PAK", - /// For when creating the imports directory failed. - @backtraced - failed_to_create_imports_directory { - args: (error: impl ErrorArg), - msg: format!("failed creating imports directory {}", error), - help: None, - } - /// For when the specified import does not exist. @backtraced import_does_not_exist { @@ -49,14 +41,6 @@ create_errors!( args: (error: impl ErrorArg), msg: format!("failed removing imports directory {}", error), help: None, - } - - /// For when creating the inputs directory failed. - @backtraced - failed_to_create_inputs_directory { - args: (error: impl ErrorArg), - msg: format!("failed creating inputs directory {}", error), - help: None, } /// For when getting a input file entry failed. @@ -107,117 +91,6 @@ create_errors!( help: None, } - /// For when the input file has an IO error. - @backtraced - io_error_input_file { - args: (error: impl ErrorArg), - msg: format!("IO error input file from the provided file path - {}", error), - help: None, - } - - /// For when reading the state file failed. - @backtraced - failed_to_read_state_file { - args: (path: impl Debug), - msg: format!("Cannot read state file from the provided file path - {:?}", path), - help: None, - } - - /// For when the state file has an IO error. - @backtraced - io_error_state_file { - args: (error: impl ErrorArg), - msg: format!("IO error state file from the provided file path - {}", error), - help: None, - } - - /// For when reading the checksum file failed. - @backtraced - failed_to_read_checksum_file { - args: (path: impl Debug), - msg: format!("Cannot read checksum file from the provided file path - {:?}", path), - help: None, - } - - /// For when removing the checksum file failed. - @backtraced - failed_to_remove_checksum_file { - args: (path: impl Debug), - msg: format!("Cannot remove checksum file from the provided file path - {:?}", path), - help: None, - } - - /// For when the checksum file has an IO error. - @backtraced - io_error_checksum_file { - args: (error: impl ErrorArg), - msg: format!("IO cannot read checksum file from the provided file path - {}", error), - help: None, - } - - /// For when reading the circuit file failed. - @backtraced - failed_to_read_circuit_file { - args: (path: impl Debug), - msg: format!("Cannot read circuit file from the provided file path - {:?}", path), - help: None, - } - - /// For when removing the circuit file failed. - @backtraced - failed_to_remove_circuit_file { - args: (path: impl Debug), - msg: format!("Cannot remove circuit file from the provided file path - {:?}", path), - help: None, - } - - /// For when the circuit file has an IO error. - @backtraced - io_error_circuit_file { - args: (error: impl ErrorArg), - msg: format!("IO error circuit file from the provided file path - {}", error), - help: None, - } - - /// For when creating the outputs directory failed. - @backtraced - failed_to_create_outputs_directory { - args: (error: impl ErrorArg), - msg: format!("failed creating outputs directory {}", error), - help: None, - } - - @backtraced - failed_to_remove_outputs_directory { - args: (error: impl ErrorArg), - msg: format!("failed removing outputs directory {}", error), - help: None, - } - - /// For when reading the proof file failed. - @backtraced - failed_to_read_proof_file { - args: (path: impl Debug), - msg: format!("Cannot read proof file from the provided file path - {:?}", path), - help: None, - } - - /// For when removing the proof file failed. - @backtraced - failed_to_remove_proof_file { - args: (path: impl Debug), - msg: format!("Cannot remove proof file from the provided file path - {:?}", path), - help: None, - } - - /// For when the proof file has an IO error. - @backtraced - io_error_proof_file { - args: (error: impl ErrorArg), - msg: format!("IO error proof file from the provided file path - {}", error), - help: None, - } - /// For when reading the proving key failed. @backtraced failed_to_read_proving_key_file { @@ -226,38 +99,6 @@ create_errors!( help: None, } - /// For when removing the proving key file failed. - @backtraced - failed_to_remove_proving_key_file { - args: (path: impl Debug), - msg: format!("Cannot remove proving key file from the provided file path - {:?}", path), - help: None, - } - - /// For when the proving key file has an IO error. - @backtraced - io_error_proving_key_file { - args: (error: impl ErrorArg), - msg: format!("IO error proving key file from the provided file path - {}", error), - help: None, - } - - /// For when reading the snapshot file failed. - @backtraced - failed_to_read_snapshot_file { - args: (path: impl Debug), - msg: format!("Cannot read snapshot file from the provided file path - {:?}", path), - help: None, - } - - /// For when removing the snapshot file failed. - @backtraced - failed_to_remove_snapshot_file { - args: (path: impl Debug), - msg: format!("Cannot remove snapshot file from the provided file path - {:?}", path), - help: None, - } - /// For when reading the verification key file failed. @backtraced failed_to_read_verification_key_file { @@ -266,54 +107,6 @@ create_errors!( help: None, } - /// For when removing the verification key file failed. - @backtraced - failed_to_remove_verification_key_file { - args: (path: impl Debug), - msg: format!("Cannot remove verification key file from the provided file path - {:?}", path), - help: None, - } - - /// For when the verification key file has an IO error. - @backtraced - io_error_verification_key_file { - args: (error: impl ErrorArg), - msg: format!("IO error verification key file from the provided file path - {}", error), - help: None, - } - - /// For when the gitignore file has an IO error. - @backtraced - io_error_gitignore_file { - args: (error: impl ErrorArg), - msg: format!("IO error gitignore file from the provided file path - {}", error), - help: None, - } - - /// For when creating the manifest file failed. - @backtraced - failed_to_create_manifest_file { - args: (filename: impl Display, error: impl ErrorArg), - msg: format!("failed creating manifest file `{}` {}", filename, error), - help: None, - } - - /// For when getting the manifest file metadata failed. - @backtraced - failed_to_get_manifest_metadata_file { - args: (filename: impl Display, error: impl ErrorArg), - msg: format!("failed getting manifest file metadata `{}` {}", filename, error), - help: None, - } - - /// For when opening the manifest file failed. - @backtraced - failed_to_open_manifest_file { - args: (filename: impl Display, error: impl ErrorArg), - msg: format!("failed openining manifest file `{}` {}", filename, error), - help: None, - } - /// For when parsing the manifest file failed. @backtraced failed_to_parse_manifest_file { @@ -330,30 +123,6 @@ create_errors!( help: None, } - /// For when writing the manifest file failed. - @backtraced - failed_to_write_manifest_file { - args: (filename: impl Display, error: impl ErrorArg), - msg: format!("failed writing manifest file `{}` {}", filename, error), - help: None, - } - - /// For when the manifest file has an IO error. - @backtraced - io_error_manifest_file { - args: (error: impl ErrorArg), - msg: format!("IO error manifest file from the provided file path - {}", error), - help: None, - } - - /// For when the readme file has an IO error. - @backtraced - io_error_readme_file { - args: (error: impl ErrorArg), - msg: format!("IO error readme file from the provided file path - {}", error), - help: None, - } - /// For when creating the zip file failed. @backtraced failed_to_create_zip_file { @@ -386,22 +155,6 @@ create_errors!( help: None, } - /// For when removing the zip file failed. - @backtraced - failed_to_remove_zip_file { - args: (path: impl Debug), - msg: format!("failed removing zip file from the provided file path - {:?}", path), - help: None, - } - - /// For when zipping fails. - @backtraced - failed_to_zip { - args: (error: impl ErrorArg), - msg: error, - help: None, - } - /// For when the zip file has an IO error. @backtraced io_error_zip_file { @@ -410,27 +163,11 @@ create_errors!( help: None, } - /// For when the library file has an IO error. + /// For when removing the zip file failed. @backtraced - io_error_library_file { - args: (error: impl ErrorArg), - msg: format!("IO error library file from the provided file path - {}", error), - help: None, - } - - /// For when the main file has an IO error. - @backtraced - io_error_main_file { - args: (error: impl ErrorArg), - msg: format!("IO error main file from the provided file path - {}", error), - help: None, - } - - /// For when creating the source directory failed. - @backtraced - failed_to_create_source_directory { - args: (error: impl ErrorArg), - msg: format!("failed creating source directory {}", error), + failed_to_remove_zip_file { + args: (path: impl Debug), + msg: format!("failed removing zip file from the provided file path - {:?}", path), help: None, } @@ -474,14 +211,6 @@ create_errors!( help: None, } - /// For when reading the source directory failed. - @backtraced - failed_to_read_source_directory { - args: (error: impl ErrorArg), - msg: format!("failed reading source directory {}", error), - help: None, - } - /// For when the package failed to initalize. @backtraced failed_to_initialize_package { @@ -545,18 +274,50 @@ create_errors!( help: None, } - /// For when the lock file has an IO error. - @backtraced - io_error_lock_file { - args: (error: impl ErrorArg), - msg: format!("IO error lock file from the provided file path - {}", error), - help: None, - } - @backtraced failed_to_serialize_lock_file { args: (error: impl ErrorArg), msg: format!("serialization failed: {}", error), help: None, } + + /// For when creating a directory failed. + @backtraced + failed_to_create_directory { + args: (dirname: impl Display, error: impl ErrorArg), + msg: format!("failed to create directory: {}, error: {}", dirname, error), + help: None, + } + + /// For when removing a directory failed. + @backtraced + failed_to_remove_directory { + args: (dirname: impl Display, error: impl ErrorArg), + msg: format!("failed to remove directory: {}, error: {}", dirname, error), + help: None, + } + + /// For when file could not be read. + @backtraced + failed_to_read_file { + args: (path: impl Display, error: impl ErrorArg), + msg: format!("failed to read file: {}, error: {}", path, error), + help: None, + } + + /// For when file failed to remove. + @backtraced + failed_to_remove_file { + args: (path: impl Display, error: impl ErrorArg), + msg: format!("failed to remove file: {}, error: {}", path, error), + help: None, + } + + /// For when I/O operation failed. + @backtraced + io_error { + args: (file: impl Display, error: impl ErrorArg), + msg: format!("i/o operation failed, file: {}, error: {}", file, error), + help: None, + } ); diff --git a/errors/src/parser/mod.rs b/errors/src/parser/mod.rs index 92b31e4718..688ee956ad 100644 --- a/errors/src/parser/mod.rs +++ b/errors/src/parser/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify diff --git a/errors/src/parser/parser_errors.rs b/errors/src/parser/parser_errors.rs index 5a4a4db54d..17757a94ba 100644 --- a/errors/src/parser/parser_errors.rs +++ b/errors/src/parser/parser_errors.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify @@ -183,4 +183,44 @@ create_errors!( msg: "unable to parse array dimensions", help: None, } + + /// For when the parser encountered a deprecated `mut self` parameter in a member function declaration. + @formatted + mut_self_parameter { + args: (), + msg: "`mut self` is no longer accepted. Use `&self` if you would like to pass in a mutable reference to `self`", + help: None, + } + + /// When a member const comes after a member variable. + @formatted + member_const_after_var { + args: (), + msg: "Member variables must come after member consts.", + help: None, + } + + /// When a member const comes after a member function. + @formatted + member_const_after_fun { + args: (), + msg: "Member functions must come after member consts.", + help: None, + } + + /// When a member variable comes after a member function. + @formatted + member_var_after_fun { + args: (), + msg: "Member functions must come after member variables.", + help: None, + } + + /// E.g., on `[u8; ()]`. + @formatted + array_tuple_dimensions_empty { + args: (), + msg: "Array dimensions specified as a tuple cannot be empty.", + help: None, + } ); diff --git a/errors/src/snarkvm/mod.rs b/errors/src/snarkvm/mod.rs index deea455023..e95e624bf9 100644 --- a/errors/src/snarkvm/mod.rs +++ b/errors/src/snarkvm/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify diff --git a/errors/src/snarkvm/snarkvm_errors.rs b/errors/src/snarkvm/snarkvm_errors.rs index 1007223d78..ed0b7a4d06 100644 --- a/errors/src/snarkvm/snarkvm_errors.rs +++ b/errors/src/snarkvm/snarkvm_errors.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify diff --git a/errors/src/state/mod.rs b/errors/src/state/mod.rs index 70561aae86..f5690fd7b1 100644 --- a/errors/src/state/mod.rs +++ b/errors/src/state/mod.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify diff --git a/errors/src/state/state_errors.rs b/errors/src/state/state_errors.rs index 97b948b82a..3b3e9af58b 100644 --- a/errors/src/state/state_errors.rs +++ b/errors/src/state/state_errors.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Aleo Systems Inc. +// Copyright (C) 2019-2022 Aleo Systems Inc. // This file is part of the Leo library. // The Leo library is free software: you can redistribute it and/or modify