internal static bool IsAnalyzerSuppressed(this CompilationOptions compilationOptions, DiagnosticDescriptor descriptor)
        {
            switch (descriptor.GetEffectiveSeverity(compilationOptions))
            {
            case ReportDiagnostic.Suppress:
                return(true);

            case ReportDiagnostic.Default:
                throw new InvalidOperationException("This should be unreachable.");

            default:
                return(false);
            }
        }
Esempio n. 2
0
        internal ReportDiagnostic GetEffectiveSeverity(DiagnosticDescriptor descriptor, CompilationOptions compilationOptions)
        {
            ReportDiagnostic reportDiagnostic = descriptor.GetEffectiveSeverity(compilationOptions);

            if (reportDiagnostic == ReportDiagnostic.Suppress)
            {
                return(reportDiagnostic);
            }

            if (reportDiagnostic.ToDiagnosticSeverity() < SeverityLevel)
            {
                return(ReportDiagnostic.Suppress);
            }

            return(reportDiagnostic);
        }
        /// <summary>
        /// Gets project-level effective severity of the given <paramref name="descriptor"/> accounting for severity configurations from both the following sources:
        /// 1. Compilation options from ruleset file, if any, and command line options such as /nowarn, /warnaserror, etc.
        /// 2. Analyzer config documents at the project root directory or in ancestor directories.
        /// </summary>
        public static ReportDiagnostic GetEffectiveSeverity(this DiagnosticDescriptor descriptor, CompilationOptions compilationOptions, ImmutableDictionary <string, ReportDiagnostic> analyzerConfigSpecificDiagnosticOptions)
        {
            var effectiveSeverity = descriptor.GetEffectiveSeverity(compilationOptions);

            // Apply analyzer config options on top of compilation options, unless the diagnostic is explicitly suppressed by compilation options (/nowarn).
            var isSuppressedByCompilationOptions = effectiveSeverity == ReportDiagnostic.Suppress &&
                                                   compilationOptions.SpecificDiagnosticOptions.ContainsKey(descriptor.Id);

            if (!isSuppressedByCompilationOptions &&
                analyzerConfigSpecificDiagnosticOptions.TryGetValue(descriptor.Id, out var reportDiagnostic))
            {
                effectiveSeverity = reportDiagnostic;
            }

            return(effectiveSeverity);
        }
        /// <summary>
        /// Gets project-level effective severity of the given <paramref name="descriptor"/> accounting for severity configurations from both the following sources:
        /// 1. Compilation options from ruleset file, if any, and command line options such as /nowarn, /warnaserror, etc.
        /// 2. Analyzer config documents at the project root directory or in ancestor directories.
        /// </summary>
        public static ReportDiagnostic GetEffectiveSeverity(this DiagnosticDescriptor descriptor, CompilationOptions compilationOptions, AnalyzerConfigOptionsResult?analyzerConfigOptions)
        {
            var effectiveSeverity = descriptor.GetEffectiveSeverity(compilationOptions);

            // Apply analyzer config options on top of compilation options.
            // Note that they override any diagnostic settings from compilation options (/nowarn, /warnaserror).
            if (analyzerConfigOptions.HasValue)
            {
                if (analyzerConfigOptions.Value.TreeOptions.TryGetValue(descriptor.Id, out var reportDiagnostic) && reportDiagnostic != ReportDiagnostic.Default ||
                    TryGetSeverityFromBulkConfiguration(descriptor, analyzerConfigOptions.Value, out reportDiagnostic))
                {
                    Debug.Assert(reportDiagnostic != ReportDiagnostic.Default);
                    effectiveSeverity = reportDiagnostic;
                }
            }

            return(effectiveSeverity);
        }
