feat: add option flag, greedy compilation of multiple files, and refactor to... #41

Merged
gc1523 merged 34 commits from master into intelliwacc-ide 2025-03-13 23:28:08 +00:00
34 changed files with 1159 additions and 505 deletions
Showing only changes of commit 68211fd877 - Show all commits

View File

@@ -267,18 +267,24 @@ object renamer {
* @return * @return
* (flattenedProg, errors) * (flattenedProg, errors)
*/ */
private def renameFunction(funcScopePair: (FuncDecl, Scope)): IO[Chain[Error]] = {
val (FuncDecl(_, _, params, body), subscope) = funcScopePair
val paramErrors = params.foldMap(param => subscope.add(param.name))
IO(subscope.withSubscope { s => body.foldMap(rename(s)) })
.map(bodyErrors => paramErrors ++ bodyErrors)
}
def rename(partialProg: PartialProgram): IO[(Program, Chain[Error])] = { def rename(partialProg: PartialProgram): IO[(Program, Chain[Error])] = {
given scope: Scope = Scope(mutable.Map.empty, Map.empty) given scope: Scope = Scope(mutable.Map.empty, Map.empty)
for { for {
(main, chunks, errors) <- prepareGlobalScope(partialProg) (main, chunks, globalErrors) <- prepareGlobalScope(partialProg)
toRename = (main +: chunks).toList toRename = (main +: chunks).toList
res = (toRename zip scope.subscopes(toRename.size)).foldMap { allErrors <- toRename
case (func @ FuncDecl(retType, name, params, body), subscope) => .zip(scope.subscopes(toRename.size))
val paramErrors = params.foldMap { param => subscope.add(param.name) } .parFoldMapA(renameFunction)
val bodyErrors = subscope.withSubscope { s => body.foldMap(rename(s)) } // .map(x => x.combineAll)
paramErrors ++ bodyErrors } yield (Program(chunks.toList, main.body)(main.pos), globalErrors ++ allErrors)
}
} yield (Program(chunks.toList, main.body)(main.pos), errors ++ res)
} }
/** Check scoping of all identifies in a given AST node. /** Check scoping of all identifies in a given AST node.