Replace type expression with traits

This commit is contained in:
2025-02-25 23:39:31 +01:00
parent 85b6843ecf
commit f091344cce
7 changed files with 423 additions and 373 deletions

View File

@ -58,14 +58,13 @@ namespace boot
class constant_definition;
class procedure_definition;
class type_definition;
class call_expression;
class procedure_call;
class cast_expression;
class type_expression;
class assign_statement;
class if_statement;
class while_statement;
class return_statement;
class call_statement;
class traits_expression;
class block;
class program;
class binary_expression;
@ -93,10 +92,9 @@ namespace boot
virtual void visit(constant_definition *) = 0;
virtual void visit(procedure_definition *) = 0;
virtual void visit(type_definition *) = 0;
virtual void visit(call_expression *) = 0;
virtual void visit(procedure_call *) = 0;
virtual void visit(cast_expression *) = 0;
virtual void visit(type_expression *) = 0;
virtual void visit(call_statement *) = 0;
virtual void visit(traits_expression *) = 0;
virtual void visit(assign_statement *) = 0;
virtual void visit(if_statement *) = 0;
virtual void visit(while_statement *) = 0;
@ -134,10 +132,9 @@ namespace boot
virtual void visit(constant_definition *definition) override;
virtual void visit(procedure_definition *definition) override;
virtual void visit(type_definition *definition) override;
virtual void visit(call_expression *expression) override;
virtual void visit(traits_expression *trait) override;
virtual void visit(procedure_call *call) override;
virtual void visit(cast_expression *expression) override;
virtual void visit(type_expression *expression) override;
virtual void visit(call_statement *statement) override;
virtual void visit(assign_statement *statement) override;
virtual void visit(if_statement *) override;
virtual void visit(while_statement *) override;
@ -189,22 +186,16 @@ namespace boot
const struct position& position() const;
};
class statement : public node
class statement : public virtual node
{
protected:
/**
* \param position Source code position.
*/
explicit statement(const struct position position);
statement();
};
class expression : public node
class expression : public virtual node
{
protected:
/**
* \param position Source code position.
*/
explicit expression(const struct position position);
expression();
};
/**
@ -331,7 +322,7 @@ namespace boot
class literal : public expression
{
protected:
explicit literal(const struct position position);
literal();
};
/**
@ -435,31 +426,17 @@ namespace boot
virtual ~cast_expression() override;
};
/**
* Type inside an expression.
*/
class type_expression : public expression
class traits_expression : public expression
{
std::shared_ptr<top_type> m_body;
std::shared_ptr<top_type> m_type;
public:
type_expression(const struct position position, std::shared_ptr<top_type> body);
const std::string name;
traits_expression(const struct position position, const std::string& name, std::shared_ptr<top_type> type);
virtual void accept(parser_visitor *visitor) override;
top_type& body();
};
class call_statement : public statement
{
call_expression *m_body;
public:
call_statement(const struct position position, call_expression *body);
virtual void accept(parser_visitor *visitor) override;
call_expression& body();
virtual ~call_statement() override;
top_type& type();
};
/**
@ -501,19 +478,17 @@ namespace boot
virtual dereference_expression *is_dereference();
protected:
designator_expression(const struct position position);
designator_expression();
};
class variable_expression : public designator_expression
{
std::string m_name;
public:
const std::string name;
variable_expression(const struct position position, const std::string& name);
virtual void accept(parser_visitor *visitor) override;
const std::string& name() const;
variable_expression *is_variable() override;
};
@ -570,19 +545,19 @@ namespace boot
/**
* Procedure call expression.
*/
class call_expression : public expression
class procedure_call : public expression, public statement
{
designator_expression *m_callable;
public:
std::vector<expression *> arguments;
call_expression(const struct position position, designator_expression *callable);
procedure_call(const struct position position, designator_expression *callable);
virtual void accept(parser_visitor *visitor) override;
designator_expression& callable();
virtual ~call_expression() override;
virtual ~procedure_call() override;
};
class assign_statement : public statement
@ -676,7 +651,7 @@ namespace boot
T value;
number_literal(const struct position position, const T& value)
: literal(position), value(value)
: node(position), value(value)
{
}

View File

@ -60,15 +60,16 @@ namespace gcc
tree procedure_address, const std::vector<boot::expression *>& arguments);
void build_record_call(location_t call_location,
tree symbol, const std::vector<boot::expression *>& arguments);
void visit_statements(const std::vector<boot::statement *>& statements);
public:
generic_visitor(std::shared_ptr<symbol_table> symbol_table);
void visit(boot::program *program) override;
void visit(boot::procedure_definition *definition) override;
void visit(boot::call_expression *expression) override;
void visit(boot::procedure_call *call) override;
void visit(boot::cast_expression *expression) override;
void visit(boot::type_expression *expression) override;
void visit(boot::traits_expression *trait) override;
void visit(boot::number_literal<std::int32_t> *literal) override;
void visit(boot::number_literal<std::uint32_t> *literal) override;
void visit(boot::number_literal<double> *literal) override;
@ -85,10 +86,10 @@ namespace gcc
void visit(boot::array_access_expression *expression) override;
void visit(boot::field_access_expression *expression) override;
void visit(boot::dereference_expression *expression) override;
void visit(boot::block *block) override;
void visit(boot::assign_statement *statement) override;
void visit(boot::if_statement *statement) override;
void visit(boot::while_statement *statement) override;
void visit(boot::call_statement *statement) override;
void visit(boot::return_statement *statement) override;
void visit(boot::defer_statement *statement) override;
};