Remove type visiting in generic visitor
This commit is contained in:
@@ -131,6 +131,53 @@ namespace elna::boot
|
||||
virtual void visit(literal<std::string> *) = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* Abstract visitor that doesn't visit any nodes by default.
|
||||
*/
|
||||
class empty_visitor : public parser_visitor
|
||||
{
|
||||
[[noreturn]] void not_implemented();
|
||||
|
||||
public:
|
||||
[[noreturn]] virtual void visit(named_type_expression *) override;
|
||||
[[noreturn]] virtual void visit(array_type_expression *) override;
|
||||
[[noreturn]] virtual void visit(pointer_type_expression *) override;
|
||||
[[noreturn]] virtual void visit(program *) override;
|
||||
[[noreturn]] virtual void visit(type_declaration *) override;
|
||||
[[noreturn]] virtual void visit(record_type_expression *) override;
|
||||
[[noreturn]] virtual void visit(union_type_expression *) override;
|
||||
[[noreturn]] virtual void visit(procedure_type_expression *) override;
|
||||
[[noreturn]] virtual void visit(enumeration_type_expression *) override;
|
||||
|
||||
[[noreturn]] virtual void visit(variable_declaration *) override;
|
||||
[[noreturn]] virtual void visit(constant_declaration *) override;
|
||||
[[noreturn]] virtual void visit(procedure_declaration *) override;
|
||||
[[noreturn]] virtual void visit(assign_statement *) override;
|
||||
[[noreturn]] virtual void visit(if_statement *) override;
|
||||
[[noreturn]] virtual void visit(import_declaration *) override;
|
||||
[[noreturn]] virtual void visit(while_statement *) override;
|
||||
[[noreturn]] virtual void visit(return_statement *) override;
|
||||
[[noreturn]] virtual void visit(defer_statement *) override;
|
||||
[[noreturn]] virtual void visit(case_statement *) override;
|
||||
[[noreturn]] virtual void visit(procedure_call *) override;
|
||||
[[noreturn]] virtual void visit(unit *) override;
|
||||
[[noreturn]] virtual void visit(cast_expression *) override;
|
||||
[[noreturn]] virtual void visit(traits_expression *) override;
|
||||
[[noreturn]] virtual void visit(binary_expression *) override;
|
||||
[[noreturn]] virtual void visit(unary_expression *) override;
|
||||
[[noreturn]] virtual void visit(variable_expression *) override;
|
||||
[[noreturn]] virtual void visit(array_access_expression *) override;
|
||||
[[noreturn]] virtual void visit(field_access_expression *) override;
|
||||
[[noreturn]] virtual void visit(dereference_expression *) override;
|
||||
[[noreturn]] virtual void visit(literal<std::int32_t> *) override;
|
||||
[[noreturn]] virtual void visit(literal<std::uint32_t> *) override;
|
||||
[[noreturn]] virtual void visit(literal<double> *) override;
|
||||
[[noreturn]] virtual void visit(literal<bool> *) override;
|
||||
[[noreturn]] virtual void visit(literal<unsigned char> *) override;
|
||||
[[noreturn]] virtual void visit(literal<std::nullptr_t> *) override;
|
||||
[[noreturn]] virtual void visit(literal<std::string> *) override;
|
||||
};
|
||||
|
||||
/**
|
||||
* AST node.
|
||||
*/
|
||||
|
@@ -35,15 +35,16 @@ namespace elna::boot
|
||||
explicit dependency(const char *path);
|
||||
};
|
||||
|
||||
dependency read_sources(std::istream& entry_point, const char *entry_path);
|
||||
dependency read_source(std::istream& entry_point, const char *entry_path);
|
||||
std::filesystem::path build_path(const std::vector<std::string>& segments);
|
||||
error_list analyze_semantics(const char *path, std::unique_ptr<unit>& tree, symbol_bag bag);
|
||||
|
||||
template<typename T>
|
||||
struct dependency_state
|
||||
{
|
||||
const std::shared_ptr<symbol_table> globals;
|
||||
T custom;
|
||||
std::unordered_map<std::filesystem::path, elna::boot::symbol_bag> cache;
|
||||
std::unordered_map<std::filesystem::path, symbol_bag> cache;
|
||||
|
||||
explicit dependency_state(T custom)
|
||||
: globals(elna::boot::builtin_symbol_table()), custom(custom)
|
||||
|
@@ -69,6 +69,40 @@ namespace elna::boot
|
||||
std::string what() const override;
|
||||
};
|
||||
|
||||
class return_error : public error
|
||||
{
|
||||
const std::string identifier;
|
||||
|
||||
public:
|
||||
return_error(const std::string& identifier, const char *path, const struct position position);
|
||||
|
||||
std::string what() const override;
|
||||
};
|
||||
|
||||
/**
|
||||
* Checks types.
|
||||
*/
|
||||
class type_analysis_visitor final : public empty_visitor, public error_container
|
||||
{
|
||||
bool returns;
|
||||
|
||||
public:
|
||||
explicit type_analysis_visitor(const char *path);
|
||||
|
||||
void visit(program *program) override;
|
||||
|
||||
void visit(procedure_declaration *definition) override;
|
||||
void visit(assign_statement *) override;
|
||||
void visit(if_statement *) override;
|
||||
void visit(import_declaration *) override;
|
||||
void visit(while_statement *) override;
|
||||
void visit(return_statement *) override;
|
||||
void visit(defer_statement *) override;
|
||||
void visit(case_statement *) override;
|
||||
void visit(procedure_call *) override;
|
||||
void visit(unit *unit) override;
|
||||
};
|
||||
|
||||
/**
|
||||
* Performs name analysis.
|
||||
*/
|
||||
@@ -128,51 +162,17 @@ namespace elna::boot
|
||||
};
|
||||
|
||||
/**
|
||||
* Collects global declarations.
|
||||
* Collects global declarations without resolving any symbols.
|
||||
*/
|
||||
class declaration_visitor final : public parser_visitor, public error_container
|
||||
class declaration_visitor final : public empty_visitor, public error_container
|
||||
{
|
||||
public:
|
||||
std::unordered_map<std::string, std::shared_ptr<alias_type>> unresolved;
|
||||
|
||||
explicit declaration_visitor(const char *path);
|
||||
|
||||
void visit(named_type_expression *) override;
|
||||
void visit(array_type_expression *) override;
|
||||
void visit(pointer_type_expression *) override;
|
||||
void visit(program *program) override;
|
||||
void visit(type_declaration *) override;
|
||||
void visit(record_type_expression *) override;
|
||||
void visit(union_type_expression *) override;
|
||||
void visit(procedure_type_expression *) override;
|
||||
void visit(enumeration_type_expression *) override;
|
||||
|
||||
void visit(variable_declaration *) override;
|
||||
void visit(constant_declaration *) override;
|
||||
void visit(procedure_declaration *) override;
|
||||
void visit(assign_statement *) override;
|
||||
void visit(if_statement *) override;
|
||||
void visit(import_declaration *) override;
|
||||
void visit(while_statement *) override;
|
||||
void visit(return_statement *) override;
|
||||
void visit(defer_statement *) override;
|
||||
void visit(case_statement *) override;
|
||||
void visit(procedure_call *) override;
|
||||
void visit(unit *unit) override;
|
||||
void visit(cast_expression *) override;
|
||||
void visit(traits_expression *) override;
|
||||
void visit(binary_expression *) override;
|
||||
void visit(unary_expression *) override;
|
||||
void visit(variable_expression *) override;
|
||||
void visit(array_access_expression *) override;
|
||||
void visit(field_access_expression *) override;
|
||||
void visit(dereference_expression *) override;
|
||||
void visit(literal<std::int32_t> *) override;
|
||||
void visit(literal<std::uint32_t> *) override;
|
||||
void visit(literal<double> *) override;
|
||||
void visit(literal<bool> *) override;
|
||||
void visit(literal<unsigned char> *) override;
|
||||
void visit(literal<std::nullptr_t> *) override;
|
||||
void visit(literal<std::string> *) override;
|
||||
};
|
||||
}
|
||||
|
@@ -33,7 +33,7 @@ along with GCC; see the file COPYING3. If not see
|
||||
|
||||
namespace elna::gcc
|
||||
{
|
||||
class generic_visitor final : public boot::parser_visitor
|
||||
class generic_visitor final : public boot::empty_visitor
|
||||
{
|
||||
tree current_expression{ NULL_TREE };
|
||||
elna::boot::symbol_bag bag;
|
||||
@@ -91,13 +91,6 @@ namespace elna::gcc
|
||||
void visit(boot::if_statement *statement) override;
|
||||
void visit(boot::import_declaration *) override;
|
||||
void visit(boot::while_statement *statement) override;
|
||||
void visit(boot::named_type_expression *type) override;
|
||||
void visit(boot::array_type_expression *) override;
|
||||
void visit(boot::pointer_type_expression *type) override;
|
||||
void visit(boot::record_type_expression *) override;
|
||||
void visit(boot::union_type_expression *) override;
|
||||
void visit(boot::procedure_type_expression *) override;
|
||||
void visit(boot::enumeration_type_expression *) override;
|
||||
void visit(boot::return_statement *statement) override;
|
||||
void visit(boot::defer_statement *statement) override;
|
||||
void visit(boot::case_statement *statement) override;
|
||||
|
Reference in New Issue
Block a user