diff --git a/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryDiscardDesignation/CSharpRemoveUnnecessaryDiscardDesignationDiagnosticAnalyzer.cs b/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryDiscardDesignation/CSharpRemoveUnnecessaryDiscardDesignationDiagnosticAnalyzer.cs index 5f16decccd4c7..cc0345a5e0ff4 100644 --- a/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryDiscardDesignation/CSharpRemoveUnnecessaryDiscardDesignationDiagnosticAnalyzer.cs +++ b/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryDiscardDesignation/CSharpRemoveUnnecessaryDiscardDesignationDiagnosticAnalyzer.cs @@ -22,7 +22,6 @@ public CSharpRemoveUnnecessaryDiscardDesignationDiagnosticAnalyzer() : base(IDEDiagnosticIds.RemoveUnnecessaryDiscardDesignationDiagnosticId, EnforceOnBuildValues.RemoveUnnecessaryDiscardDesignation, option: null, - fadingOption: null, new LocalizableResourceString(nameof(CSharpAnalyzersResources.Remove_unnessary_discard), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)), new LocalizableResourceString(nameof(CSharpAnalyzersResources.Discard_can_be_removed), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources))) { diff --git a/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryLambdaExpression/CSharpRemoveUnnecessaryLambdaExpressionDiagnosticAnalyzer.cs b/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryLambdaExpression/CSharpRemoveUnnecessaryLambdaExpressionDiagnosticAnalyzer.cs index 09b8536d26371..d9bcdbeefe068 100644 --- a/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryLambdaExpression/CSharpRemoveUnnecessaryLambdaExpressionDiagnosticAnalyzer.cs +++ b/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryLambdaExpression/CSharpRemoveUnnecessaryLambdaExpressionDiagnosticAnalyzer.cs @@ -30,7 +30,6 @@ internal sealed class CSharpRemoveUnnecessaryLambdaExpressionDiagnosticAnalyzer( IDEDiagnosticIds.RemoveUnnecessaryLambdaExpressionDiagnosticId, EnforceOnBuildValues.RemoveUnnecessaryLambdaExpression, CSharpCodeStyleOptions.PreferMethodGroupConversion, - fadingOption: null, new LocalizableResourceString(nameof(CSharpAnalyzersResources.Remove_unnecessary_lambda_expression), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)), new LocalizableResourceString(nameof(CSharpAnalyzersResources.Lambda_expression_can_be_removed), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources))) { diff --git a/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryNullableDirective/CSharpRemoveRedundantNullableDirectiveDiagnosticAnalyzer.cs b/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryNullableDirective/CSharpRemoveRedundantNullableDirectiveDiagnosticAnalyzer.cs index 01f60a7845fc8..6ec3c6db3f64a 100644 --- a/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryNullableDirective/CSharpRemoveRedundantNullableDirectiveDiagnosticAnalyzer.cs +++ b/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryNullableDirective/CSharpRemoveRedundantNullableDirectiveDiagnosticAnalyzer.cs @@ -20,7 +20,6 @@ public CSharpRemoveRedundantNullableDirectiveDiagnosticAnalyzer() IDEDiagnosticIds.RemoveRedundantNullableDirectiveDiagnosticId, EnforceOnBuildValues.RemoveRedundantNullableDirective, option: null, - fadingOption: null, new LocalizableResourceString(nameof(CSharpAnalyzersResources.Remove_redundant_nullable_directive), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)), new LocalizableResourceString(nameof(CSharpAnalyzersResources.Nullable_directive_is_redundant), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources))) { diff --git a/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryNullableDirective/CSharpRemoveUnnecessaryNullableDirectiveDiagnosticAnalyzer.cs b/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryNullableDirective/CSharpRemoveUnnecessaryNullableDirectiveDiagnosticAnalyzer.cs index 544731492afc0..75c1c100b55bc 100644 --- a/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryNullableDirective/CSharpRemoveUnnecessaryNullableDirectiveDiagnosticAnalyzer.cs +++ b/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryNullableDirective/CSharpRemoveUnnecessaryNullableDirectiveDiagnosticAnalyzer.cs @@ -23,7 +23,6 @@ internal sealed class CSharpRemoveUnnecessaryNullableDirectiveDiagnosticAnalyzer : AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(IDEDiagnosticIds.RemoveUnnecessaryNullableDirectiveDiagnosticId, EnforceOnBuildValues.RemoveUnnecessaryNullableDirective, option: null, - fadingOption: null, new LocalizableResourceString(nameof(CSharpAnalyzersResources.Remove_unnecessary_nullable_directive), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)), new LocalizableResourceString(nameof(CSharpAnalyzersResources.Nullable_directive_is_unnecessary), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources))) { diff --git a/src/Analyzers/CSharp/Analyzers/RemoveUnnecessarySuppressions/CSharpRemoveUnnecessaryNullableWarningSuppressionsDiagnosticAnalyzer.cs b/src/Analyzers/CSharp/Analyzers/RemoveUnnecessarySuppressions/CSharpRemoveUnnecessaryNullableWarningSuppressionsDiagnosticAnalyzer.cs index 36810dbace4f3..9a1c4b8afb3af 100644 --- a/src/Analyzers/CSharp/Analyzers/RemoveUnnecessarySuppressions/CSharpRemoveUnnecessaryNullableWarningSuppressionsDiagnosticAnalyzer.cs +++ b/src/Analyzers/CSharp/Analyzers/RemoveUnnecessarySuppressions/CSharpRemoveUnnecessaryNullableWarningSuppressionsDiagnosticAnalyzer.cs @@ -15,7 +15,6 @@ internal sealed partial class CSharpRemoveUnnecessaryNullableWarningSuppressions IDEDiagnosticIds.RemoveUnnecessaryNullableWarningSuppression, EnforceOnBuildValues.RemoveUnnecessaryNullableWarningSuppression, option: null, - fadingOption: null, new LocalizableResourceString(nameof(AnalyzersResources.Remove_unnecessary_suppression), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)), new LocalizableResourceString(nameof(AnalyzersResources.Suppression_is_unnecessary), AnalyzersResources.ResourceManager, typeof(CompilerExtensionsResources))) { diff --git a/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryUnsafeModifier/CSharpRemoveUnnecessaryUnsafeModifierDiagnosticAnalyzer.cs b/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryUnsafeModifier/CSharpRemoveUnnecessaryUnsafeModifierDiagnosticAnalyzer.cs index e81c8d06efefd..76892f35e35b2 100644 --- a/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryUnsafeModifier/CSharpRemoveUnnecessaryUnsafeModifierDiagnosticAnalyzer.cs +++ b/src/Analyzers/CSharp/Analyzers/RemoveUnnecessaryUnsafeModifier/CSharpRemoveUnnecessaryUnsafeModifierDiagnosticAnalyzer.cs @@ -14,7 +14,6 @@ internal sealed partial class CSharpRemoveUnnecessaryUnsafeModifierDiagnosticAna IDEDiagnosticIds.RemoveUnnecessaryUnsafeModifier, EnforceOnBuildValues.RemoveUnnecessaryUnsafeModifier, option: null, - fadingOption: null, new LocalizableResourceString(nameof(AnalyzersResources.Remove_unnecessary_unsafe_modifier), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)), new LocalizableResourceString(nameof(AnalyzersResources.unsafe_modifier_is_unnecessary), AnalyzersResources.ResourceManager, typeof(CompilerExtensionsResources))) { diff --git a/src/Analyzers/CSharp/Analyzers/RemoveUnreachableCode/CSharpRemoveUnreachableCodeDiagnosticAnalyzer.cs b/src/Analyzers/CSharp/Analyzers/RemoveUnreachableCode/CSharpRemoveUnreachableCodeDiagnosticAnalyzer.cs index 2b5b01f7f4dcc..743b31ce1eb41 100644 --- a/src/Analyzers/CSharp/Analyzers/RemoveUnreachableCode/CSharpRemoveUnreachableCodeDiagnosticAnalyzer.cs +++ b/src/Analyzers/CSharp/Analyzers/RemoveUnreachableCode/CSharpRemoveUnreachableCodeDiagnosticAnalyzer.cs @@ -24,7 +24,6 @@ public CSharpRemoveUnreachableCodeDiagnosticAnalyzer() : base(IDEDiagnosticIds.RemoveUnreachableCodeDiagnosticId, EnforceOnBuildValues.RemoveUnreachableCode, option: null, - fadingOption: FadingOptions.FadeOutUnreachableCode, new LocalizableResourceString(nameof(CSharpAnalyzersResources.Unreachable_code_detected), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)), configurable: false) { diff --git a/src/Analyzers/CSharp/Analyzers/UseDefaultLiteral/CSharpUseDefaultLiteralDiagnosticAnalyzer.cs b/src/Analyzers/CSharp/Analyzers/UseDefaultLiteral/CSharpUseDefaultLiteralDiagnosticAnalyzer.cs index 0c146cd0ca9c7..e521c46d4913c 100644 --- a/src/Analyzers/CSharp/Analyzers/UseDefaultLiteral/CSharpUseDefaultLiteralDiagnosticAnalyzer.cs +++ b/src/Analyzers/CSharp/Analyzers/UseDefaultLiteral/CSharpUseDefaultLiteralDiagnosticAnalyzer.cs @@ -18,7 +18,6 @@ public CSharpUseDefaultLiteralDiagnosticAnalyzer() : base(IDEDiagnosticIds.UseDefaultLiteralDiagnosticId, EnforceOnBuildValues.UseDefaultLiteral, CSharpCodeStyleOptions.PreferSimpleDefaultExpression, - fadingOption: null, new LocalizableResourceString(nameof(CSharpAnalyzersResources.Simplify_default_expression), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)), new LocalizableResourceString(nameof(CSharpAnalyzersResources.default_expression_can_be_simplified), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources))) { diff --git a/src/Analyzers/Core/Analyzers/AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer.cs b/src/Analyzers/Core/Analyzers/AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer.cs index 922dc5ad9ff11..e7e0f673a93de 100644 --- a/src/Analyzers/Core/Analyzers/AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer.cs +++ b/src/Analyzers/Core/Analyzers/AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer.cs @@ -2,10 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System.Collections.Generic; using System.Collections.Immutable; -using System.Linq; -using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.CodeAnalysis.Options; namespace Microsoft.CodeAnalysis.CodeStyle; @@ -25,10 +22,6 @@ internal abstract class AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer : /// Code style option that can be used to configure the given . /// , if there is no such unique option. /// - /// - /// Per-language fading option that can be used to configure if the diagnostic should be faded in the IDE or not. - /// , if there is no such unique fading option. - /// /// Title for the diagnostic descriptor /// /// Message for the diagnostic descriptor. @@ -39,13 +32,11 @@ protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer( string diagnosticId, EnforceOnBuild enforceOnBuild, IOption2? option, - PerLanguageOption2? fadingOption, LocalizableString title, LocalizableString? messageFormat = null, bool configurable = true) : base(diagnosticId, enforceOnBuild, option, title, messageFormat, isUnnecessary: true, configurable) { - AddDiagnosticIdToFadingOptionMapping(diagnosticId, fadingOption); } /// @@ -57,10 +48,6 @@ protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer( /// /// Set of two or more per-language options that can be used to configure the diagnostic severity of the given diagnosticId. /// - /// - /// Per-language fading option that can be used to configure if the diagnostic should be faded in the IDE or not. - /// , if there is no such unique fading option. - /// /// Title for the diagnostic descriptor /// /// Message for the diagnostic descriptor. @@ -71,69 +58,35 @@ protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer( string diagnosticId, EnforceOnBuild enforceOnBuild, ImmutableHashSet options, - PerLanguageOption2? fadingOption, LocalizableString title, LocalizableString? messageFormat = null, bool configurable = true) : base(diagnosticId, enforceOnBuild, options, title, messageFormat, isUnnecessary: true, configurable) { - AddDiagnosticIdToFadingOptionMapping(diagnosticId, fadingOption); } /// - /// Constructor for an unnecessary code style analyzer with multiple descriptors. All unnecessary descriptors will share the same + /// Constructor for an unnecessary code style analyzer with multiple descriptors. /// /// Descriptors supported by this analyzer - /// The fading option used to control descriptors that are unnecessary. - protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(ImmutableArray descriptors, PerLanguageOption2 fadingOption) + protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(ImmutableArray descriptors) : base(descriptors) { - foreach (var descriptor in descriptors) - { - if (descriptor.CustomTags.Any(t => t == WellKnownDiagnosticTags.Unnecessary)) - { - AddDiagnosticIdToFadingOptionMapping(descriptor.Id, fadingOption); - } - } } /// /// Constructor for a code style analyzer with a multiple diagnostic descriptors with a code style options that can be used to configure each descriptor. /// - protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(ImmutableArray<(DiagnosticDescriptor Descriptor, IOption2 Option)> supportedDiagnosticsWithOptions, PerLanguageOption2? fadingOption) + protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(ImmutableArray<(DiagnosticDescriptor Descriptor, IOption2 Option)> supportedDiagnosticsWithOptions) : base(supportedDiagnosticsWithOptions) { - AddDescriptorsToFadingOptionMapping(supportedDiagnosticsWithOptions.Select(static item => item.Descriptor), fadingOption); } /// /// Constructor for a code style analyzer with multiple diagnostic descriptors with zero or more code style options that can be used to configure each descriptor. /// - protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(ImmutableArray<(DiagnosticDescriptor Descriptor, ImmutableHashSet Options)> supportedDiagnosticsWithOptions, PerLanguageOption2? fadingOption) + protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(ImmutableArray<(DiagnosticDescriptor Descriptor, ImmutableHashSet Options)> supportedDiagnosticsWithOptions) : base(supportedDiagnosticsWithOptions) { - AddDescriptorsToFadingOptionMapping(supportedDiagnosticsWithOptions.Select(static item => item.Descriptor), fadingOption); - } - - private static void AddDiagnosticIdToFadingOptionMapping(string diagnosticId, PerLanguageOption2? fadingOption) - { - if (fadingOption != null) - { - IDEDiagnosticIdToOptionMappingHelper.AddFadingOptionMapping(diagnosticId, fadingOption); - } - } - - private static void AddDescriptorsToFadingOptionMapping(IEnumerable descriptors, PerLanguageOption2? fadingOption) - { - if (fadingOption != null) - { - foreach (var descriptor in descriptors) - { - if (descriptor.CustomTags.Any(t => t == WellKnownDiagnosticTags.Unnecessary)) - { - IDEDiagnosticIdToOptionMappingHelper.AddFadingOptionMapping(descriptor.Id, fadingOption); - } - } - } } } diff --git a/src/Analyzers/Core/Analyzers/IDEDiagnosticIdToOptionMappingHelper.cs b/src/Analyzers/Core/Analyzers/IDEDiagnosticIdToOptionMappingHelper.cs index ab070b6da8c48..bab1761725b87 100644 --- a/src/Analyzers/Core/Analyzers/IDEDiagnosticIdToOptionMappingHelper.cs +++ b/src/Analyzers/Core/Analyzers/IDEDiagnosticIdToOptionMappingHelper.cs @@ -21,16 +21,12 @@ internal static class IDEDiagnosticIdToOptionMappingHelper { private static readonly ConcurrentDictionary> s_diagnosticIdToOptionMap = new(); private static readonly ConcurrentDictionary>> s_diagnosticIdToLanguageSpecificOptionsMap = new(); - private static readonly ConcurrentDictionary> s_diagnosticIdToFadingOptionMap = new(); public static bool TryGetMappedOptions(string diagnosticId, string language, [NotNullWhen(true)] out ImmutableHashSet? options) => s_diagnosticIdToOptionMap.TryGetValue(diagnosticId, out options) || (s_diagnosticIdToLanguageSpecificOptionsMap.TryGetValue(language, out var map) && map.TryGetValue(diagnosticId, out options)); - public static bool TryGetMappedFadingOption(string diagnosticId, [NotNullWhen(true)] out PerLanguageOption2? fadingOption) - => s_diagnosticIdToFadingOptionMap.TryGetValue(diagnosticId, out fadingOption); - public static ImmutableHashSet KnownIDEDiagnosticIds => [.. s_diagnosticIdToOptionMap.Keys, .. s_diagnosticIdToLanguageSpecificOptionsMap.Values.SelectMany(map => map.Keys)]; @@ -89,16 +85,4 @@ private static void AddOptionMapping(ConcurrentDictionary fadingOption) - { - diagnosticId = diagnosticId ?? throw new ArgumentNullException(nameof(diagnosticId)); - fadingOption = fadingOption ?? throw new ArgumentNullException(nameof(fadingOption)); - - // Verify that the option is either being added for the first time, or the existing option is already the same. - // Latter can happen in tests as we re-instantiate the analyzer for every test, which attempts to add the mapping every time. - Debug.Assert(!s_diagnosticIdToFadingOptionMap.TryGetValue(diagnosticId, out var existingOption) || existingOption.Equals(fadingOption)); - - s_diagnosticIdToFadingOptionMap.TryAdd(diagnosticId, fadingOption); - } } diff --git a/src/Analyzers/Core/Analyzers/IDEDiagnosticIds.cs b/src/Analyzers/Core/Analyzers/IDEDiagnosticIds.cs index f91bfe6051c70..6875e9a3fef22 100644 --- a/src/Analyzers/Core/Analyzers/IDEDiagnosticIds.cs +++ b/src/Analyzers/Core/Analyzers/IDEDiagnosticIds.cs @@ -12,7 +12,10 @@ internal static class IDEDiagnosticIds public const string SimplifyMemberAccessDiagnosticId = "IDE0002"; public const string RemoveThisOrMeQualificationDiagnosticId = "IDE0003"; public const string RemoveUnnecessaryCastDiagnosticId = "IDE0004"; + public const string RemoveUnnecessaryImportsDiagnosticId = "IDE0005"; + public const string RemoveUnnecessaryImportsGeneratedCodeDiagnosticId = RemoveUnnecessaryImportsDiagnosticId + "_gen"; + public const string IntellisenseBuildFailedDiagnosticId = "IDE0006"; public const string UseImplicitTypeDiagnosticId = "IDE0007"; public const string UseExplicitTypeDiagnosticId = "IDE0008"; diff --git a/src/Analyzers/Core/Analyzers/RemoveUnnecessaryCast/AbstractRemoveUnnecessaryCastDiagnosticAnalyzer.cs b/src/Analyzers/Core/Analyzers/RemoveUnnecessaryCast/AbstractRemoveUnnecessaryCastDiagnosticAnalyzer.cs index 540a073cf8501..c626efcc8fbfb 100644 --- a/src/Analyzers/Core/Analyzers/RemoveUnnecessaryCast/AbstractRemoveUnnecessaryCastDiagnosticAnalyzer.cs +++ b/src/Analyzers/Core/Analyzers/RemoveUnnecessaryCast/AbstractRemoveUnnecessaryCastDiagnosticAnalyzer.cs @@ -21,7 +21,6 @@ protected AbstractRemoveUnnecessaryCastDiagnosticAnalyzer() : base(IDEDiagnosticIds.RemoveUnnecessaryCastDiagnosticId, EnforceOnBuildValues.RemoveUnnecessaryCast, option: null, - fadingOption: null, new LocalizableResourceString(nameof(AnalyzersResources.Remove_Unnecessary_Cast), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)), new LocalizableResourceString(nameof(CompilerExtensionsResources.Cast_is_redundant), CompilerExtensionsResources.ResourceManager, typeof(CompilerExtensionsResources))) { diff --git a/src/Analyzers/Core/Analyzers/RemoveUnnecessaryImports/AbstractRemoveUnnecessaryImportsDiagnosticAnalyzer.cs b/src/Analyzers/Core/Analyzers/RemoveUnnecessaryImports/AbstractRemoveUnnecessaryImportsDiagnosticAnalyzer.cs index 7c8df9538f1e3..466d9d23ddde0 100644 --- a/src/Analyzers/Core/Analyzers/RemoveUnnecessaryImports/AbstractRemoveUnnecessaryImportsDiagnosticAnalyzer.cs +++ b/src/Analyzers/Core/Analyzers/RemoveUnnecessaryImports/AbstractRemoveUnnecessaryImportsDiagnosticAnalyzer.cs @@ -47,7 +47,7 @@ internal abstract class AbstractRemoveUnnecessaryImportsDiagnosticAnalyzer GetDescriptors(LocalizableString titleAndMessage, out DiagnosticDescriptor classificationIdDescriptor, out DiagnosticDescriptor generatedCodeClassificationIdDescriptor) { classificationIdDescriptor = CreateDescriptorWithId(IDEDiagnosticIds.RemoveUnnecessaryImportsDiagnosticId, EnforceOnBuildValues.RemoveUnnecessaryImports, hasAnyCodeStyleOption: false, titleAndMessage, isUnnecessary: true); - generatedCodeClassificationIdDescriptor = CreateDescriptorWithId(IDEDiagnosticIds.RemoveUnnecessaryImportsDiagnosticId + "_gen", EnforceOnBuild.Never, hasAnyCodeStyleOption: false, titleAndMessage, isUnnecessary: true, isConfigurable: false); + generatedCodeClassificationIdDescriptor = CreateDescriptorWithId(IDEDiagnosticIds.RemoveUnnecessaryImportsGeneratedCodeDiagnosticId, EnforceOnBuild.Never, hasAnyCodeStyleOption: false, titleAndMessage, isUnnecessary: true, isConfigurable: false); return [ s_fixableIdDescriptor, diff --git a/src/Analyzers/Core/Analyzers/RemoveUnnecessaryParentheses/AbstractRemoveUnnecessaryParenthesesDiagnosticAnalyzer.cs b/src/Analyzers/Core/Analyzers/RemoveUnnecessaryParentheses/AbstractRemoveUnnecessaryParenthesesDiagnosticAnalyzer.cs index 7565ffc800089..99688921b5270 100644 --- a/src/Analyzers/Core/Analyzers/RemoveUnnecessaryParentheses/AbstractRemoveUnnecessaryParenthesesDiagnosticAnalyzer.cs +++ b/src/Analyzers/Core/Analyzers/RemoveUnnecessaryParentheses/AbstractRemoveUnnecessaryParenthesesDiagnosticAnalyzer.cs @@ -25,7 +25,6 @@ protected AbstractRemoveUnnecessaryParenthesesDiagnosticAnalyzer() : base(IDEDiagnosticIds.RemoveUnnecessaryParenthesesDiagnosticId, EnforceOnBuildValues.RemoveUnnecessaryParentheses, options: ParenthesesDiagnosticAnalyzersHelper.Options, - fadingOption: null, new LocalizableResourceString(nameof(AnalyzersResources.Remove_unnecessary_parentheses), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)), new LocalizableResourceString(nameof(AnalyzersResources.Parentheses_can_be_removed), AnalyzersResources.ResourceManager, typeof(AnalyzersResources))) { diff --git a/src/Analyzers/Core/Analyzers/RemoveUnusedMembers/AbstractRemoveUnusedMembersDiagnosticAnalyzer.cs b/src/Analyzers/Core/Analyzers/RemoveUnusedMembers/AbstractRemoveUnusedMembersDiagnosticAnalyzer.cs index 36023f6ce699e..80a1dac516783 100644 --- a/src/Analyzers/Core/Analyzers/RemoveUnusedMembers/AbstractRemoveUnusedMembersDiagnosticAnalyzer.cs +++ b/src/Analyzers/Core/Analyzers/RemoveUnusedMembers/AbstractRemoveUnusedMembersDiagnosticAnalyzer.cs @@ -27,8 +27,7 @@ internal abstract class AbstractRemoveUnusedMembersDiagnosticAnalyzer< TTypeDeclarationSyntax, TMemberDeclarationSyntax>() : AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer( - [s_removeUnusedMembersRule, s_removeUnreadMembersRule], - FadingOptions.FadeOutUnusedMembers) + [s_removeUnusedMembersRule, s_removeUnreadMembersRule]) where TDocumentationCommentTriviaSyntax : SyntaxNode where TIdentifierNameSyntax : SyntaxNode where TTypeDeclarationSyntax : TMemberDeclarationSyntax diff --git a/src/Analyzers/Core/Analyzers/RemoveUnusedParametersAndValues/AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.cs b/src/Analyzers/Core/Analyzers/RemoveUnusedParametersAndValues/AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.cs index f71da73217fa4..27af11fc52973 100644 --- a/src/Analyzers/Core/Analyzers/RemoveUnusedParametersAndValues/AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.cs +++ b/src/Analyzers/Core/Analyzers/RemoveUnusedParametersAndValues/AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.cs @@ -100,8 +100,7 @@ protected AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer( (s_expressionValueIsUnusedRule, unusedValueExpressionStatementOption), (s_valueAssignedIsUnusedRule, unusedValueAssignmentOption), (s_unusedParameterRule, CodeStyleOptions2.UnusedParameters) - ], - fadingOption: null) + ]) { } diff --git a/src/Analyzers/Core/Analyzers/SimplifyInterpolation/AbstractSimplifyInterpolationDiagnosticAnalyzer.cs b/src/Analyzers/Core/Analyzers/SimplifyInterpolation/AbstractSimplifyInterpolationDiagnosticAnalyzer.cs index b24f3b83f3381..ffc42d2c3f395 100644 --- a/src/Analyzers/Core/Analyzers/SimplifyInterpolation/AbstractSimplifyInterpolationDiagnosticAnalyzer.cs +++ b/src/Analyzers/Core/Analyzers/SimplifyInterpolation/AbstractSimplifyInterpolationDiagnosticAnalyzer.cs @@ -17,7 +17,6 @@ internal abstract class AbstractSimplifyInterpolationDiagnosticAnalyzer< TExpressionSyntax>() : AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(IDEDiagnosticIds.SimplifyInterpolationId, EnforceOnBuildValues.SimplifyInterpolation, CodeStyleOptions2.PreferSimplifiedInterpolation, - fadingOption: null, new LocalizableResourceString(nameof(AnalyzersResources.Simplify_interpolation), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)), new LocalizableResourceString(nameof(AnalyzersResources.Interpolation_can_be_simplified), AnalyzersResources.ResourceManager, typeof(AnalyzersResources))) where TInterpolationSyntax : SyntaxNode diff --git a/src/Analyzers/Core/Analyzers/SimplifyTypeNames/SimplifyTypeNamesDiagnosticAnalyzerBase.cs b/src/Analyzers/Core/Analyzers/SimplifyTypeNames/SimplifyTypeNamesDiagnosticAnalyzerBase.cs index 0d428287adffe..9c6402bd71b11 100644 --- a/src/Analyzers/Core/Analyzers/SimplifyTypeNames/SimplifyTypeNamesDiagnosticAnalyzerBase.cs +++ b/src/Analyzers/Core/Analyzers/SimplifyTypeNames/SimplifyTypeNamesDiagnosticAnalyzerBase.cs @@ -57,8 +57,7 @@ protected SimplifyTypeNamesDiagnosticAnalyzerBase() CodeStyleOptions2.PreferIntrinsicPredefinedTypeKeywordInDeclaration, CodeStyleOptions2.PreferIntrinsicPredefinedTypeKeywordInMemberAccess, ]) - ], - fadingOption: null) + ]) { } diff --git a/src/Analyzers/Core/Analyzers/UseInferredMemberName/AbstractUseInferredMemberNameDiagnosticAnalyzer.cs b/src/Analyzers/Core/Analyzers/UseInferredMemberName/AbstractUseInferredMemberNameDiagnosticAnalyzer.cs index fe3d46a82ad42..0d78a8c99913c 100644 --- a/src/Analyzers/Core/Analyzers/UseInferredMemberName/AbstractUseInferredMemberNameDiagnosticAnalyzer.cs +++ b/src/Analyzers/Core/Analyzers/UseInferredMemberName/AbstractUseInferredMemberNameDiagnosticAnalyzer.cs @@ -15,7 +15,6 @@ public AbstractUseInferredMemberNameDiagnosticAnalyzer() : base(IDEDiagnosticIds.UseInferredMemberNameDiagnosticId, EnforceOnBuildValues.UseInferredMemberName, options: [CodeStyleOptions2.PreferInferredAnonymousTypeMemberNames, CodeStyleOptions2.PreferInferredTupleNames], - fadingOption: null, new LocalizableResourceString(nameof(AnalyzersResources.Use_inferred_member_name), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)), new LocalizableResourceString(nameof(AnalyzersResources.Member_name_can_be_simplified), AnalyzersResources.ResourceManager, typeof(AnalyzersResources))) { diff --git a/src/Analyzers/Core/CodeFixes/CodeFixes.projitems b/src/Analyzers/Core/CodeFixes/CodeFixes.projitems index f834431567d47..37941d0485f25 100644 --- a/src/Analyzers/Core/CodeFixes/CodeFixes.projitems +++ b/src/Analyzers/Core/CodeFixes/CodeFixes.projitems @@ -107,6 +107,7 @@ + diff --git a/src/Analyzers/Core/CodeFixes/Options/FadingOptions.cs b/src/Analyzers/Core/CodeFixes/Options/FadingOptions.cs new file mode 100644 index 0000000000000..c19206ac833ce --- /dev/null +++ b/src/Analyzers/Core/CodeFixes/Options/FadingOptions.cs @@ -0,0 +1,32 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; +using Microsoft.CodeAnalysis.Diagnostics; +using Microsoft.CodeAnalysis.Options; + +namespace Microsoft.CodeAnalysis.CodeStyle; + +internal static class FadingOptions +{ + public static readonly PerLanguageOption2 FadeOutUnusedImports = new("dotnet_fade_out_unused_imports", defaultValue: true); + public static readonly PerLanguageOption2 FadeOutUnusedMembers = new("dotnet_fade_out_unused_members", defaultValue: true); + public static readonly PerLanguageOption2 FadeOutUnreachableCode = new("dotnet_fade_out_unreachable_code", defaultValue: true); + + // When adding a new fading option, be sure to update dictionary below with apppropriate diagnostic id mapping. + + private static readonly ImmutableDictionary> s_diagnosticToFadingOption = new Dictionary> + { + { IDEDiagnosticIds.RemoveUnusedMembersDiagnosticId, FadeOutUnusedMembers }, + { IDEDiagnosticIds.RemoveUnreadMembersDiagnosticId, FadeOutUnusedMembers }, + { IDEDiagnosticIds.RemoveUnreachableCodeDiagnosticId, FadeOutUnreachableCode }, + { IDEDiagnosticIds.RemoveUnnecessaryImportsDiagnosticId, FadeOutUnusedImports }, + { IDEDiagnosticIds.RemoveUnnecessaryImportsGeneratedCodeDiagnosticId, FadeOutUnusedImports }, + }.ToImmutableDictionary(); + + public static bool TryGetFadingOptionForDiagnostic(string diagnosticId, [NotNullWhen(true)] out PerLanguageOption2? fadingOption) + => s_diagnosticToFadingOption.TryGetValue(diagnosticId, out fadingOption); +} diff --git a/src/Analyzers/VisualBasic/Analyzers/RemoveUnnecessaryByVal/VisualBasicRemoveUnnecessaryByValDiagnosticAnalyzer.vb b/src/Analyzers/VisualBasic/Analyzers/RemoveUnnecessaryByVal/VisualBasicRemoveUnnecessaryByValDiagnosticAnalyzer.vb index 10b7de28599e6..4b4518deaa3d6 100644 --- a/src/Analyzers/VisualBasic/Analyzers/RemoveUnnecessaryByVal/VisualBasicRemoveUnnecessaryByValDiagnosticAnalyzer.vb +++ b/src/Analyzers/VisualBasic/Analyzers/RemoveUnnecessaryByVal/VisualBasicRemoveUnnecessaryByValDiagnosticAnalyzer.vb @@ -16,7 +16,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.RemoveUnnecessaryByVal diagnosticId:=IDEDiagnosticIds.RemoveUnnecessaryByValDiagnosticId, enforceOnBuild:=EnforceOnBuildValues.RemoveUnnecessaryByVal, [option]:=Nothing, - fadingOption:=Nothing, title:=New LocalizableResourceString(NameOf(VisualBasicAnalyzersResources.Remove_ByVal), VisualBasicAnalyzersResources.ResourceManager, GetType(VisualBasicAnalyzersResources))) End Sub diff --git a/src/Features/Core/Portable/SimplifyThisOrMe/AbstractSimplifyThisOrMeDiagnosticAnalyzer.cs b/src/Features/Core/Portable/SimplifyThisOrMe/AbstractSimplifyThisOrMeDiagnosticAnalyzer.cs index 6496d508f90cb..77955f653376a 100644 --- a/src/Features/Core/Portable/SimplifyThisOrMe/AbstractSimplifyThisOrMeDiagnosticAnalyzer.cs +++ b/src/Features/Core/Portable/SimplifyThisOrMe/AbstractSimplifyThisOrMeDiagnosticAnalyzer.cs @@ -31,7 +31,6 @@ protected AbstractSimplifyThisOrMeDiagnosticAnalyzer() CodeStyleOptions2.QualifyMethodAccess, CodeStyleOptions2.QualifyEventAccess, ], - fadingOption: null, new LocalizableResourceString(nameof(FeaturesResources.Remove_qualification), FeaturesResources.ResourceManager, typeof(FeaturesResources)), new LocalizableResourceString(nameof(AnalyzersResources.Name_can_be_simplified), AnalyzersResources.ResourceManager, typeof(AnalyzersResources))) { diff --git a/src/LanguageServer/Protocol/Extensions/ProtocolConversions.Diagnostics.cs b/src/LanguageServer/Protocol/Extensions/ProtocolConversions.Diagnostics.cs index 4d7216e45b5b0..fd7afb65c56d2 100644 --- a/src/LanguageServer/Protocol/Extensions/ProtocolConversions.Diagnostics.cs +++ b/src/LanguageServer/Protocol/Extensions/ProtocolConversions.Diagnostics.cs @@ -2,8 +2,10 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; +using Microsoft.CodeAnalysis.CodeStyle; using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.CodeAnalysis.LanguageServer.Features.Diagnostics; using Microsoft.CodeAnalysis.LanguageServer.Handler.Diagnostics; @@ -52,9 +54,11 @@ internal static ImmutableArray AddBuildTagIfNotPresent(Immutable } // DiagnosticId supports fading, check if the corresponding VS option is turned on. - if (!SupportsFadingOption(diagnosticData, globalOptionService)) + if (FadingOptions.TryGetFadingOptionForDiagnostic(diagnosticData.Id, out var fadingOption)) { - return [diagnostic]; + Contract.ThrowIfNull(diagnosticData.Language, $"diagnostic {diagnosticData.Id} is missing a language"); + if (!globalOptionService.GetOption(fadingOption, diagnosticData.Language)) + return [diagnostic]; } // Check to see if there are specific locations marked to fade. @@ -266,15 +270,4 @@ private static DiagnosticTag[] ConvertTags(DiagnosticData diagnosticData, bool p return result.ToArray(); } - - private static bool SupportsFadingOption(DiagnosticData diagnosticData, IGlobalOptionService globalOptionService) - { - if (IDEDiagnosticIdToOptionMappingHelper.TryGetMappedFadingOption(diagnosticData.Id, out var fadingOption)) - { - Contract.ThrowIfNull(diagnosticData.Language, $"diagnostic {diagnosticData.Id} is missing a language"); - return globalOptionService.GetOption(fadingOption, diagnosticData.Language); - } - - return true; - } } diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/CodeStyle/FadingOptions.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/CodeStyle/FadingOptions.cs deleted file mode 100644 index a53cb54f98835..0000000000000 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/CodeStyle/FadingOptions.cs +++ /dev/null @@ -1,14 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using Microsoft.CodeAnalysis.Options; - -namespace Microsoft.CodeAnalysis.CodeStyle; - -internal static class FadingOptions -{ - public static readonly PerLanguageOption2 FadeOutUnusedImports = new("dotnet_fade_out_unused_imports", defaultValue: true); - public static readonly PerLanguageOption2 FadeOutUnusedMembers = new("dotnet_fade_out_unused_members", defaultValue: true); - public static readonly PerLanguageOption2 FadeOutUnreachableCode = new("dotnet_fade_out_unreachable_code", defaultValue: true); -} diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/CompilerExtensions.projitems b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/CompilerExtensions.projitems index b89f612deef4a..b051c4f56184f 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/CompilerExtensions.projitems +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/CompilerExtensions.projitems @@ -144,7 +144,6 @@ -