private static int LogDiagnostics( ImmutableArray <Diagnostic> diagnostics, ParsedOptions parsedOptions, ConcurrentDictionary <string, DiagnosticDescriptor> descriptors, SarifV2ErrorLogger logger) { var count = 0; foreach (var diag in diagnostics) { var d = diag; // Second pass. Analyzers may support more than one diagnostic. // Filter excluded diagnostics. if (parsedOptions.excludeWarnings.Contains(d.Id)) { continue; } else if (parsedOptions.includeWarnings.Any() && !parsedOptions.includeWarnings.Contains(d.Id)) { continue; } ++count; // fix locations for diagnostics from additional files if (d.Location == Location.None) { var match = WebConfigMessageRegex.Matches(d.GetMessage()); if (match.Count > 1) { throw new Exception("Unexpected"); } if (match.Count != 0) { if (!descriptors.TryGetValue(d.Id, out var descr)) { var msg = $"{match[0].Groups[1].Value}."; descr = new DiagnosticDescriptor(d.Id, msg, msg, d.Descriptor.Category, d.Severity, d.Descriptor.IsEnabledByDefault); descriptors.TryAdd(d.Id, descr); } var line = new LinePosition(int.Parse(match[0].Groups[3].Value) - 1, 0); var capture = match[0].Groups[4].Value.TrimEnd('.'); d = Diagnostic.Create(descr, Location.Create(match[0].Groups[2].Value, new TextSpan(0, capture.Length), new LinePositionSpan(line, line))); } } if (parsedOptions.cwe) { var cwe = LocaleUtil.GetLocalString($"{d.Id}_cwe"); var msg = d.ToString(); if (!cwe.ToString().StartsWith("??")) // overall all IDs must have corresponding CWE, but some are special like SCS0000 { msg = msg.Replace($"{d.Id}:", $"{d.Id}: CWE-{cwe}:"); } Console.WriteLine($"Found: {msg}"); } else { Console.WriteLine($"Found: {d}"); } if (logger != null) { logger.LogDiagnostic(d, null); } } return(count); }