public async Task <string> ReadModule(ModuleDefinition module) { if (Configuration.UpdateIgnored && !Configuration.ExcludedModules.Contains(module.Name)) { Console.Write($"Do you want to ignore {module.Name}? Press Y/N "); var answer = Console.ReadKey().Key.ToString().ToLower(); Console.WriteLine(); if (answer == "y" && !Configuration.ExcludedModules.Contains(module.Name)) { string configurationFileText = File.ReadAllText("Configuration.json"); ConfigurationFile configurationFile = JsonConvert.DeserializeObject <ConfigurationFile>(configurationFileText); configurationFile.IgnoredAssemblies.Add(module.Name); Configuration.ExcludedModules.Add(module.Name); File.WriteAllText("Configuration.json", JsonConvert.SerializeObject(configurationFile, Formatting.Indented)); Logger.Log("[Skipped]: " + module.Name); } // Do not analyze return(null); } // Check if we should ignore the module if (Configuration.ExcludedModules.Contains(module.Name)) { Logger.Log("[Skipped]: " + module.Name); return(null); } Logger.Log("[Analyzing]: " + module.Name); var file = new FileInfo(Path.Combine(Configuration.OutputPath, GetSafePath(module.Name) + ".flix")); // Get visitors var visitors = VisitorFactory.GetVisitors(); // Run all visitors var moduleBlock = ControlFlowGraph.GenerateModule(module); foreach (var visitor in visitors) { visitor.Visit(moduleBlock); } // Run code generator var codeGeneratorVisitor = FlixCodeGeneratorFactory.Generate(); codeGeneratorVisitor.Visit(moduleBlock); // Get UTF-8 encoding without BOM (default for File.CreateText which was used before) and just ignore invalid UTF-8 chars var encoder = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: false); using (var stream = new StreamWriter(File.Open(file.FullName, FileMode.Create), encoder))// File.CreateText(file.FullName)) { await stream.WriteAsync(codeGeneratorVisitor.GetGeneratedCode()); } Logger.Log("[Processed]: " + module.Name); // Return file name return(file.ToString()); }
private static async Task Run(ConsoleOptions opts) { // Check output path var outputPathInfo = new DirectoryInfo(opts.OutputPath); if (!outputPathInfo.Exists) { outputPathInfo.Create(); } // Read configuration IEnumerable <string> ignoredAssemblies = opts.Excluded; if (File.Exists("Configuration.json")) { string configurationFileText = File.ReadAllText("Configuration.json"); ConfigurationFile configurationFile = JsonConvert.DeserializeObject <ConfigurationFile>(configurationFileText); // Concatinate with the ignored files from the arguments ignoredAssemblies = ignoredAssemblies.Concat(configurationFile.IgnoredAssemblies); } // Create logger var logger = new ConsoleLogger(opts.Verbose, opts.Wait); // Create configuration var configuration = new Configuration(ignoredAssemblies, opts.OutputPath, opts.Async, opts.JavaArgs, opts.FlixArgs, opts.ShowFlixWindow, opts.NoStringAnalysis, opts.UpdateIgnored); // Registrer services var serviceCollection = new ServiceCollection(); Startup.ConfigureServices(serviceCollection, configuration, logger); var services = serviceCollection.BuildServiceProvider(); // Create flix executor using (var executor = services.GetRequiredService <IFlixExecutor>()) { // Get file processor var fileProcessor = services.GetRequiredService <FileProcessor>(); // Check for input file if (!string.IsNullOrWhiteSpace(opts.InputFile)) { // Check if path is input file var fileInfo = new FileInfo(opts.InputFile); if (fileInfo.Exists) { var files = await fileProcessor.ProcessFile(fileInfo); await ProcessFlix(files, executor, opts); } else { logger.Log($"File {opts.InputFile} not found"); } return; } // Check for input path if (!string.IsNullOrWhiteSpace(opts.InputPath)) { var pathInfo = new DirectoryInfo(opts.InputPath); if (pathInfo.Exists) { var searchOption = opts.Recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly; foreach (var file in Directory.GetFiles(pathInfo.FullName, "*.apk", searchOption) .Concat(Directory.GetFiles(pathInfo.FullName, "*.exe", searchOption)) .Concat(Directory.GetFiles(pathInfo.FullName, "*.dll", searchOption))) { try { var fileInfo = new FileInfo(file); var files = await fileProcessor.ProcessFile(fileInfo); await ProcessFlix(files, executor, opts); } catch (Exception ex) { // Log and ignore exceptions logger.Log($"[EXP]: {ex.Message}{Environment.NewLine}{ex.ToString()}{Environment.NewLine}{ex.StackTrace.ToString()}"); } } } else { logger.Log($"Path {opts.InputPath} not found"); } return; } logger.Log("Please select file or path"); } }