feat: parallelised the renamer
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user