Struct FlatteningVisitor

Source
pub struct FlatteningVisitor<'a> {
    pub state: &'a mut CompilerState,
    pub condition_stack: Vec<Guard>,
    pub returns: Vec<(ReturnGuard, ReturnStatement)>,
    pub program: Symbol,
    pub is_async: bool,
}

Fields§

§state: &'a mut CompilerState§condition_stack: Vec<Guard>

A stack of condition Expressions visited up to the current point in the AST.

§returns: Vec<(ReturnGuard, ReturnStatement)>

A list containing tuples of guards and expressions associated ReturnStatements. A guard is an expression that evaluates to true on the execution path of the ReturnStatement. Note that returns are inserted in the order they are encountered during a pre-order traversal of the AST. Note that type checking guarantees that there is at most one return in a basic block.

§program: Symbol

The program name.

§is_async: bool

Whether the function is an async function.

Implementations§

Source§

impl FlatteningVisitor<'_>

Source

pub fn construct_early_return_guard( &mut self, ) -> Option<(Identifier, Vec<Statement>)>

Construct an early return guard.

That is, an Identifier assigned to a boolean that is true iff some early return was taken.

Source

pub fn construct_guard(&mut self) -> Option<(Identifier, Vec<Statement>)>

Construct a guard from the current state of the condition stack.

That is, a boolean expression which is true iff we’ve followed the branches that led to the current point in the Leo code.

Source

pub fn fold_guards( &mut self, prefix: &str, guards: Vec<(Option<Expression>, Expression)>, ) -> (Expression, Vec<Statement>)

Fold guards and expressions into a single expression. Note that this function assumes that at least one guard is present.

Source

pub fn unique_simple_definition( &mut self, expr: Expression, ) -> (Identifier, Statement)

A wrapper around assigner.unique_simple_definition that updates self.structs.

Source

pub fn simple_definition( &mut self, lhs: Identifier, rhs: Expression, ) -> Statement

A wrapper around assigner.simple_definition that tracks the type of the lhs.

Source

pub fn fold_returns( &mut self, block: &mut Block, returns: Vec<(Option<Expression>, ReturnStatement)>, )

Folds a list of return statements into a single return statement and adds the produced statements to the block.

Source

fn make_array_access_definition( &mut self, i: usize, identifier: Identifier, array_type: &ArrayType, ) -> (Identifier, Statement)

Source

pub fn ternary_array( &mut self, array: &ArrayType, condition: &Expression, first: &Identifier, second: &Identifier, ) -> (Expression, Vec<Statement>)

Source

fn make_struct_access_definition( &mut self, inner: Identifier, name: Identifier, type_: Type, ) -> (Identifier, Statement)

Source

pub fn ternary_struct( &mut self, struct_: &Composite, condition: &Expression, first: &Identifier, second: &Identifier, ) -> (Expression, Vec<Statement>)

Source

pub fn ternary_tuple( &mut self, tuple_type: &TupleType, condition: &Expression, first: &Expression, second: &Expression, ) -> (Expression, Vec<Statement>)

Trait Implementations§

Source§

impl AstReconstructor for FlatteningVisitor<'_>

Source§

fn reconstruct_struct_init( &mut self, input: StructExpression, ) -> (Expression, Self::AdditionalOutput)

Reconstructs a struct init expression, flattening any tuples in the expression.

Source§

fn reconstruct_ternary( &mut self, input: TernaryExpression, ) -> (Expression, Self::AdditionalOutput)

Reconstructs ternary expressions over arrays, structs, and tuples, accumulating any statements that are generated. This is necessary because Aleo instructions does not support ternary expressions over composite data types. For example, the ternary expression cond ? (a, b) : (c, d) is flattened into the following:

let var$0 = cond ? a : c;
let var$1 = cond ? b : d;
(var$0, var$1)

For structs, the ternary expression cond ? a : b, where a and b are both structs Foo { bar: u8, baz: u8 }, is flattened into the following:

let var$0 = cond ? a.bar : b.bar;
let var$1 = cond ? a.baz : b.baz;
let var$2 = Foo { bar: var$0, baz: var$1 };
var$2
Source§

fn reconstruct_assert( &mut self, input: AssertStatement, ) -> (Statement, Self::AdditionalOutput)

Rewrites an assert statement into a flattened form. Assert statements at the top level only have their arguments flattened. Assert statements inside a conditional statement are flattened to such that the check is conditional on the execution path being valid. For example, the following snippet:

if condition1 {
   if condition2 {
       assert(foo);
   }
}

is flattened to:

assert(!(condition1 && condition2) || foo);

