5 #include "semantic/HierarchyChecker.h"
6 #include "semantic/NameResolver.h"
7 #include "semantic/Semantic.h"
8 #include "utils/PassManager.h"
12 using std::string_view;
14 using utils::PassManager;
18 class Joos1WParserPass
final :
public Pass {
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"; }
24 parsetree::
Node* Tree() {
return tree_; }
29 bool isLiteralTypeValid(parsetree::
Node* node);
30 void checkNonAscii(std::string_view str);
33 void computeDependencies()
override {
37 parsetree::
Node* tree_;
43 class AstContextPass
final :
public Pass {
45 AstContextPass(PassManager& PM)
noexcept :
Pass(PM
) {}
46 string_view
Desc()
const override {
return "AST Context Lifetime"; }
49 ast::
Semantic& Sema() {
return *sema; }
50 ~AstContextPass()
override;
53 void computeDependencies()
override {}
54 std::unique_ptr<ast::Semantic> sema;
55 std::unique_ptr<BumpAllocator> alloc;
60 class AstBuilderPass
final :
public Pass {
62 AstBuilderPass(PassManager& PM, Joos1WParserPass& dep)
noexcept;
63 string_view
Desc()
const override {
return "ParseTree -> AST Building"; }
66 ast::CompilationUnit* CompilationUnit() {
return cu_; }
69 void computeDependencies()
override {
73 ast::CompilationUnit* cu_;
74 Joos1WParserPass& dep;
75 CLI::Option* optCheckName;
80 class LinkerPass
final :
public Pass {
82 LinkerPass(PassManager& PM)
noexcept :
Pass(PM
) {}
85 ast::LinkingUnit* LinkingUnit() {
return lu_; }
88 void computeDependencies()
override {
90 for(
auto* pass : GetPasses<AstBuilderPass>()) ComputeDependency(*pass);
92 ast::LinkingUnit* lu_;
97 class NameResolverPass
final :
public Pass {
99 NameResolverPass(PassManager& PM)
noexcept :
Pass{PM
} {}
102 void Init()
override;
104 semantic::NameResolver& Resolver() {
return *NR; }
105 ~NameResolverPass()
override;
108 void replaceObjectClass(ast::
AstNode* node);
109 void resolveExpr(ast::
Expr* expr);
110 void resolveRecursive(ast::
AstNode* node);
112 void computeDependencies()
override {
116 std::unique_ptr<BumpAllocator> alloc;
117 std::unique_ptr<semantic::NameResolver> NR;
122 class HierarchyCheckerPass
final :
public Pass {
124 HierarchyCheckerPass(PassManager& PM)
noexcept
125 :
Pass(PM
), checker{semantic::HierarchyChecker(PM.Diag())} {}
132 void computeDependencies()
override {