in src/Analyzer.Reports/SarifReportWriter.cs [65:136]
public void WriteResults(IEnumerable<IEvaluation> evaluations, IFileInfo templateFile, IFileInfo parameterFile = null)
{
this.RootPath ??= templateFile.DirectoryName;
var resultsByFile = ReportsHelper.GetResultsByFile(evaluations, filesAlreadyOutput);
// output files in sorted order, but always output root first
var filesWithResults = resultsByFile.Keys.ToList();
filesWithResults.Sort();
int rootIndex = filesWithResults.IndexOf(templateFile.FullName);
if (rootIndex != -1)
{
filesWithResults.RemoveAt(rootIndex);
filesWithResults.Insert(0, templateFile.FullName);
}
foreach (var fileWithResults in filesWithResults)
{
// add analysis target if result not in root template
ArtifactLocation analysisTarget = null;
if (fileWithResults != templateFile.FullName)
{
(var pathBelongsToRoot, var filePath) = GetFilePathInfo(templateFile.FullName);
analysisTarget = new ArtifactLocation
{
Uri = new Uri(
UriHelper.MakeValidUri(filePath),
UriKind.RelativeOrAbsolute),
UriBaseId = pathBelongsToRoot ? UriBaseIdString : null,
};
}
foreach ((var evaluation, var failedResults) in resultsByFile[fileWithResults])
{
// get rule definition from first level evaluation
this.ExtractRule(evaluation);
// create location for each individual result
(var pathBelongsToRoot, var filePath) = GetFilePathInfo(fileWithResults);
var locations = failedResults.Select(result => new Location
{
PhysicalLocation = new PhysicalLocation
{
ArtifactLocation = new ArtifactLocation
{
Uri = new Uri(
UriHelper.MakeValidUri(filePath),
UriKind.RelativeOrAbsolute),
UriBaseId = pathBelongsToRoot ? UriBaseIdString : null,
},
Region = new Region { StartLine = result.SourceLocation.LineNumber },
},
}).ToList();
// Log result
SarifLogger.Log(this.rulesDictionary[evaluation.RuleId], new SarifResult
{
RuleId = evaluation.RuleId,
Kind = evaluation.Passed ? ResultKind.Pass : ResultKind.Fail, // Check Passed property in case we support outputting passed results in future
Level = evaluation.Passed ? FailureLevel.None : GetLevelFromSeverity(evaluation.Severity),
Message = new Message { Id = "default" }, // should be customized message for each result
Locations = locations,
AnalysisTarget = analysisTarget,
});
totalResults++;
}
}
filesAlreadyOutput.AddRange(filesWithResults);
}