private void CreateCompilationCommands(Utility.CompileCommandFileWriter fileWriter, EnvDTE.Project project, ref int projectsProcessed) { try { SolutionParser.SolutionParser solutionParser = new SolutionParser.SolutionParser(new VsPathResolver(_targetDir)); solutionParser.CreateCompileCommands( project, _configurationName, _platformName, _cStandard, _additionalClangOptions, _nonSystemIncludesUseAngleBrackets, (CompileCommand command) => { fileWriter.PushCommand(command); } ); lock (_lockObject) { projectsProcessed++; } float relativProgress = (float)projectsProcessed / (float)_projects.Count; Logging.Logging.LogInfo("Processing project \"" + Logging.Obfuscation.NameObfuscator.GetObfuscatedName(project.Name) + "\""); backgroundWorker1.ReportProgress((int)(relativProgress * 100), "Processing project \"" + project.Name + "\""); } catch (Exception e) { Logging.Logging.LogError("Failed to create CDB for project with exception: " + e.Message); Logging.Logging.LogError("Stack Trace: " + e.StackTrace); throw; } }
private void CreateCompilationDatabase() { File.WriteAllText(_targetDir + "\\" + _fileName + ".json", ""); File.AppendAllText(_targetDir + "\\" + _fileName + ".json", "[\n"); Utility.CompileCommandFileWriter fileWriter = new Utility.CompileCommandFileWriter(_fileName + ".json", _targetDir); fileWriter.StartWorking(); try { Multitasking.LimitedThreadsTaskScheduler scheduler = new Multitasking.LimitedThreadsTaskScheduler(_threadCount); TaskFactory factory = new TaskFactory(scheduler); List <Task> tasks = new List <Task>(); int projectsProcessed = 0; foreach (EnvDTE.Project project in _projects.GetRange(0, _projects.Count)) { Logging.Logging.LogInfo("Scheduling project \"" + Logging.Obfuscation.NameObfuscator.GetObfuscatedName(project.Name) + "\" for parsing."); Task task = factory.StartNew(() => { CreateCompilationCommands(fileWriter, project, ref projectsProcessed); }); tasks.Add(task); } Task.WaitAll(tasks.ToArray()); fileWriter.StopWorking(); backgroundWorker1.ReportProgress(100, "Writing data to file. This might take several minutes..."); } catch (Exception e) { Logging.Logging.LogError("Failed to create CDB for solution with exception: " + e.Message); Logging.Logging.LogError("Stack Trace: " + e.StackTrace); } finally { File.AppendAllText(_targetDir + "\\" + _fileName + ".json", "\n]"); } }