Joos1W Compiler Framework
All Classes Functions Typedefs Pages
CompilerPasses.h
1 #pragma once
2 
3 #include <string_view>
4 
5 #include "semantic/HierarchyChecker.h"
6 #include "semantic/NameResolver.h"
7 #include "semantic/Semantic.h"
8 #include "utils/PassManager.h"
9 
10 namespace joos1 {
11 
12 using std::string_view;
13 using utils::Pass;
14 using utils::PassManager;
15 
16 /* ===--------------------------------------------------------------------=== */
17 
18 class Joos1WParserPass final : public Pass {
19 public:
20  Joos1WParserPass(PassManager& PM, SourceFile file, Pass* prev) noexcept
21  : Pass(PM), file_{file}, prev_{prev} {}
22  string_view Desc() const override { return "Joos1W Lexing and Parsing"; }
23  void Run() override;
24  parsetree::Node* Tree() { return tree_; }
25  SourceFile File() { return file_; }
26 
27 private:
28  /// @brief Checks if the literal type is valid recursively
29  bool isLiteralTypeValid(parsetree::Node* node);
30  void checkNonAscii(std::string_view str);
31 
32 private:
33  void computeDependencies() override {
34  if(prev_) ComputeDependency(*prev_);
35  }
36  SourceFile file_;
37  parsetree::Node* tree_;
38  Pass* prev_;
39 };
40 
41 /* ===--------------------------------------------------------------------=== */
42 
43 class AstContextPass final : public Pass {
44 public:
45  AstContextPass(PassManager& PM) noexcept : Pass(PM) {}
46  string_view Desc() const override { return "AST Context Lifetime"; }
47  void Init() override;
48  void Run() override;
49  ast::Semantic& Sema() { return *sema; }
50  ~AstContextPass() override;
51 
52 private:
53  void computeDependencies() override {}
54  std::unique_ptr<ast::Semantic> sema;
55  std::unique_ptr<BumpAllocator> alloc;
56 };
57 
58 /* ===--------------------------------------------------------------------=== */
59 
60 class AstBuilderPass final : public Pass {
61 public:
62  AstBuilderPass(PassManager& PM, Joos1WParserPass& dep) noexcept;
63  string_view Desc() const override { return "ParseTree -> AST Building"; }
64  void Init() override;
65  void Run() override;
66  ast::CompilationUnit* CompilationUnit() { return cu_; }
67 
68 private:
69  void computeDependencies() override {
71  ComputeDependency(GetPass<AstContextPass>());
72  }
73  ast::CompilationUnit* cu_;
74  Joos1WParserPass& dep;
75  CLI::Option* optCheckName;
76 };
77 
78 /* ===--------------------------------------------------------------------=== */
79 
80 class LinkerPass final : public Pass {
81 public:
82  LinkerPass(PassManager& PM) noexcept : Pass(PM) {}
83  string_view Desc() const override { return "AST Linking"; }
84  void Run() override;
85  ast::LinkingUnit* LinkingUnit() { return lu_; }
86 
87 private:
88  void computeDependencies() override {
89  ComputeDependency(GetPass<AstContextPass>());
90  for(auto* pass : GetPasses<AstBuilderPass>()) ComputeDependency(*pass);
91  }
92  ast::LinkingUnit* lu_;
93 };
94 
95 /* ===--------------------------------------------------------------------=== */
96 
97 class NameResolverPass final : public Pass {
98 public:
99  NameResolverPass(PassManager& PM) noexcept : Pass{PM} {}
100  string_view Name() const override { return "sema-name"; }
101  string_view Desc() const override { return "Name Resolution"; }
102  void Init() override;
103  void Run() override;
104  semantic::NameResolver& Resolver() { return *NR; }
105  ~NameResolverPass() override;
106 
107 private:
108  void replaceObjectClass(ast::AstNode* node);
109  void resolveExpr(ast::Expr* expr);
110  void resolveRecursive(ast::AstNode* node);
111 
112  void computeDependencies() override {
113  ComputeDependency(GetPass<AstContextPass>());
114  ComputeDependency(GetPass<LinkerPass>());
115  }
116  std::unique_ptr<BumpAllocator> alloc;
117  std::unique_ptr<semantic::NameResolver> NR;
118 };
119 
120 /* ===--------------------------------------------------------------------=== */
121 
122 class HierarchyCheckerPass final : public Pass {
123 public:
124  HierarchyCheckerPass(PassManager& PM) noexcept
125  : Pass(PM), checker{semantic::HierarchyChecker(PM.Diag())} {}
126  string_view Name() const override { return "sema-hier"; }
127  string_view Desc() const override { return "Hierarchy Checking"; }
128  void Run() override;
129  semantic::HierarchyChecker& Checker() { return checker; }
130 
131 private:
132  void computeDependencies() override {
133  ComputeDependency(GetPass<AstContextPass>());
134  ComputeDependency(GetPass<LinkerPass>());
135  ComputeDependency(GetPass<NameResolverPass>());
136  }
137  semantic::HierarchyChecker checker;
138 };
139 
140 } // namespace joos1