public static void Reconstruct(String path, String output = "stdout") { if (!File.Exists(path)) { Error("File doesn't exists."); return; } var code = File.ReadAllText(path); var environment = new LuaEnvironment( ); environment.AddAnalyser("fixparents", new Analysis.FixParentsAnalyser( )); environment.AddAnalyser("gotocheck", new Analysis.GotoTargetCheckAnalyser( )); environment.AddFolder("ConstantFolder 1st pass", new Folder.ConstantASTFolder( )); environment.AddAnalyser("AssignmentAnalyser", new Analysis.AssignmentAnalyser( )); environment.AddFolder("AssignmentFolder", new Folder.AssignmentFolder( )); //environment.AddFolder ( "ConstantFolder 2nd pass", new Folder.ConstantASTFolder ( ) ); var sw1 = Stopwatch.StartNew( ); Env.EnvFile file = environment.ProcessFile(path, code); sw1.Stop( ); foreach (Error err in file.Errors) { Console.WriteLine($"{err.Location} [{err.Type}] {err.Message}"); } var sw2 = Stopwatch.StartNew( ); using (var mem = new MemoryStream( )) using (Stream fileStream = output == "stdout" ? Console.OpenStandardOutput( ) : File.OpenWrite(output)) using (var writer = new StreamWriter(fileStream, Encoding.UTF8)) { var reconstructor = new FormattedLuaReconstructor( ); reconstructor.Construct(file.AST, mem); writer.Write(Encoding.UTF8.GetString(mem.ToArray( ))); } sw2.Stop( ); Console.WriteLine($"Time elapsed on parsing + analysing + folding: {HumanTime ( sw1 )}"); Console.WriteLine($"Time elapsed on serializing code: {HumanTime ( sw2 )}"); }