Add the unreachable builtin function

This commit is contained in:
2025-04-02 21:08:15 +02:00
parent a7b5e32d09
commit 50970f3289
6 changed files with 136 additions and 73 deletions

View File

@ -103,32 +103,32 @@ namespace elna::boot
{
}
std::shared_ptr<primitive_type_expression> type_expression::is_primitive()
primitive_type_expression *type_expression::is_primitive()
{
return nullptr;
}
std::shared_ptr<array_type_expression> type_expression::is_array()
array_type_expression *type_expression::is_array()
{
return nullptr;
}
std::shared_ptr<pointer_type_expression> type_expression::is_pointer()
pointer_type_expression *type_expression::is_pointer()
{
return nullptr;
}
std::shared_ptr<record_type_expression> type_expression::is_record()
record_type_expression *type_expression::is_record()
{
return nullptr;
}
std::shared_ptr<union_type_expression> type_expression::is_union()
union_type_expression *type_expression::is_union()
{
return nullptr;
}
std::shared_ptr<procedure_type_expression> type_expression::is_procedure()
procedure_type_expression *type_expression::is_procedure()
{
return nullptr;
}
@ -143,25 +143,30 @@ namespace elna::boot
visitor->visit(this);
}
std::shared_ptr<primitive_type_expression> primitive_type_expression::is_primitive()
primitive_type_expression *primitive_type_expression::is_primitive()
{
return std::static_pointer_cast<primitive_type_expression>(shared_from_this());
return this;
}
array_type_expression::array_type_expression(const struct position position,
std::shared_ptr<type_expression> base, const std::uint32_t size)
type_expression *base, const std::uint32_t size)
: type_expression(position), m_base(base), size(size)
{
}
array_type_expression::~array_type_expression()
{
delete m_base;
}
void array_type_expression::accept(parser_visitor *visitor)
{
visitor->visit(this);
}
std::shared_ptr<array_type_expression> array_type_expression::is_array()
array_type_expression *array_type_expression::is_array()
{
return std::static_pointer_cast<array_type_expression>(shared_from_this());
return this;
}
type_expression& array_type_expression::base()
@ -170,19 +175,24 @@ namespace elna::boot
}
pointer_type_expression::pointer_type_expression(const struct position position,
std::shared_ptr<type_expression> base)
type_expression *base)
: type_expression(position), m_base(base)
{
}
pointer_type_expression::~pointer_type_expression()
{
delete m_base;
}
void pointer_type_expression::accept(parser_visitor *visitor)
{
visitor->visit(this);
}
std::shared_ptr<pointer_type_expression> pointer_type_expression::is_pointer()
pointer_type_expression *pointer_type_expression::is_pointer()
{
return std::static_pointer_cast<pointer_type_expression>(shared_from_this());
return this;
}
type_expression& pointer_type_expression::base()
@ -196,14 +206,22 @@ namespace elna::boot
{
}
record_type_expression::~record_type_expression()
{
for (const field_declaration& field : this->fields)
{
delete field.second;
}
}
void record_type_expression::accept(parser_visitor *visitor)
{
visitor->visit(this);
}
std::shared_ptr<record_type_expression> record_type_expression::is_record()
record_type_expression *record_type_expression::is_record()
{
return std::static_pointer_cast<record_type_expression>(shared_from_this());
return this;
}
union_type_expression::union_type_expression(const struct position position,
@ -212,14 +230,22 @@ namespace elna::boot
{
}
union_type_expression::~union_type_expression()
{
for (const field_declaration& field : this->fields)
{
delete field.second;
}
}
void union_type_expression::accept(parser_visitor *visitor)
{
visitor->visit(this);
}
std::shared_ptr<union_type_expression> union_type_expression::is_union()
union_type_expression *union_type_expression::is_union()
{
return std::static_pointer_cast<union_type_expression>(shared_from_this());
return this;
}
variable_declaration::variable_declaration(const struct position position, const std::string& identifier,
@ -264,19 +290,30 @@ namespace elna::boot
delete m_body;
}
procedure_type_expression::procedure_type_expression(const struct position position,
return_declaration<std::shared_ptr<type_expression>> return_type)
procedure_type_expression::procedure_type_expression(const struct position position, return_t return_type)
: type_expression(position), return_type(return_type)
{
}
procedure_type_expression::~procedure_type_expression()
{
if (return_type.proper_type != nullptr)
{
delete return_type.proper_type;
}
for (const type_expression *parameter : this->parameters)
{
delete parameter;
}
}
void procedure_type_expression::accept(parser_visitor *visitor)
{
visitor->visit(this);
}
procedure_definition::procedure_definition(const struct position position, const std::string& identifier,
const bool exported, std::shared_ptr<procedure_type_expression> heading, block *body)
const bool exported, procedure_type_expression *heading, block *body)
: definition(position, identifier, exported), m_heading(heading), body(body)
{
}
@ -286,9 +323,9 @@ namespace elna::boot
visitor->visit(this);
}
std::shared_ptr<procedure_type_expression> procedure_type_expression::is_procedure()
procedure_type_expression *procedure_type_expression::is_procedure()
{
return std::static_pointer_cast<procedure_type_expression>(shared_from_this());
return this;
}
procedure_type_expression& procedure_definition::heading()
@ -298,15 +335,21 @@ namespace elna::boot
procedure_definition::~procedure_definition()
{
delete m_heading;
delete body;
}
type_definition::type_definition(const struct position position, const std::string& identifier,
const bool exported, std::shared_ptr<type_expression> body)
const bool exported, type_expression *body)
: definition(position, identifier, exported), m_body(body)
{
}
type_definition::~type_definition()
{
delete m_body;
}
void type_definition::accept(parser_visitor *visitor)
{
visitor->visit(this);
@ -637,8 +680,7 @@ namespace elna::boot
delete m_callable;
}
cast_expression::cast_expression(const struct position position,
std::shared_ptr<type_expression> target, expression *value)
cast_expression::cast_expression(const struct position position, type_expression *target, expression *value)
: node(position), m_target(target), m_value(value)
{
}
@ -665,6 +707,7 @@ namespace elna::boot
cast_expression::~cast_expression()
{
delete m_target;
delete m_value;
}
@ -673,6 +716,14 @@ namespace elna::boot
{
}
traits_expression::~traits_expression()
{
for (const type_expression *parameter : this->parameters)
{
delete parameter;
}
}
void traits_expression::accept(parser_visitor *visitor)
{
visitor->visit(this);