package org.shedlang.compiler.backends; import org.shedlang.compiler.config.BinConfig; import org.shedlang.compiler.config.ProfileConfig; import org.shedlang.compiler.config.ProjectConfig; import org.shedlang.compiler.patio.PatioCompilationUnit; import org.shedlang.compiler.shid.ShidNamespace; import org.shedlang.compiler.shidtopatio.ShidToPatio; import org.shedlang.compiler.shidtopatio.ShidToPatioContext; import org.shedlang.compiler.sources.Sources; import org.shedlang.compiler.typechecker.TypeInfos; import org.shedlang.compiler.types.NamespaceName; import java.io.IOException; import java.util.List; import java.util.Optional; public class PatioBackends { public interface PatioToTarget { PatioToTarget namespace( NamespaceName namespaceName, PatioCompilationUnit patioCompilationUnit ) throws IOException, InterruptedException; void bin( String binName, PatioCompilationUnit patioCompilationUnit, String mainFunctionName, ProfileConfig profileConfig ) throws IOException, InterruptedException; } public static void compile( ProjectConfig config, ProfileConfig profileConfig, List namespaces, TypeInfos typeInfos, PatioToTarget patioToTarget ) throws IOException, InterruptedException { var shidToPatioGlobalContext = ShidToPatioContext.GlobalContext.forTypeInfos(typeInfos); for (var namespace : namespaces) { var shidToPatioContext = ShidToPatioContext.initialForCompilationUnit( Optional.of(namespace.namespaceName()), shidToPatioGlobalContext ); var patioCompilationUnitResult = ShidToPatio.generateNamespace( namespace, shidToPatioContext ); var patioCompilationUnit = patioCompilationUnitResult.value(); shidToPatioGlobalContext = patioCompilationUnitResult.context(); patioToTarget = patioToTarget.namespace(namespace.namespaceName(), patioCompilationUnit); } for (var bin : config.bins()) { generateMain(profileConfig, bin, shidToPatioGlobalContext, patioToTarget); } } private static void generateMain( ProfileConfig profileConfig, BinConfig binConfig, ShidToPatioContext.GlobalContext shidToPatioGlobalContext, PatioToTarget patioToTarget ) throws IOException, InterruptedException { var shidToPatioContext = ShidToPatioContext.initialForCompilationUnit( Optional.empty(), shidToPatioGlobalContext ); // TODO: set appropriate source var source = Sources.NULL; var generateMainResult = ShidToPatio.generateMain( binConfig.mainNamespace(), source, shidToPatioContext ); var mainFunctionName = generateMainResult.value(); shidToPatioContext = generateMainResult.context(); shidToPatioContext = ShidToPatio.generateRtti( source, shidToPatioContext ); var patioCompilationUnitResult = shidToPatioContext.toCompilationUnit(source); var patioCompilationUnit = patioCompilationUnitResult.value(); shidToPatioGlobalContext = patioCompilationUnitResult.context(); patioToTarget.bin( binConfig.name(), patioCompilationUnit, mainFunctionName, profileConfig ); } }