in src/Sarif.Viewer.VisualStudio.Core/ErrorList/ErrorListService.cs [473:534]
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);
}
}
SarifLogsMonitor.Instance.StartWatch(logFilePath);
RaiseLogProcessed(ExceptionalConditionsCalculator.Calculate(sarifLog));
}