pub struct ConstPropagator<'a> {
pub(crate) symbol_table: &'a mut SymbolTable,
pub(crate) type_table: &'a TypeTable,
pub(crate) node_builder: &'a NodeBuilder,
pub(crate) handler: &'a Handler,
pub(crate) program: Symbol,
pub(crate) changed: bool,
pub(crate) const_not_evaluated: Option<Span>,
pub(crate) array_index_not_evaluated: Option<Span>,
}
Expand description
A pass to perform const propagation and folding.
This pass should be used in conjunction with the Unroller so that loop bounds and consts in loop bodies can be evaluated.
Any of these expressions:
- unary operation,
- binary operation,
- core function other than cheat codes, mapping ops, or rand functions,
whose arguments are consts or literals will be subject to constant folding. The ternary conditional operator will also be folded if its condition is a constant or literal.
Fields§
§symbol_table: &'a mut SymbolTable
The symbol table associated with the program.
type_table: &'a TypeTable
A mapping between node IDs and their types.
node_builder: &'a NodeBuilder
A counter used to generate unique node IDs.
handler: &'a Handler
The error handler.
program: Symbol
The program name.
changed: bool
Have we actually modified the progam at all?
const_not_evaluated: Option<Span>
The RHS of a const declaration we were not able to evaluate.
array_index_not_evaluated: Option<Span>
An array index which was not able to be evaluated.
Implementations§
Source§impl<'a> ConstPropagator<'a>
impl<'a> ConstPropagator<'a>
pub(crate) fn new( handler: &'a Handler, symbol_table: &'a mut SymbolTable, type_table: &'a TypeTable, node_builder: &'a NodeBuilder, ) -> Self
Sourcepub(crate) fn in_scope<T>(
&mut self,
id: NodeID,
func: impl FnOnce(&mut Self) -> T,
) -> T
pub(crate) fn in_scope<T>( &mut self, id: NodeID, func: impl FnOnce(&mut Self) -> T, ) -> T
Enter the symbol table’s scope id
, execute func
, and then return to the parent scope.
Sourcepub(crate) fn emit_err(&self, err: StaticAnalyzerError)
pub(crate) fn emit_err(&self, err: StaticAnalyzerError)
Emit a StaticAnalyzerError
.
Trait Implementations§
Source§impl ExpressionReconstructor for ConstPropagator<'_>
impl ExpressionReconstructor for ConstPropagator<'_>
type AdditionalOutput = Option<Value>
fn reconstruct_expression( &mut self, input: Expression, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_struct_init( &mut self, input: StructExpression, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_ternary( &mut self, input: TernaryExpression, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_access( &mut self, input: AccessExpression, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_array_access( &mut self, input: ArrayAccess, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_associated_constant( &mut self, input: AssociatedConstant, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_associated_function( &mut self, input: AssociatedFunction, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_member_access( &mut self, input: MemberAccess, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_tuple_access( &mut self, input: TupleAccess, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_array( &mut self, input: ArrayExpression, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_binary( &mut self, input: BinaryExpression, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_call( &mut self, input: CallExpression, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_cast( &mut self, input: CastExpression, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_err( &mut self, _input: ErrExpression, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_identifier( &mut self, input: Identifier, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_literal( &mut self, input: Literal, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_locator( &mut self, input: LocatorExpression, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_tuple( &mut self, input: TupleExpression, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_unary( &mut self, input: UnaryExpression, ) -> (Expression, Self::AdditionalOutput)
fn reconstruct_unit( &mut self, input: UnitExpression, ) -> (Expression, Self::AdditionalOutput)
Source§impl<'a> Pass for ConstPropagator<'a>
impl<'a> Pass for ConstPropagator<'a>
Source§impl ProgramReconstructor for ConstPropagator<'_>
impl ProgramReconstructor for ConstPropagator<'_>
fn reconstruct_program_scope(&mut self, input: ProgramScope) -> ProgramScope
fn reconstruct_function(&mut self, function: Function) -> Function
fn reconstruct_program(&mut self, input: Program) -> Program
fn reconstruct_stub(&mut self, input: Stub) -> Stub
fn reconstruct_function_stub(&mut self, input: FunctionStub) -> FunctionStub
fn reconstruct_struct(&mut self, input: Composite) -> Composite
fn reconstruct_import(&mut self, input: Program) -> Program
fn reconstruct_mapping(&mut self, input: Mapping) -> Mapping
Source§impl StatementReconstructor for ConstPropagator<'_>
impl StatementReconstructor for ConstPropagator<'_>
fn reconstruct_assert( &mut self, input: AssertStatement, ) -> (Statement, Self::AdditionalOutput)
fn reconstruct_assign( &mut self, assign: AssignStatement, ) -> (Statement, Self::AdditionalOutput)
fn reconstruct_block(&mut self, block: Block) -> (Block, Self::AdditionalOutput)
fn reconstruct_conditional( &mut self, conditional: ConditionalStatement, ) -> (Statement, Self::AdditionalOutput)
fn reconstruct_console( &mut self, _: ConsoleStatement, ) -> (Statement, Self::AdditionalOutput)
fn reconstruct_const( &mut self, input: ConstDeclaration, ) -> (Statement, Self::AdditionalOutput)
fn reconstruct_definition( &mut self, definition: DefinitionStatement, ) -> (Statement, Self::AdditionalOutput)
fn reconstruct_expression_statement( &mut self, input: ExpressionStatement, ) -> (Statement, Self::AdditionalOutput)
fn reconstruct_iteration( &mut self, iteration: IterationStatement, ) -> (Statement, Self::AdditionalOutput)
fn reconstruct_return( &mut self, input: ReturnStatement, ) -> (Statement, Self::AdditionalOutput)
fn reconstruct_statement( &mut self, input: Statement, ) -> (Statement, Self::AdditionalOutput)
Auto Trait Implementations§
impl<'a> Freeze for ConstPropagator<'a>
impl<'a> !RefUnwindSafe for ConstPropagator<'a>
impl<'a> !Send for ConstPropagator<'a>
impl<'a> !Sync for ConstPropagator<'a>
impl<'a> Unpin for ConstPropagator<'a>
impl<'a> !UnwindSafe for ConstPropagator<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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