use std::fmt;
use crate::parser::lexer::SourcePosition;
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct WithMetaData<T> {
pub node: T,
pub start: SourcePosition,
pub end: SourcePosition,
}
impl<T: fmt::Display> fmt::Display for WithMetaData<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.node)
}
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeByteStr {
Constant(WithMetaData<String>), Type(WithMetaData<String>),
}
impl fmt::Display for NodeByteStr {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let str = match self {
NodeByteStr::Constant(s) => s.node.clone(),
NodeByteStr::Type(t) => t.node.clone(),
};
write!(f, "{}", str)
}
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeTypeNameIdentifier {
ByteStringType(NodeByteStr),
EventType,
TypeOrEnumLikeIdentifier(WithMetaData<String>),
}
impl fmt::Display for NodeTypeNameIdentifier {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let str = match self {
NodeTypeNameIdentifier::ByteStringType(byte_str) => byte_str.to_string(),
NodeTypeNameIdentifier::EventType => "Event".to_string(),
NodeTypeNameIdentifier::TypeOrEnumLikeIdentifier(custom_type) => {
format!("{}", custom_type.clone())
}
};
write!(f, "{}", str)
}
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeImportedName {
RegularImport(WithMetaData<NodeTypeNameIdentifier>),
AliasedImport(
WithMetaData<NodeTypeNameIdentifier>,
WithMetaData<NodeTypeNameIdentifier>,
),
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeImportDeclarations {
pub import_list: Vec<WithMetaData<NodeImportedName>>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeMetaIdentifier {
MetaName(WithMetaData<NodeTypeNameIdentifier>),
MetaNameInNamespace(
WithMetaData<NodeTypeNameIdentifier>,
WithMetaData<NodeTypeNameIdentifier>,
),
MetaNameInHexspace(WithMetaData<String>, WithMetaData<NodeTypeNameIdentifier>),
ByteString,
}
impl fmt::Display for NodeMetaIdentifier {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let str = match self {
NodeMetaIdentifier::MetaName(name) => {
format!("{}", name)
}
NodeMetaIdentifier::MetaNameInNamespace(namespace, name) => {
format!("{}.{}", namespace, name)
}
NodeMetaIdentifier::MetaNameInHexspace(hexspace, name) => {
format!("{}.{}", hexspace, name)
}
NodeMetaIdentifier::ByteString => "ByStr".to_string(),
};
write!(f, "{}", str)
}
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeVariableIdentifier {
VariableName(WithMetaData<String>),
SpecialIdentifier(WithMetaData<String>),
VariableInNamespace(WithMetaData<NodeTypeNameIdentifier>, WithMetaData<String>),
}
impl fmt::Display for NodeVariableIdentifier {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let str = match self {
NodeVariableIdentifier::VariableName(name) => format!("{}", name),
NodeVariableIdentifier::SpecialIdentifier(id) => format!("{}", id),
NodeVariableIdentifier::VariableInNamespace(namespace, var_name) => {
format!("{}.{}", namespace, var_name)
}
};
write!(f, "{}", str)
}
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeBuiltinArguments {
pub arguments: Vec<WithMetaData<NodeVariableIdentifier>>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeTypeMapKey {
GenericMapKey(WithMetaData<NodeMetaIdentifier>),
EnclosedGenericId(WithMetaData<NodeMetaIdentifier>),
EnclosedAddressMapKeyType(WithMetaData<NodeAddressType>),
AddressMapKeyType(WithMetaData<NodeAddressType>),
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeTypeMapValue {
MapValueTypeOrEnumLikeIdentifier(WithMetaData<NodeMetaIdentifier>),
MapKeyValue(Box<WithMetaData<NodeTypeMapEntry>>),
MapValueParenthesizedType(Box<WithMetaData<NodeTypeMapValueAllowingTypeArguments>>),
MapValueAddressType(Box<WithMetaData<NodeAddressType>>),
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeTypeArgument {
EnclosedTypeArgument(Box<WithMetaData<NodeScillaType>>),
GenericTypeArgument(WithMetaData<NodeMetaIdentifier>),
TemplateTypeArgument(WithMetaData<String>),
AddressTypeArgument(WithMetaData<NodeAddressType>),
MapTypeArgument(WithMetaData<NodeTypeMapKey>, WithMetaData<NodeTypeMapValue>),
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeScillaType {
GenericTypeWithArgs(
WithMetaData<NodeMetaIdentifier>,
Vec<WithMetaData<NodeTypeArgument>>,
),
MapType(WithMetaData<NodeTypeMapKey>, WithMetaData<NodeTypeMapValue>),
FunctionType(
Box<WithMetaData<NodeScillaType>>,
Box<WithMetaData<NodeScillaType>>,
),
EnclosedType(Box<WithMetaData<NodeScillaType>>),
ScillaAddresseType(Box<WithMetaData<NodeAddressType>>),
PolyFunctionType(WithMetaData<String>, Box<WithMetaData<NodeScillaType>>),
TypeVarType(WithMetaData<String>),
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeTypeMapEntry {
pub key: WithMetaData<NodeTypeMapKey>,
pub value: WithMetaData<NodeTypeMapValue>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeAddressTypeField {
pub identifier: WithMetaData<NodeVariableIdentifier>,
pub type_name: WithMetaData<NodeScillaType>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeAddressType {
pub identifier: WithMetaData<NodeTypeNameIdentifier>,
pub type_name: WithMetaData<String>,
pub address_fields: Vec<WithMetaData<NodeAddressTypeField>>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeFullExpression {
LocalVariableDeclaration {
identifier_name: WithMetaData<String>,
expression: Box<WithMetaData<NodeFullExpression>>,
type_annotation: Option<WithMetaData<NodeTypeAnnotation>>,
containing_expression: Box<WithMetaData<NodeFullExpression>>,
},
FunctionDeclaration {
identier_value: WithMetaData<String>,
type_annotation: WithMetaData<NodeTypeAnnotation>,
expression: Box<WithMetaData<NodeFullExpression>>,
},
FunctionCall {
function_name: WithMetaData<NodeVariableIdentifier>,
argument_list: Vec<WithMetaData<NodeVariableIdentifier>>,
},
ExpressionAtomic(Box<WithMetaData<NodeAtomicExpression>>),
ExpressionBuiltin {
b: WithMetaData<String>,
targs: Option<WithMetaData<NodeContractTypeArguments>>,
xs: WithMetaData<NodeBuiltinArguments>,
},
Message(Vec<WithMetaData<NodeMessageEntry>>),
Match {
match_expression: WithMetaData<NodeVariableIdentifier>,
clauses: Vec<WithMetaData<NodePatternMatchExpressionClause>>,
},
ConstructorCall {
identifier_name: WithMetaData<NodeMetaIdentifier>,
contract_type_arguments: Option<WithMetaData<NodeContractTypeArguments>>,
argument_list: Vec<WithMetaData<NodeVariableIdentifier>>,
},
TemplateFunction {
identifier_name: WithMetaData<String>,
expression: Box<WithMetaData<NodeFullExpression>>,
},
TApp {
identifier_name: WithMetaData<NodeVariableIdentifier>,
type_arguments: Vec<WithMetaData<NodeTypeArgument>>,
},
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeMessageEntry {
MessageLiteral(
WithMetaData<NodeVariableIdentifier>,
WithMetaData<NodeValueLiteral>,
),
MessageVariable(
WithMetaData<NodeVariableIdentifier>,
WithMetaData<NodeVariableIdentifier>,
),
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodePatternMatchExpressionClause {
pub pattern: WithMetaData<NodePattern>,
pub expression: WithMetaData<NodeFullExpression>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeAtomicExpression {
AtomicSid(WithMetaData<NodeVariableIdentifier>),
AtomicLit(WithMetaData<NodeValueLiteral>),
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeContractTypeArguments {
pub type_arguments: Vec<WithMetaData<NodeTypeArgument>>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeValueLiteral {
LiteralInt(WithMetaData<NodeTypeNameIdentifier>, WithMetaData<String>),
LiteralHex(WithMetaData<String>),
LiteralString(WithMetaData<String>),
LiteralEmptyMap(WithMetaData<NodeTypeMapKey>, WithMetaData<NodeTypeMapValue>),
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeMapAccess {
pub identifier_name: WithMetaData<NodeVariableIdentifier>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodePattern {
Wildcard,
Binder(WithMetaData<String>),
Constructor(
WithMetaData<NodeMetaIdentifier>,
Vec<WithMetaData<NodeArgumentPattern>>,
),
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeArgumentPattern {
WildcardArgument,
BinderArgument(WithMetaData<String>),
ConstructorArgument(WithMetaData<NodeMetaIdentifier>),
PatternArgument(Box<WithMetaData<NodePattern>>),
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodePatternMatchClause {
pub pattern_expression: Box<WithMetaData<NodePattern>>,
pub statement_block: Option<WithMetaData<NodeStatementBlock>>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeBlockchainFetchArguments {
pub arguments: Vec<WithMetaData<NodeVariableIdentifier>>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeStatement {
Load {
left_hand_side: WithMetaData<String>,
right_hand_side: WithMetaData<NodeVariableIdentifier>,
},
RemoteFetch(Box<NodeRemoteFetchStatement>),
Store {
left_hand_side: WithMetaData<String>,
right_hand_side: WithMetaData<NodeVariableIdentifier>,
},
Bind {
left_hand_side: WithMetaData<String>,
right_hand_side: Box<WithMetaData<NodeFullExpression>>,
},
ReadFromBC {
left_hand_side: WithMetaData<String>,
type_name: WithMetaData<NodeTypeNameIdentifier>,
arguments: Option<NodeBlockchainFetchArguments>,
},
MapGet {
left_hand_side: WithMetaData<String>,
keys: Vec<WithMetaData<NodeMapAccess>>,
right_hand_side: WithMetaData<String>,
},
MapGetExists {
left_hand_side: WithMetaData<String>,
keys: Vec<WithMetaData<NodeMapAccess>>,
right_hand_side: WithMetaData<String>,
},
MapUpdate {
left_hand_side: WithMetaData<String>,
keys: Vec<WithMetaData<NodeMapAccess>>,
right_hand_side: WithMetaData<NodeVariableIdentifier>,
},
MapUpdateDelete {
left_hand_side: WithMetaData<String>,
keys: Vec<WithMetaData<NodeMapAccess>>,
},
Accept,
Send {
identifier_name: WithMetaData<NodeVariableIdentifier>,
},
CreateEvnt {
identifier_name: WithMetaData<NodeVariableIdentifier>,
},
Throw {
error_variable: Option<WithMetaData<NodeVariableIdentifier>>,
},
MatchStmt {
variable: WithMetaData<NodeVariableIdentifier>,
clauses: Vec<WithMetaData<NodePatternMatchClause>>,
},
CallProc {
component_id: WithMetaData<NodeComponentId>,
arguments: Vec<WithMetaData<NodeVariableIdentifier>>,
},
Iterate {
identifier_name: WithMetaData<NodeVariableIdentifier>,
component_id: WithMetaData<NodeComponentId>,
},
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeRemoteFetchStatement {
ReadStateMutable(
WithMetaData<String>,
WithMetaData<String>,
WithMetaData<NodeVariableIdentifier>,
),
ReadStateMutableSpecialId(
WithMetaData<String>,
WithMetaData<String>,
WithMetaData<String>,
),
ReadStateMutableMapAccess(
WithMetaData<String>,
WithMetaData<String>,
WithMetaData<String>,
Vec<WithMetaData<NodeMapAccess>>,
),
ReadStateMutableMapAccessExists(
WithMetaData<String>,
WithMetaData<String>,
WithMetaData<String>,
Vec<WithMetaData<NodeMapAccess>>,
),
ReadStateMutableCastAddress(
WithMetaData<String>,
WithMetaData<NodeVariableIdentifier>,
WithMetaData<NodeAddressType>,
),
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeComponentId {
WithTypeLikeName(WithMetaData<NodeTypeNameIdentifier>),
WithRegularId(WithMetaData<String>),
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeComponentParameters {
pub parameters: Vec<WithMetaData<NodeParameterPair>>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeParameterPair {
pub identifier_with_type: WithMetaData<NodeTypedIdentifier>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeComponentBody {
pub statement_block: Option<WithMetaData<NodeStatementBlock>>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeStatementBlock {
pub statements: Vec<NodeStatement>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeTypedIdentifier {
pub identifier_name: WithMetaData<String>,
pub annotation: WithMetaData<NodeTypeAnnotation>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeTypeAnnotation {
pub type_name: WithMetaData<NodeScillaType>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeProgram {
pub version: WithMetaData<String>,
pub import_declarations: Option<WithMetaData<NodeImportDeclarations>>,
pub library_definition: Option<WithMetaData<NodeLibraryDefinition>>,
pub contract_definition: WithMetaData<NodeContractDefinition>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeLibraryDefinition {
pub name: WithMetaData<NodeTypeNameIdentifier>,
pub definitions: Vec<WithMetaData<NodeLibrarySingleDefinition>>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeLibrarySingleDefinition {
LetDefinition {
variable_name: WithMetaData<String>,
type_annotation: Option<WithMetaData<NodeTypeAnnotation>>,
expression: WithMetaData<NodeFullExpression>,
},
TypeDefinition(
WithMetaData<NodeTypeNameIdentifier>,
Option<Vec<WithMetaData<NodeTypeAlternativeClause>>>,
),
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeContractDefinition {
pub contract_name: WithMetaData<NodeTypeNameIdentifier>,
pub parameters: WithMetaData<NodeComponentParameters>,
pub constraint: Option<WithMetaData<NodeWithConstraint>>,
pub fields: Vec<WithMetaData<NodeContractField>>,
pub components: Vec<WithMetaData<NodeComponentDefinition>>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeContractField {
pub typed_identifier: WithMetaData<NodeTypedIdentifier>,
pub right_hand_side: WithMetaData<NodeFullExpression>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeWithConstraint {
pub expression: Box<WithMetaData<NodeFullExpression>>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeComponentDefinition {
TransitionComponent(Box<WithMetaData<NodeTransitionDefinition>>),
ProcedureComponent(Box<WithMetaData<NodeProcedureDefinition>>),
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeProcedureDefinition {
pub name: WithMetaData<NodeComponentId>,
pub parameters: WithMetaData<NodeComponentParameters>,
pub body: WithMetaData<NodeComponentBody>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub struct NodeTransitionDefinition {
pub name: WithMetaData<NodeComponentId>,
pub parameters: WithMetaData<NodeComponentParameters>,
pub body: WithMetaData<NodeComponentBody>,
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeTypeAlternativeClause {
ClauseType(WithMetaData<NodeTypeNameIdentifier>),
ClauseTypeWithArgs(
WithMetaData<NodeTypeNameIdentifier>,
Vec<WithMetaData<NodeTypeArgument>>,
),
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeTypeMapValueArguments {
EnclosedTypeMapValue(Box<WithMetaData<NodeTypeMapValueAllowingTypeArguments>>),
GenericMapValueArgument(WithMetaData<NodeMetaIdentifier>),
MapKeyValueType(WithMetaData<NodeTypeMapKey>, WithMetaData<NodeTypeMapValue>),
}
#[derive(Clone, Debug, PartialEq, PartialOrd, Eq)]
pub enum NodeTypeMapValueAllowingTypeArguments {
TypeMapValueNoArgs(WithMetaData<NodeTypeMapValue>),
TypeMapValueWithArgs(
WithMetaData<NodeMetaIdentifier>,
Vec<WithMetaData<NodeTypeMapValueArguments>>,
),
}