diff --git a/src/main/wacc/frontend/renamer.scala b/src/main/wacc/frontend/renamer.scala index bbce1bb..4893d42 100644 --- a/src/main/wacc/frontend/renamer.scala +++ b/src/main/wacc/frontend/renamer.scala @@ -267,18 +267,24 @@ object renamer { * @return * (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])] = { given scope: Scope = Scope(mutable.Map.empty, Map.empty) + for { - (main, chunks, errors) <- prepareGlobalScope(partialProg) + (main, chunks, globalErrors) <- prepareGlobalScope(partialProg) toRename = (main +: chunks).toList - res = (toRename zip scope.subscopes(toRename.size)).foldMap { - case (func @ FuncDecl(retType, name, params, body), subscope) => - val paramErrors = params.foldMap { param => subscope.add(param.name) } - val bodyErrors = subscope.withSubscope { s => body.foldMap(rename(s)) } - paramErrors ++ bodyErrors - } - } yield (Program(chunks.toList, main.body)(main.pos), errors ++ res) + allErrors <- toRename + .zip(scope.subscopes(toRename.size)) + .parFoldMapA(renameFunction) + // .map(x => x.combineAll) + } yield (Program(chunks.toList, main.body)(main.pos), globalErrors ++ allErrors) } /** Check scoping of all identifies in a given AST node.