private static void EmitCode(PackageIL package, PackageIL stdLibPackage, string path) { var codeEmitter = new CodeEmitter(); codeEmitter.Emit(package); codeEmitter.Emit(stdLibPackage); File.WriteAllText(path, codeEmitter.GetEmittedCode(), Encoding.UTF8); }
public string Disassemble(PackageIL package) { var builder = new AssemblyBuilder(); foreach (var declaration in package.GetNonMemberDeclarations()) { Disassemble(declaration, builder); builder.BlankLine(); } return(builder.Code); }
private static string EmitCode(Project project, PackageIL package, string cacheDir) { var emittedPackages = new HashSet <PackageIL>(); var packagesToEmit = new Queue <PackageIL>(); packagesToEmit.Enqueue(package); var codeEmitter = new CodeEmitter(); while (packagesToEmit.TryDequeue(out var currentPackage)) { if (!emittedPackages.Contains(currentPackage)) { codeEmitter.Emit(currentPackage); emittedPackages.Add(currentPackage); packagesToEmit.EnqueueRange(currentPackage.References); } } string outputPath; switch (project.Template) { case ProjectTemplate.App: { outputPath = Path.Combine(cacheDir, "program.c"); } break; case ProjectTemplate.Lib: { outputPath = Path.Combine(cacheDir, "lib.c"); } break; default: throw ExhaustiveMatch.Failed(project.Template); } File.WriteAllText(outputPath, codeEmitter.GetEmittedCode(), Encoding.UTF8); return(outputPath); }
public abstract void Emit(PackageIL package);
public override void Emit(PackageIL package) { packageEmitter.Emit(package, code); }