| 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 | 11026 | CompilerPass::CompilerPass(GlobalResourceManager &resourceManager, SourceFile *sourceFile) | |
| 12 | 11026 | : resourceManager(resourceManager), cliOptions(resourceManager.cliOptions), sourceFile(sourceFile), | |
| 13 |
2/2✓ Branch 2 → 3 taken 11025 times.
✓ Branch 2 → 4 taken 1 time.
|
11026 | 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 | 34670 | void CompilerPass::changeToScope(Scope *scope, [[maybe_unused]] ScopeType scopeType) { | |
| 24 |
1/2✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 34670 times.
|
34670 | assert(scope != nullptr); |
| 25 |
1/2✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 34670 times.
|
34670 | assert(scope->type == scopeType); |
| 26 |
1/2✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 34670 times.
|
34670 | assert(!scope->isGenericScope); |
| 27 | // Adjust members of the new scope | ||
| 28 | 34670 | scope->parent = currentScope; | |
| 29 | 34670 | scope->symbolTable.parent = ¤tScope->symbolTable; | |
| 30 | // Set the scope | ||
| 31 | 34670 | currentScope = scope; | |
| 32 | 34670 | } | |
| 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 | 6213 | void CompilerPass::changeToScope(const std::string &scopeName, ScopeType scopeType) { | |
| 41 |
1/2✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 6213 times.
|
6213 | assert(!scopeName.empty()); |
| 42 | 6213 | changeToScope(currentScope->getChildScope(scopeName), scopeType); | |
| 43 | 6213 | } | |
| 44 | |||
| 45 | /** | ||
| 46 | * Change to the parent scope of the current. | ||
| 47 | * | ||
| 48 | * @param oldScopeType Expected type of the scope to leave | ||
| 49 | */ | ||
| 50 | 17125 | void CompilerPass::changeToParentScope([[maybe_unused]] ScopeType oldScopeType) { | |
| 51 |
1/2✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 17125 times.
|
17125 | assert(currentScope->type == oldScopeType); |
| 52 |
1/2✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 17125 times.
|
34250 | assert(!currentScope->isRootScope()); |
| 53 | 17125 | currentScope = currentScope->parent; | |
| 54 | 17125 | } | |
| 55 | |||
| 56 | } // namespace spice::compiler | ||
| 57 |