Esempio n. 5
0
        /// <summary>
        /// Gets project-level effective severity of the given <paramref name="descriptor"/> accounting for severity configurations from both the following sources:
        /// 1. Compilation options from ruleset file, if any, and command line options such as /nowarn, /warnaserror, etc.
        /// 2. Analyzer config documents at the project root directory or in ancestor directories.
        /// </summary>
        public static ReportDiagnostic GetEffectiveSeverity(this DiagnosticDescriptor descriptor, CompilationOptions compilationOptions, AnalyzerConfigOptionsResult?analyzerConfigOptions)
        {
            var effectiveSeverity = descriptor.GetEffectiveSeverity(compilationOptions);

            // Apply analyzer config options, unless configured with a non-default value in compilation options.
            // Note that compilation options (/nowarn, /warnaserror) override analyzer config options.
            if (analyzerConfigOptions.HasValue &&
                (!compilationOptions.SpecificDiagnosticOptions.TryGetValue(descriptor.Id, out var reportDiagnostic) ||
                 reportDiagnostic == ReportDiagnostic.Default))
            {
                if (analyzerConfigOptions.Value.TreeOptions.TryGetValue(descriptor.Id, out reportDiagnostic) && reportDiagnostic != ReportDiagnostic.Default ||
                    TryGetSeverityFromBulkConfiguration(descriptor, analyzerConfigOptions.Value, out reportDiagnostic))
                {
                    Debug.Assert(reportDiagnostic != ReportDiagnostic.Default);
                    effectiveSeverity = reportDiagnostic;
                }
            }

            return(effectiveSeverity);
        }
Esempio n. 6
0
 private static bool IsEnabled(CompilationOptions options, DiagnosticDescriptor diagnosticDescriptor) =>
 diagnosticDescriptor.GetEffectiveSeverity(options) != ReportDiagnostic.Suppress;
Esempio n. 7
0
 private static ReportDiagnostic GetEffectiveSeverity(DiagnosticDescriptor descriptor, CompilationOptions options)
 {
     return(options == null
         ? MapSeverityToReport(descriptor.DefaultSeverity)
         : descriptor.GetEffectiveSeverity(options));
 }
 private static void TestEffectiveSeverity(
     DiagnosticSeverity defaultSeverity,
     ReportDiagnostic expectedEffectiveSeverity,
     Dictionary<string, ReportDiagnostic> specificOptions = null,
     ReportDiagnostic generalOption = ReportDiagnostic.Default,
     bool isEnabledByDefault = true)
 {
     specificOptions = specificOptions ?? new Dictionary<string, ReportDiagnostic>();
     var options = new CSharpCompilationOptions(OutputKind.ConsoleApplication, generalDiagnosticOption: generalOption, specificDiagnosticOptions: specificOptions);
     var descriptor = new DiagnosticDescriptor(id: "Test0001", title: "Test0001", messageFormat: "Test0001", category: "Test0001", defaultSeverity: defaultSeverity, isEnabledByDefault: isEnabledByDefault);
     var effectiveSeverity = descriptor.GetEffectiveSeverity(options);
     Assert.Equal(expectedEffectiveSeverity, effectiveSeverity);
 }
 private static ReportDiagnostic GetEffectiveSeverity(DiagnosticDescriptor descriptor, CompilationOptions options)
 {
     return options == null
         ? MapSeverityToReport(descriptor.DefaultSeverity)
         : descriptor.GetEffectiveSeverity(options);
 }
Esempio n. 10
0
 public static ReportDiagnostic GetEffectiveSeverity(this DiagnosticDescriptor descriptor, CompilationOptions options)
 {
     return(options == null
         ? descriptor.DefaultSeverity.ToReportDiagnostic()
         : descriptor.GetEffectiveSeverity(options));
 }
Esempio n. 11
0
 /// <summary>
 /// Gets project-level effective severity of the given <paramref name="descriptor"/> accounting for severity configurations from both the following sources:
 /// 1. Compilation options from ruleset file, if any, and command line options such as /nowarn, /warnaserror, etc.
 /// 2. Analyzer config documents at the project root directory or in ancestor directories.
 /// </summary>
 public static ReportDiagnostic GetEffectiveSeverity(this DiagnosticDescriptor descriptor, Project project)
 => descriptor.GetEffectiveSeverity(project.CompilationOptions, project.GetAnalyzerConfigSpecialDiagnosticOptions());