use serde::{Deserialize, Serialize};
use super::{Expression, NodeID, VariableDeclaration};
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(tag = "nodeType")]
pub enum Statement {
Block(Block),
UncheckedBlock(UncheckedBlock),
PlaceholderStatement(PlaceholderStatement),
IfStatement(IfStatement),
WhileStatement(WhileStatement),
DoWhileStatement(DoWhileStatement),
ForStatement(ForStatement),
Continue(Continue),
Break(Break),
Return(Return),
Throw(Throw),
EmitStatement(EmitStatement),
RevertStatement(RevertStatement),
VariableDeclarationStatement(VariableDeclarationStatement),
ExpressionStatement(ExpressionStatement),
TryStatement(TryStatement),
InlineAssembly(InlineAssembly),
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Block {
pub id: NodeID,
pub src: String,
#[serde(default)]
pub statements: Vec<Statement>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct UncheckedBlock {
pub id: NodeID,
pub src: String,
#[serde(default)]
pub statements: Vec<Statement>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct PlaceholderStatement {
pub id: NodeID,
pub src: String,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct IfStatement {
pub id: NodeID,
pub src: String,
pub condition: Expression,
pub true_body: Box<Statement>,
pub false_body: Option<Box<Statement>>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct WhileStatement {
pub id: NodeID,
pub src: String,
pub condition: Expression,
pub body: Box<Statement>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct DoWhileStatement {
pub id: NodeID,
pub src: String,
pub condition: Expression,
pub body: Box<Statement>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct ForStatement {
pub id: NodeID,
pub src: String,
pub initialization_expression: Option<Box<Statement>>,
pub condition: Option<Expression>,
pub loop_expression: Option<Box<Statement>>,
pub body: Box<Statement>,
#[serde(default)]
pub is_simple_counter_loop: Option<bool>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Continue {
pub id: NodeID,
pub src: String,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Break {
pub id: NodeID,
pub src: String,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Return {
pub id: NodeID,
pub src: String,
#[serde(default)]
pub expression: Option<Expression>,
pub function_return_parameters: Option<NodeID>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Throw {
pub id: NodeID,
pub src: String,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct EmitStatement {
pub id: NodeID,
pub src: String,
pub event_call: Expression,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct RevertStatement {
pub id: NodeID,
pub src: String,
pub error_call: Expression,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct VariableDeclarationStatement {
pub id: NodeID,
pub src: String,
#[serde(default)]
pub assignments: Vec<Option<NodeID>>,
#[serde(default)]
pub declarations: Vec<Option<VariableDeclaration>>,
pub initial_value: Option<Expression>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct ExpressionStatement {
pub id: NodeID,
pub src: String,
pub expression: Expression,
#[serde(default)]
pub documentation: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct TryStatement {
pub id: NodeID,
pub src: String,
pub external_call: Expression,
#[serde(default)]
pub clauses: Vec<TryCatchClause>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct TryCatchClause {
pub id: NodeID,
pub src: String,
#[serde(default)]
pub error_name: Option<String>,
#[serde(default)]
pub parameters: Option<super::ParameterList>,
pub block: Block,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct InlineAssembly {
pub id: NodeID,
pub src: String,
#[serde(rename = "AST", default)]
pub ast: Option<super::YulBlock>,
#[serde(default)]
pub external_references: Vec<super::ExternalReference>,
#[serde(default)]
pub evm_version: Option<String>,
#[serde(default)]
pub flags: Option<Vec<String>>,
}