diff --git a/compiler/ast/src/passes/consumer.rs b/compiler/ast/src/passes/consumer.rs
index 2ebcf04667..6b0b751991 100644
--- a/compiler/ast/src/passes/consumer.rs
+++ b/compiler/ast/src/passes/consumer.rs
@@ -75,10 +75,8 @@ pub trait StatementConsumer {
Statement::Block(stmt) => self.consume_block(stmt),
Statement::Conditional(stmt) => self.consume_conditional(stmt),
Statement::Console(stmt) => self.consume_console(stmt),
- Statement::Decrement(stmt) => self.consume_decrement(stmt),
Statement::Definition(stmt) => self.consume_definition(stmt),
Statement::Expression(stmt) => self.consume_expression_statement(stmt),
- Statement::Increment(stmt) => self.consume_increment(stmt),
Statement::Iteration(stmt) => self.consume_iteration(*stmt),
Statement::Return(stmt) => self.consume_return(stmt),
}
@@ -94,14 +92,10 @@ pub trait StatementConsumer {
fn consume_console(&mut self, input: ConsoleStatement) -> Self::Output;
- fn consume_decrement(&mut self, input: DecrementStatement) -> Self::Output;
-
fn consume_definition(&mut self, input: DefinitionStatement) -> Self::Output;
fn consume_expression_statement(&mut self, input: ExpressionStatement) -> Self::Output;
- fn consume_increment(&mut self, input: IncrementStatement) -> Self::Output;
-
fn consume_iteration(&mut self, input: IterationStatement) -> Self::Output;
fn consume_return(&mut self, input: ReturnStatement) -> Self::Output;
diff --git a/compiler/ast/src/passes/reconstructor.rs b/compiler/ast/src/passes/reconstructor.rs
index dc7ab8e8c8..0c71728bf6 100644
--- a/compiler/ast/src/passes/reconstructor.rs
+++ b/compiler/ast/src/passes/reconstructor.rs
@@ -157,10 +157,8 @@ pub trait StatementReconstructor: ExpressionReconstructor {
}
Statement::Conditional(stmt) => self.reconstruct_conditional(stmt),
Statement::Console(stmt) => self.reconstruct_console(stmt),
- Statement::Decrement(stmt) => self.reconstruct_decrement(stmt),
Statement::Definition(stmt) => self.reconstruct_definition(stmt),
Statement::Expression(stmt) => self.reconstruct_expression_statement(stmt),
- Statement::Increment(stmt) => self.reconstruct_increment(stmt),
Statement::Iteration(stmt) => self.reconstruct_iteration(*stmt),
Statement::Return(stmt) => self.reconstruct_return(stmt),
}
@@ -239,19 +237,6 @@ pub trait StatementReconstructor: ExpressionReconstructor {
)
}
- // TODO: Reconstructor should visit this.
- fn reconstruct_decrement(&mut self, input: DecrementStatement) -> (Statement, Self::AdditionalOutput) {
- (
- Statement::Decrement(DecrementStatement {
- mapping: input.mapping,
- amount: input.amount,
- index: input.index,
- span: input.span,
- }),
- Default::default(),
- )
- }
-
fn reconstruct_definition(&mut self, input: DefinitionStatement) -> (Statement, Self::AdditionalOutput) {
(
Statement::Definition(DefinitionStatement {
@@ -275,19 +260,6 @@ pub trait StatementReconstructor: ExpressionReconstructor {
)
}
- // TODO: Reconstructor should visit this.
- fn reconstruct_increment(&mut self, input: IncrementStatement) -> (Statement, Self::AdditionalOutput) {
- (
- Statement::Increment(IncrementStatement {
- mapping: input.mapping,
- index: input.index,
- amount: input.amount,
- span: input.span,
- }),
- Default::default(),
- )
- }
-
fn reconstruct_iteration(&mut self, input: IterationStatement) -> (Statement, Self::AdditionalOutput) {
(
Statement::Iteration(Box::new(IterationStatement {
diff --git a/compiler/ast/src/passes/visitor.rs b/compiler/ast/src/passes/visitor.rs
index aa8a2d0abf..2eec109c75 100644
--- a/compiler/ast/src/passes/visitor.rs
+++ b/compiler/ast/src/passes/visitor.rs
@@ -122,10 +122,8 @@ pub trait StatementVisitor<'a>: ExpressionVisitor<'a> {
Statement::Block(stmt) => self.visit_block(stmt),
Statement::Conditional(stmt) => self.visit_conditional(stmt),
Statement::Console(stmt) => self.visit_console(stmt),
- Statement::Decrement(stmt) => self.visit_decrement(stmt),
Statement::Definition(stmt) => self.visit_definition(stmt),
Statement::Expression(stmt) => self.visit_expression_statement(stmt),
- Statement::Increment(stmt) => self.visit_increment(stmt),
Statement::Iteration(stmt) => self.visit_iteration(stmt),
Statement::Return(stmt) => self.visit_return(stmt),
}
@@ -173,12 +171,6 @@ pub trait StatementVisitor<'a>: ExpressionVisitor<'a> {
};
}
- fn visit_decrement(&mut self, input: &'a DecrementStatement) {
- self.visit_expression(&input.amount, &Default::default());
- self.visit_expression(&input.index, &Default::default());
- self.visit_identifier(&input.mapping, &Default::default());
- }
-
fn visit_definition(&mut self, input: &'a DefinitionStatement) {
self.visit_expression(&input.value, &Default::default());
}
@@ -187,12 +179,6 @@ pub trait StatementVisitor<'a>: ExpressionVisitor<'a> {
self.visit_expression(&input.expression, &Default::default());
}
- fn visit_increment(&mut self, input: &'a IncrementStatement) {
- self.visit_expression(&input.amount, &Default::default());
- self.visit_expression(&input.index, &Default::default());
- self.visit_identifier(&input.mapping, &Default::default());
- }
-
fn visit_iteration(&mut self, input: &'a IterationStatement) {
self.visit_expression(&input.start, &Default::default());
self.visit_expression(&input.stop, &Default::default());
diff --git a/compiler/ast/src/statement/decrement.rs b/compiler/ast/src/statement/decrement.rs
deleted file mode 100644
index efcb3a8441..0000000000
--- a/compiler/ast/src/statement/decrement.rs
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (C) 2019-2023 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::{Expression, Identifier, Node};
-
-use leo_span::Span;
-
-use core::fmt;
-use serde::{Deserialize, Serialize};
-
-/// A decrement statement `decrement(foo, bar, 1);`.
-#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, Debug)]
-pub struct DecrementStatement {
- /// The mapping to be modified.
- pub mapping: Identifier,
- /// The index of the element to be decremented.
- pub index: Expression,
- /// The amount to decrement the element by.
- pub amount: Expression,
- /// The span of `decrement(foo, bar, 1)` excluding the semicolon.
- pub span: Span,
-}
-
-impl fmt::Display for DecrementStatement {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "decrement({}, {}, {});", self.mapping, self.index, self.amount)
- }
-}
-
-crate::simple_node_impl!(DecrementStatement);
diff --git a/compiler/ast/src/statement/increment.rs b/compiler/ast/src/statement/increment.rs
deleted file mode 100644
index 00f2f27fc3..0000000000
--- a/compiler/ast/src/statement/increment.rs
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (C) 2019-2023 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::{Expression, Identifier, Node};
-
-use leo_span::Span;
-
-use core::fmt;
-use serde::{Deserialize, Serialize};
-
-/// An increment statement `increment(foo, bar, 1);`.
-#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, Debug)]
-pub struct IncrementStatement {
- /// The mapping to be modified.
- pub mapping: Identifier,
- /// The index of the element to be incremented.
- pub index: Expression,
- /// The amount to increment the element by.
- pub amount: Expression,
- /// The span of `increment(foo, bar, 1)` excluding the semicolon.
- pub span: Span,
-}
-
-impl fmt::Display for IncrementStatement {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "increment({}, {}, {});", self.mapping, self.index, self.amount)
- }
-}
-
-crate::simple_node_impl!(IncrementStatement);
diff --git a/compiler/ast/src/statement/mod.rs b/compiler/ast/src/statement/mod.rs
index 599e0b247b..972967e9c3 100644
--- a/compiler/ast/src/statement/mod.rs
+++ b/compiler/ast/src/statement/mod.rs
@@ -29,18 +29,12 @@ pub use conditional::*;
pub mod console;
pub use console::*;
-pub mod decrement;
-pub use decrement::*;
-
pub mod definition;
pub use definition::*;
pub mod expression;
pub use expression::*;
-pub mod increment;
-pub use increment::*;
-
pub mod iteration;
pub use iteration::*;
@@ -67,14 +61,10 @@ pub enum Statement {
Conditional(ConditionalStatement),
/// A console logging statement.
Console(ConsoleStatement),
- /// A decrement statement.
- Decrement(DecrementStatement),
/// A binding or set of bindings / variables to declare.
Definition(DefinitionStatement),
/// An expression statement
Expression(ExpressionStatement),
- /// An increment statement.
- Increment(IncrementStatement),
/// A `for` statement.
Iteration(Box),
/// A return statement `return expr;`.
@@ -96,10 +86,8 @@ impl fmt::Display for Statement {
Statement::Block(x) => x.fmt(f),
Statement::Conditional(x) => x.fmt(f),
Statement::Console(x) => x.fmt(f),
- Statement::Decrement(x) => x.fmt(f),
Statement::Definition(x) => x.fmt(f),
Statement::Expression(x) => x.fmt(f),
- Statement::Increment(x) => x.fmt(f),
Statement::Iteration(x) => x.fmt(f),
Statement::Return(x) => x.fmt(f),
}
@@ -115,10 +103,8 @@ impl Node for Statement {
Block(n) => n.span(),
Conditional(n) => n.span(),
Console(n) => n.span(),
- Decrement(n) => n.span(),
Definition(n) => n.span(),
Expression(n) => n.span(),
- Increment(n) => n.span(),
Iteration(n) => n.span(),
Return(n) => n.span(),
}
@@ -132,10 +118,8 @@ impl Node for Statement {
Block(n) => n.set_span(span),
Conditional(n) => n.set_span(span),
Console(n) => n.set_span(span),
- Decrement(n) => n.set_span(span),
Definition(n) => n.set_span(span),
Expression(n) => n.set_span(span),
- Increment(n) => n.set_span(span),
Iteration(n) => n.set_span(span),
Return(n) => n.set_span(span),
}
diff --git a/compiler/passes/src/code_generation/visit_statements.rs b/compiler/passes/src/code_generation/visit_statements.rs
index 0aa0a0ef4c..1d3d2f1700 100644
--- a/compiler/passes/src/code_generation/visit_statements.rs
+++ b/compiler/passes/src/code_generation/visit_statements.rs
@@ -23,11 +23,9 @@ use leo_ast::{
Block,
ConditionalStatement,
ConsoleStatement,
- DecrementStatement,
DefinitionStatement,
Expression,
ExpressionStatement,
- IncrementStatement,
IterationStatement,
Mode,
Output,
@@ -46,10 +44,8 @@ impl<'a> CodeGenerator<'a> {
Statement::Block(stmt) => self.visit_block(stmt),
Statement::Conditional(stmt) => self.visit_conditional(stmt),
Statement::Console(stmt) => self.visit_console(stmt),
- Statement::Decrement(stmt) => self.visit_decrement(stmt),
Statement::Definition(stmt) => self.visit_definition(stmt),
Statement::Expression(stmt) => self.visit_expression_statement(stmt),
- Statement::Increment(stmt) => self.visit_increment(stmt),
Statement::Iteration(stmt) => self.visit_iteration(stmt),
Statement::Return(stmt) => self.visit_return(stmt),
}
@@ -170,24 +166,6 @@ impl<'a> CodeGenerator<'a> {
self.visit_expression(&input.expression).1
}
- fn visit_increment(&mut self, input: &'a IncrementStatement) -> String {
- let (index, mut instructions) = self.visit_expression(&input.index);
- let (amount, amount_instructions) = self.visit_expression(&input.amount);
- instructions.push_str(&amount_instructions);
- instructions.push_str(&format!(" increment {}[{index}] by {amount};\n", input.mapping));
-
- instructions
- }
-
- fn visit_decrement(&mut self, input: &'a DecrementStatement) -> String {
- let (index, mut instructions) = self.visit_expression(&input.index);
- let (amount, amount_instructions) = self.visit_expression(&input.amount);
- instructions.push_str(&amount_instructions);
- instructions.push_str(&format!(" decrement {}[{index}] by {amount};\n", input.mapping));
-
- instructions
- }
-
fn visit_assign(&mut self, input: &'a AssignStatement) -> String {
match (&input.place, &input.value) {
(Expression::Identifier(identifier), _) => {
diff --git a/compiler/passes/src/dead_code_elimination/eliminate_statement.rs b/compiler/passes/src/dead_code_elimination/eliminate_statement.rs
index 29b6b2b90a..8750641984 100644
--- a/compiler/passes/src/dead_code_elimination/eliminate_statement.rs
+++ b/compiler/passes/src/dead_code_elimination/eliminate_statement.rs
@@ -23,12 +23,10 @@ use leo_ast::{
Block,
ConditionalStatement,
ConsoleStatement,
- DecrementStatement,
DefinitionStatement,
Expression,
ExpressionReconstructor,
ExpressionStatement,
- IncrementStatement,
IterationStatement,
ReturnStatement,
Statement,
@@ -125,24 +123,6 @@ impl StatementReconstructor for DeadCodeEliminator {
unreachable!("`ConsoleStatement`s should not be in the AST at this phase of compilation.")
}
- fn reconstruct_decrement(&mut self, input: DecrementStatement) -> (Statement, Self::AdditionalOutput) {
- // Set the `is_necessary` flag.
- self.is_necessary = true;
-
- // Visit the statement.
- let statement = Statement::Decrement(DecrementStatement {
- mapping: input.mapping,
- index: self.reconstruct_expression(input.index).0,
- amount: self.reconstruct_expression(input.amount).0,
- span: input.span,
- });
-
- // Unset the `is_necessary` flag.
- self.is_necessary = false;
-
- (statement, Default::default())
- }
-
/// Static single assignment replaces definition statements with assignment statements.
fn reconstruct_definition(&mut self, _: DefinitionStatement) -> (Statement, Self::AdditionalOutput) {
unreachable!("`DefinitionStatement`s should not exist in the AST at this phase of compilation.")
@@ -174,24 +154,6 @@ impl StatementReconstructor for DeadCodeEliminator {
}
}
- fn reconstruct_increment(&mut self, input: IncrementStatement) -> (Statement, Self::AdditionalOutput) {
- // Set the `is_necessary` flag.
- self.is_necessary = true;
-
- // Visit the statement.
- let statement = Statement::Increment(IncrementStatement {
- mapping: input.mapping,
- index: self.reconstruct_expression(input.index).0,
- amount: self.reconstruct_expression(input.amount).0,
- span: input.span,
- });
-
- // Unset the `is_necessary` flag.
- self.is_necessary = false;
-
- (statement, Default::default())
- }
-
/// Loop unrolling unrolls and removes iteration statements from the program.
fn reconstruct_iteration(&mut self, _: IterationStatement) -> (Statement, Self::AdditionalOutput) {
unreachable!("`IterationStatement`s should not be in the AST at this phase of compilation.");
diff --git a/compiler/passes/src/static_single_assignment/rename_statement.rs b/compiler/passes/src/static_single_assignment/rename_statement.rs
index 8742118bcd..dbe84191b2 100644
--- a/compiler/passes/src/static_single_assignment/rename_statement.rs
+++ b/compiler/passes/src/static_single_assignment/rename_statement.rs
@@ -24,13 +24,11 @@ use leo_ast::{
CallExpression,
ConditionalStatement,
ConsoleStatement,
- DecrementStatement,
DefinitionStatement,
Expression,
ExpressionConsumer,
ExpressionStatement,
Identifier,
- IncrementStatement,
IterationStatement,
ReturnStatement,
Statement,
@@ -200,25 +198,6 @@ impl StatementConsumer for StaticSingleAssigner<'_> {
unreachable!("Parsing guarantees that console statements are not present in the program.")
}
- /// Consumes the expressions associated with the `DecrementStatement`, returning the simplified `DecrementStatement`.
- fn consume_decrement(&mut self, input: DecrementStatement) -> Self::Output {
- // First consume the expression associated with the amount.
- let (amount, mut statements) = self.consume_expression(input.amount);
-
- // Then, consume the expression associated with the index.
- let (index, index_statements) = self.consume_expression(input.index);
- statements.extend(index_statements);
-
- statements.push(Statement::Decrement(DecrementStatement {
- mapping: input.mapping,
- index,
- amount,
- span: input.span,
- }));
-
- statements
- }
-
/// Consumes the `DefinitionStatement` into an `AssignStatement`, renaming the left-hand-side as appropriate.
fn consume_definition(&mut self, definition: DefinitionStatement) -> Self::Output {
// First consume the right-hand-side of the definition.
@@ -299,25 +278,6 @@ impl StatementConsumer for StaticSingleAssigner<'_> {
statements
}
- /// Consumes the expressions associated with the `IncrementStatement`, returning a simplified `IncrementStatement`.
- fn consume_increment(&mut self, input: IncrementStatement) -> Self::Output {
- // First consume the expression associated with the amount.
- let (amount, mut statements) = self.consume_expression(input.amount);
-
- // Then, consume the expression associated with the index.
- let (index, index_statements) = self.consume_expression(input.index);
- statements.extend(index_statements);
-
- statements.push(Statement::Increment(IncrementStatement {
- mapping: input.mapping,
- index,
- amount,
- span: input.span,
- }));
-
- statements
- }
-
// TODO: Error message
fn consume_iteration(&mut self, _input: IterationStatement) -> Self::Output {
unreachable!("`IterationStatement`s should not be in the AST at this phase of compilation.");
diff --git a/compiler/passes/src/type_checking/check_statements.rs b/compiler/passes/src/type_checking/check_statements.rs
index 3714182e23..0074989fb5 100644
--- a/compiler/passes/src/type_checking/check_statements.rs
+++ b/compiler/passes/src/type_checking/check_statements.rs
@@ -35,10 +35,8 @@ impl<'a> StatementVisitor<'a> for TypeChecker<'a> {
Statement::Block(stmt) => self.visit_block(stmt),
Statement::Conditional(stmt) => self.visit_conditional(stmt),
Statement::Console(stmt) => self.visit_console(stmt),
- Statement::Decrement(stmt) => self.visit_decrement(stmt),
Statement::Definition(stmt) => self.visit_definition(stmt),
Statement::Expression(stmt) => self.visit_expression_statement(stmt),
- Statement::Increment(stmt) => self.visit_increment(stmt),
Statement::Iteration(stmt) => self.visit_iteration(stmt),
Statement::Return(stmt) => self.visit_return(stmt),
}
@@ -152,35 +150,6 @@ impl<'a> StatementVisitor<'a> for TypeChecker<'a> {
unreachable!("Parsing guarantees that console statements are not present in the AST.");
}
- fn visit_decrement(&mut self, input: &'a DecrementStatement) {
- if !self.is_finalize {
- self.emit_err(TypeCheckerError::invalid_operation_outside_finalize("decrement", input.span()));
- }
-
- // Assert that the first operand is a mapping.
- let mapping_type = self.visit_identifier(&input.mapping, &None);
- self.assert_mapping_type(&mapping_type, input.span());
-
- match mapping_type {
- None => self.emit_err(TypeCheckerError::could_not_determine_type(input.mapping, input.mapping.span)),
- Some(Type::Mapping(mapping_type)) => {
- // Check that the index matches the key type of the mapping.
- let index_type = self.visit_expression(&input.index, &None);
- self.assert_type(&index_type, &mapping_type.key, input.index.span());
-
- // Check that the amount matches the value type of the mapping.
- let amount_type = self.visit_expression(&input.amount, &None);
- self.assert_type(&amount_type, &mapping_type.value, input.amount.span());
-
- // Check that the amount type is incrementable.
- self.assert_field_group_scalar_int_type(&amount_type, input.amount.span());
- }
- Some(mapping_type) => {
- self.emit_err(TypeCheckerError::expected_one_type_of("mapping", mapping_type, input.mapping.span))
- }
- }
- }
-
fn visit_definition(&mut self, input: &'a DefinitionStatement) {
let declaration =
if input.declaration_type == DeclarationType::Const { VariableType::Const } else { VariableType::Mut };
@@ -260,35 +229,6 @@ impl<'a> StatementVisitor<'a> for TypeChecker<'a> {
}
}
- fn visit_increment(&mut self, input: &'a IncrementStatement) {
- if !self.is_finalize {
- self.emit_err(TypeCheckerError::invalid_operation_outside_finalize("increment", input.span()));
- }
-
- // Assert that the first operand is a mapping.
- let mapping_type = self.visit_identifier(&input.mapping, &None);
- self.assert_mapping_type(&mapping_type, input.span());
-
- match mapping_type {
- None => self.emit_err(TypeCheckerError::could_not_determine_type(input.mapping, input.mapping.span)),
- Some(Type::Mapping(mapping_type)) => {
- // Check that the index matches the key type of the mapping.
- let index_type = self.visit_expression(&input.index, &None);
- self.assert_type(&index_type, &mapping_type.key, input.index.span());
-
- // Check that the amount matches the value type of the mapping.
- let amount_type = self.visit_expression(&input.amount, &None);
- self.assert_type(&amount_type, &mapping_type.value, input.amount.span());
-
- // Check that the amount type is incrementable.
- self.assert_field_group_scalar_int_type(&amount_type, input.amount.span());
- }
- Some(mapping_type) => {
- self.emit_err(TypeCheckerError::expected_one_type_of("mapping", mapping_type, input.mapping.span))
- }
- }
- }
-
fn visit_iteration(&mut self, input: &'a IterationStatement) {
let iter_type = &Some(input.type_.clone());
self.assert_int_type(iter_type, input.variable.span);