which is equivalent to the logical formula (condition1 /\ condition2) ==> foo.

Source§

fn reconstruct_block(&mut self, block: Block) -> (Block, Self::AdditionalOutput)

Flattens the statements inside a basic block. The resulting block does not contain any conditional statements.

Source§

fn reconstruct_conditional( &mut self, conditional: ConditionalStatement, ) -> (Statement, Self::AdditionalOutput)

Flatten a conditional statement into a list of statements.

Source§

fn reconstruct_definition( &mut self, definition: DefinitionStatement, ) -> (Statement, Self::AdditionalOutput)

Flattens a definition, if necessary. Marks variables as structs as necessary. Note that new statements are only produced if the right hand side is a ternary expression over structs. Otherwise, the statement is returned as is.

Source§

fn reconstruct_return( &mut self, input: ReturnStatement, ) -> (Statement, Self::AdditionalOutput)

Transforms a return statement into an empty block statement. Stores the arguments to the return statement, which are later folded into a single return statement at the end of the function.

Source§

type AdditionalOutput = Vec<Statement>

Source§

fn reconstruct_assign( &mut self, _assign: AssignStatement, ) -> (Statement, Self::AdditionalOutput)

Source§

fn reconstruct_iteration( &mut self, _input: IterationStatement, ) -> (Statement, Self::AdditionalOutput)

Source§

fn reconstruct_type(&mut self, input: Type) -> (Type, Self::AdditionalOutput)

Source§

fn reconstruct_array_type( &mut self, input: ArrayType, ) -> (Type, Self::AdditionalOutput)

Source§

fn reconstruct_composite_type( &mut self, input: CompositeType, ) -> (Type, Self::AdditionalOutput)

Source§

fn reconstruct_future_type( &mut self, input: FutureType, ) -> (Type, Self::AdditionalOutput)

Source§

fn reconstruct_mapping_type( &mut self, input: MappingType, ) -> (Type, Self::AdditionalOutput)

Source§

fn reconstruct_tuple_type( &mut self, input: TupleType, ) -> (Type, Self::AdditionalOutput)

Source§

fn reconstruct_expression( &mut self, input: Expression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_array_access( &mut self, input: ArrayAccess, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_associated_constant( &mut self, input: AssociatedConstantExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_associated_function( &mut self, input: AssociatedFunctionExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_member_access( &mut self, input: MemberAccess, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_repeat( &mut self, input: RepeatExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_tuple_access( &mut self, input: TupleAccess, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_array( &mut self, input: ArrayExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_binary( &mut self, input: BinaryExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_call( &mut self, input: CallExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_cast( &mut self, input: CastExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_err( &mut self, _input: ErrExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_identifier( &mut self, input: Identifier, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_literal( &mut self, input: Literal, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_locator( &mut self, input: LocatorExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_tuple( &mut self, input: TupleExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_unary( &mut self, input: UnaryExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_unit( &mut self, input: UnitExpression, ) -> (Expression, Self::AdditionalOutput)

Source§

fn reconstruct_statement( &mut self, input: Statement, ) -> (Statement, Self::AdditionalOutput)

Source§

fn reconstruct_const( &mut self, input: ConstDeclaration, ) -> (Statement, Self::AdditionalOutput)

Source§

fn reconstruct_expression_statement( &mut self, input: ExpressionStatement, ) -> (Statement, Self::AdditionalOutput)

Source§

impl ProgramReconstructor for FlatteningVisitor<'_>

Source§

fn reconstruct_program_scope(&mut self, input: ProgramScope) -> ProgramScope

Flattens a program scope.

Source§

fn reconstruct_function(&mut self, function: Function) -> Function

Flattens a function’s body

Source§

fn reconstruct_program(&mut self, input: Program) -> Program

Source§

fn reconstruct_stub(&mut self, input: Stub) -> Stub

Source§

fn reconstruct_function_stub(&mut self, input: FunctionStub) -> FunctionStub

Source§

fn reconstruct_struct(&mut self, input: Composite) -> Composite

Source§

fn reconstruct_import(&mut self, input: Program) -> Program

Source§

fn reconstruct_mapping(&mut self, input: Mapping) -> Mapping

Auto Trait Implementations§

§

impl<'a> Freeze for FlatteningVisitor<'a>

§

impl<'a> !RefUnwindSafe for FlatteningVisitor<'a>

§

impl<'a> !Send for FlatteningVisitor<'a>

§

impl<'a> !Sync for FlatteningVisitor<'a>

§

impl<'a> Unpin for FlatteningVisitor<'a>

§

impl<'a> !UnwindSafe for FlatteningVisitor<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where T: 'static,