internal static async Task ProcessSarifLogAsync(SarifLog sarifLog, string logFilePath, bool cleanErrors, bool openInEditor) { // The creation of the data models must be done on the UI thread (for now). // VS's table data source constructs are indeed thread safe. // The object model (which is eventually handed to WPF\XAML) could also // be constructed on any thread as well. // However the current implementation of the data model and // the "run data cache" have not been augmented to support this // and are not thread safe. // This work could be done in the future to do even less work on the UI // thread if needed. if (!SarifViewerPackage.IsUnitTesting) { await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); } // Clear previous data if (cleanErrors) { CleanAllErrors(); } bool hasResults = false; foreach (Run run in sarifLog.Runs) { // run.tool is required, add one if it's missing if (run.Tool == null) { run.Tool = new Tool { Driver = new ToolComponent { Name = Resources.UnknownToolName, }, }; } if (Instance.WriteRunToErrorList(run, logFilePath, sarifLog) > 0) { hasResults = true; } } if (openInEditor && !SarifViewerPackage.IsUnitTesting) { SdkUIUtilities.OpenDocument(ServiceProvider.GlobalProvider, logFilePath, usePreviewPane: false); } if (hasResults) { if (!SarifViewerPackage.IsUnitTesting) { // We cannot show UI during unit-tests. SdkUIUtilities.ShowToolWindowAsync(new Guid(ToolWindowGuids80.ErrorList), activate: false).FileAndForget(Constants.FileAndForgetFaultEventNames.ShowErrorList); } } RaiseLogProcessed(ExceptionalConditionsCalculator.Calculate(sarifLog)); }