Line | Branch | Exec | Source |
---|---|---|---|
1 | // Copyright (c) 2021-2025 ChilliBits. All rights reserved. | ||
2 | |||
3 | #include "CompilerPass.h" | ||
4 | |||
5 | #include <SourceFile.h> | ||
6 | #include <global/GlobalResourceManager.h> | ||
7 | #include <symboltablebuilder/Scope.h> | ||
8 | |||
9 | namespace spice::compiler { | ||
10 | |||
11 | 8893 | CompilerPass::CompilerPass(GlobalResourceManager &resourceManager, SourceFile *sourceFile) | |
12 | 8893 | : resourceManager(resourceManager), cliOptions(resourceManager.cliOptions), sourceFile(sourceFile), | |
13 |
2/2✓ Branch 0 (2→3) taken 8892 times.
✓ Branch 1 (2→4) taken 1 times.
|
8893 | rootScope(sourceFile != nullptr ? sourceFile->globalScope.get() : nullptr), currentScope(rootScope) {} |
14 | |||
15 | /** | ||
16 | * Change to the passed scope. | ||
17 | * For nested scopes in generic functions/procedures it is important to have the right parent for symbol lookups | ||
18 | * Therefore, changeToScope sets the children's parent to the old scope to always have the right parent | ||
19 | * | ||
20 | * @param scope Scope to change to | ||
21 | * @param scopeType Expected type of the given scope | ||
22 | */ | ||
23 | 30478 | void CompilerPass::changeToScope(Scope *scope, [[maybe_unused]] ScopeType scopeType) { | |
24 |
1/2✗ Branch 0 (2→3) not taken.
✓ Branch 1 (2→4) taken 30478 times.
|
30478 | assert(scope != nullptr); |
25 |
1/2✗ Branch 0 (4→5) not taken.
✓ Branch 1 (4→6) taken 30478 times.
|
30478 | assert(scope->type == scopeType); |
26 |
1/2✗ Branch 0 (6→7) not taken.
✓ Branch 1 (6→8) taken 30478 times.
|
30478 | assert(!scope->isGenericScope); |
27 | // Adjust members of the new scope | ||
28 | 30478 | scope->parent = currentScope; | |
29 | 30478 | scope->symbolTable.parent = ¤tScope->symbolTable; | |
30 | // Set the scope | ||
31 | 30478 | currentScope = scope; | |
32 | 30478 | } | |
33 | |||
34 | /** | ||
35 | * Change to the scope with the given name. | ||
36 | * | ||
37 | * @param scopeName Name of the scope to change to | ||
38 | * @param scopeType Expected type of the given scope | ||
39 | */ | ||
40 | 5588 | void CompilerPass::changeToScope(const std::string &scopeName, ScopeType scopeType) { | |
41 |
1/2✗ Branch 0 (3→4) not taken.
✓ Branch 1 (3→5) taken 5588 times.
|
5588 | assert(!scopeName.empty()); |
42 | 5588 | changeToScope(currentScope->getChildScope(scopeName), scopeType); | |
43 | 5588 | } | |
44 | |||
45 | /** | ||
46 | * Change to the parent scope of the current. | ||
47 | * | ||
48 | * @param oldScopeType Expected type of the scope to leave | ||
49 | */ | ||
50 | 15504 | void CompilerPass::changeToParentScope([[maybe_unused]] ScopeType oldScopeType) { | |
51 |
1/2✗ Branch 0 (2→3) not taken.
✓ Branch 1 (2→4) taken 15504 times.
|
15504 | assert(currentScope->type == oldScopeType); |
52 |
1/2✗ Branch 0 (4→5) not taken.
✓ Branch 1 (4→6) taken 15504 times.
|
15504 | assert(currentScope->parent != nullptr); |
53 | 15504 | currentScope = currentScope->parent; | |
54 | 15504 | } | |
55 | |||
56 | } // namespace spice::compiler | ||
57 |