diff --git a/src/protocol/ast.rs b/src/protocol/ast.rs index 41a89918e25e80a760da57a086d19596513c87e2..61bb609a30e47f16729f36900525d3e3745007f0 100644 --- a/src/protocol/ast.rs +++ b/src/protocol/ast.rs @@ -1020,12 +1020,53 @@ pub enum ProcedureKind { /// non-polymorphic procedure). pub struct ProcedureDefinitionMonomorph { pub argument_types: Vec, - pub expr_info: Vec + pub expr_info: Vec } -pub struct MonomorphExpressionInfo { +impl ProcedureDefinitionMonomorph { + pub(crate) fn new_invalid() -> Self { + return Self{ + argument_types: Vec::new(), + expr_info: Vec::new(), + } + } +} + +pub struct ExpressionInfo { pub type_id: TypeId, - pub index: i32, // for called procedure's monomorphs, or selected field indices + pub variant: ExpressionInfoVariant, +} + +impl ExpressionInfo { + pub(crate) fn new_invalid() -> Self { + return Self{ + type_id: TypeId::new_invalid(), + variant: ExpressionInfoVariant::Generic, + } + } +} + +#[derive(Clone, Copy)] +pub enum ExpressionInfoVariant { + Generic, + Procedure(TypeId, u32), // procedure TypeID and its monomorph index + Select(i32), // index +} + +impl ExpressionInfoVariant { + pub(crate) fn as_select(&self) -> i32 { + match self { + ExpressionInfoVariant::Select(v) => *v, + _ => unreachable!(), + } + } + + pub(crate) fn as_procedure(&self) -> (TypeId, u32) { + match self { + ExpressionInfoVariant::Procedure(type_id, monomorph_index) => (*type_id, *monomorph_index), + _ => unreachable!(), + } + } } /// Generic storage for functions, primitive components and composite @@ -1048,7 +1089,7 @@ pub struct ProcedureDefinition { pub scope: ScopeId, pub body: BlockStatementId, // Monomorphization of typed procedures - pub monomorphs: Vec, + pub monomorphs: Vec, // Validation/linking pub num_expressions_in_body: i32, } @@ -1537,20 +1578,37 @@ impl Expression { } } - pub fn get_unique_id_in_definition(&self) -> i32 { + pub fn type_index(&self) -> i32 { + match self { + Expression::Assignment(expr) => expr.type_index, + Expression::Binding(expr) => expr.type_index, + Expression::Conditional(expr) => expr.type_index, + Expression::Binary(expr) => expr.type_index, + Expression::Unary(expr) => expr.type_index, + Expression::Indexing(expr) => expr.type_index, + Expression::Slicing(expr) => expr.type_index, + Expression::Select(expr) => expr.type_index, + Expression::Literal(expr) => expr.type_index, + Expression::Cast(expr) => expr.type_index, + Expression::Call(expr) => expr.type_index, + Expression::Variable(expr) => expr.type_index, + } + } + + pub fn type_index_mut(&mut self) -> &mut i32 { match self { - Expression::Assignment(expr) => expr.unique_id_in_definition, - Expression::Binding(expr) => expr.unique_id_in_definition, - Expression::Conditional(expr) => expr.unique_id_in_definition, - Expression::Binary(expr) => expr.unique_id_in_definition, - Expression::Unary(expr) => expr.unique_id_in_definition, - Expression::Indexing(expr) => expr.unique_id_in_definition, - Expression::Slicing(expr) => expr.unique_id_in_definition, - Expression::Select(expr) => expr.unique_id_in_definition, - Expression::Literal(expr) => expr.unique_id_in_definition, - Expression::Cast(expr) => expr.unique_id_in_definition, - Expression::Call(expr) => expr.unique_id_in_definition, - Expression::Variable(expr) => expr.unique_id_in_definition, + Expression::Assignment(expr) => &mut expr.type_index, + Expression::Binding(expr) => &mut expr.type_index, + Expression::Conditional(expr) => &mut expr.type_index, + Expression::Binary(expr) => &mut expr.type_index, + Expression::Unary(expr) => &mut expr.type_index, + Expression::Indexing(expr) => &mut expr.type_index, + Expression::Slicing(expr) => &mut expr.type_index, + Expression::Select(expr) => &mut expr.type_index, + Expression::Literal(expr) => &mut expr.type_index, + Expression::Cast(expr) => &mut expr.type_index, + Expression::Call(expr) => &mut expr.type_index, + Expression::Variable(expr) => &mut expr.type_index, } } } @@ -1583,7 +1641,7 @@ pub struct AssignmentExpression { // Validator/Linker pub parent: ExpressionParent, // Typing - pub expr_index: i32, + pub type_index: i32, } #[derive(Debug, Clone)] @@ -1597,7 +1655,7 @@ pub struct BindingExpression { // Validator/Linker pub parent: ExpressionParent, // Typing - pub expr_index: i32, + pub type_index: i32, } #[derive(Debug, Clone)] @@ -1612,7 +1670,7 @@ pub struct ConditionalExpression { // Validator/Linking pub parent: ExpressionParent, // Typing - pub expr_index: i32, + pub type_index: i32, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -1650,7 +1708,7 @@ pub struct BinaryExpression { // Validator/Linker pub parent: ExpressionParent, // Typing - pub expr_index: i32, + pub type_index: i32, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -1672,7 +1730,7 @@ pub struct UnaryExpression { // Validator/Linker pub parent: ExpressionParent, // Typing - pub expr_index: i32, + pub type_index: i32, } #[derive(Debug, Clone)] @@ -1686,7 +1744,7 @@ pub struct IndexingExpression { // Validator/Linker pub parent: ExpressionParent, // Typing - pub expr_index: i32, + pub type_index: i32, } #[derive(Debug, Clone)] @@ -1701,7 +1759,7 @@ pub struct SlicingExpression { // Validator/Linker pub parent: ExpressionParent, // Typing - pub expr_index: i32, + pub type_index: i32, } #[derive(Debug, Clone)] @@ -1721,7 +1779,7 @@ pub struct SelectExpression { // Validator/Linker pub parent: ExpressionParent, // Typing - pub expr_index: i32, + pub type_index: i32, } #[derive(Debug, Clone)] @@ -1735,7 +1793,7 @@ pub struct CastExpression { // Validator/linker pub parent: ExpressionParent, // Typing - pub expr_index: i32, + pub type_index: i32, } #[derive(Debug, Clone)] @@ -1751,7 +1809,7 @@ pub struct CallExpression { // Validator/Linker pub parent: ExpressionParent, // Typing - pub expr_index: i32, + pub type_index: i32, } #[derive(Debug, Clone, PartialEq, Eq)] @@ -1769,14 +1827,26 @@ pub enum Method { SelectRegisterCasePort, // SelectRegisterCasePort(case_index, port_index, port_id) SelectWait, // SelectWait() -> u32 // User-defined - UserProcedure, + UserFunction, UserComponent, } -#[derive(Debug, Clone)] -pub struct MethodSymbolic { - pub(crate) parser_type: ParserType, - pub(crate) definition: DefinitionId +impl Method { + pub(crate) fn is_public_builtin(&self) -> bool { + use Method::*; + match self { + Get | Put | Fires | Create | Length | Assert | Print => true, + _ => false, + } + } + + pub(crate) fn is_user_defined(&self) -> bool { + use Method::*; + match self { + UserFunction | UserComponent => true, + _ => false, + } + } } #[derive(Debug, Clone)] @@ -1788,7 +1858,7 @@ pub struct LiteralExpression { // Validator/Linker pub parent: ExpressionParent, // Typing - pub expr_index: i32, + pub type_index: i32, } #[derive(Debug, Clone)] @@ -1886,5 +1956,5 @@ pub struct VariableExpression { pub used_as_binding_target: bool, pub parent: ExpressionParent, // Typing - pub expr_index: i32, + pub type_index: i32, } \ No newline at end of file