Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ public CSharpRemoveUnnecessaryDiscardDesignationDiagnosticAnalyzer()
: base(IDEDiagnosticIds.RemoveUnnecessaryDiscardDesignationDiagnosticId,
EnforceOnBuildValues.RemoveUnnecessaryDiscardDesignation,
option: null,
fadingOption: null,
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i always disliked how these options were being handled. now is a good opportunity to rip it all out since it broke anyways.

new LocalizableResourceString(nameof(CSharpAnalyzersResources.Remove_unnessary_discard), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Discard_can_be_removed), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -25,10 +22,6 @@ internal abstract class AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer :
/// Code style option that can be used to configure the given <paramref name="diagnosticId"/>.
/// <see langword="null"/>, if there is no such unique option.
/// </param>
/// <param name="fadingOption">
/// Per-language fading option that can be used to configure if the diagnostic should be faded in the IDE or not.
/// <see langword="null"/>, if there is no such unique fading option.
/// </param>
/// <param name="title">Title for the diagnostic descriptor</param>
/// <param name="messageFormat">
/// Message for the diagnostic descriptor.
Expand All @@ -39,13 +32,11 @@ protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(
string diagnosticId,
EnforceOnBuild enforceOnBuild,
IOption2? option,
PerLanguageOption2<bool>? fadingOption,
LocalizableString title,
LocalizableString? messageFormat = null,
bool configurable = true)
: base(diagnosticId, enforceOnBuild, option, title, messageFormat, isUnnecessary: true, configurable)
{
AddDiagnosticIdToFadingOptionMapping(diagnosticId, fadingOption);
}

/// <summary>
Expand All @@ -57,10 +48,6 @@ protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(
/// <param name="options">
/// Set of two or more per-language options that can be used to configure the diagnostic severity of the given diagnosticId.
/// </param>
/// <param name="fadingOption">
/// Per-language fading option that can be used to configure if the diagnostic should be faded in the IDE or not.
/// <see langword="null"/>, if there is no such unique fading option.
/// </param>
/// <param name="title">Title for the diagnostic descriptor</param>
/// <param name="messageFormat">
/// Message for the diagnostic descriptor.
Expand All @@ -71,69 +58,35 @@ protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(
string diagnosticId,
EnforceOnBuild enforceOnBuild,
ImmutableHashSet<IOption2> options,
PerLanguageOption2<bool>? fadingOption,
LocalizableString title,
LocalizableString? messageFormat = null,
bool configurable = true)
: base(diagnosticId, enforceOnBuild, options, title, messageFormat, isUnnecessary: true, configurable)
{
AddDiagnosticIdToFadingOptionMapping(diagnosticId, fadingOption);
}

/// <summary>
/// Constructor for an unnecessary code style analyzer with multiple descriptors. All unnecessary descriptors will share the same <paramref name="fadingOption"/>
/// Constructor for an unnecessary code style analyzer with multiple descriptors.
/// </summary>
/// <param name="descriptors">Descriptors supported by this analyzer</param>
/// <param name="fadingOption">The fading option used to control descriptors that are unnecessary.</param>
protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(ImmutableArray<DiagnosticDescriptor> descriptors, PerLanguageOption2<bool> fadingOption)
protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(ImmutableArray<DiagnosticDescriptor> descriptors)
: base(descriptors)
{
foreach (var descriptor in descriptors)
{
if (descriptor.CustomTags.Any(t => t == WellKnownDiagnosticTags.Unnecessary))
{
AddDiagnosticIdToFadingOptionMapping(descriptor.Id, fadingOption);
}
}
}

/// <summary>
/// Constructor for a code style analyzer with a multiple diagnostic descriptors with a code style options that can be used to configure each descriptor.
/// </summary>
protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(ImmutableArray<(DiagnosticDescriptor Descriptor, IOption2 Option)> supportedDiagnosticsWithOptions, PerLanguageOption2<bool>? fadingOption)
protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(ImmutableArray<(DiagnosticDescriptor Descriptor, IOption2 Option)> supportedDiagnosticsWithOptions)
: base(supportedDiagnosticsWithOptions)
{
AddDescriptorsToFadingOptionMapping(supportedDiagnosticsWithOptions.Select(static item => item.Descriptor), fadingOption);
}

/// <summary>
/// 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.
/// </summary>
protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(ImmutableArray<(DiagnosticDescriptor Descriptor, ImmutableHashSet<IOption2> Options)> supportedDiagnosticsWithOptions, PerLanguageOption2<bool>? fadingOption)
protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(ImmutableArray<(DiagnosticDescriptor Descriptor, ImmutableHashSet<IOption2> Options)> supportedDiagnosticsWithOptions)
: base(supportedDiagnosticsWithOptions)
{
AddDescriptorsToFadingOptionMapping(supportedDiagnosticsWithOptions.Select(static item => item.Descriptor), fadingOption);
}

private static void AddDiagnosticIdToFadingOptionMapping(string diagnosticId, PerLanguageOption2<bool>? fadingOption)
{
if (fadingOption != null)
{
IDEDiagnosticIdToOptionMappingHelper.AddFadingOptionMapping(diagnosticId, fadingOption);
}
}

private static void AddDescriptorsToFadingOptionMapping(IEnumerable<DiagnosticDescriptor> descriptors, PerLanguageOption2<bool>? fadingOption)
{
if (fadingOption != null)
{
foreach (var descriptor in descriptors)
{
if (descriptor.CustomTags.Any(t => t == WellKnownDiagnosticTags.Unnecessary))
{
IDEDiagnosticIdToOptionMappingHelper.AddFadingOptionMapping(descriptor.Id, fadingOption);
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,12 @@ internal static class IDEDiagnosticIdToOptionMappingHelper
{
private static readonly ConcurrentDictionary<string, ImmutableHashSet<IOption2>> s_diagnosticIdToOptionMap = new();
private static readonly ConcurrentDictionary<string, ConcurrentDictionary<string, ImmutableHashSet<IOption2>>> s_diagnosticIdToLanguageSpecificOptionsMap = new();
private static readonly ConcurrentDictionary<string, PerLanguageOption2<bool>> s_diagnosticIdToFadingOptionMap = new();

public static bool TryGetMappedOptions(string diagnosticId, string language, [NotNullWhen(true)] out ImmutableHashSet<IOption2>? 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<bool>? fadingOption)
=> s_diagnosticIdToFadingOptionMap.TryGetValue(diagnosticId, out fadingOption);

public static ImmutableHashSet<string> KnownIDEDiagnosticIds
=> [.. s_diagnosticIdToOptionMap.Keys,
.. s_diagnosticIdToLanguageSpecificOptionsMap.Values.SelectMany(map => map.Keys)];
Expand Down Expand Up @@ -89,16 +85,4 @@ private static void AddOptionMapping(ConcurrentDictionary<string, ImmutableHashS

map.TryAdd(diagnosticId, options);
}

public static void AddFadingOptionMapping(string diagnosticId, PerLanguageOption2<bool> 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);
}
}
3 changes: 3 additions & 0 deletions src/Analyzers/Core/Analyzers/IDEDiagnosticIds.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ internal abstract class AbstractRemoveUnnecessaryImportsDiagnosticAnalyzer<TSynt
private readonly DiagnosticDescriptor _generatedCodeClassificationIdDescriptor;

protected AbstractRemoveUnnecessaryImportsDiagnosticAnalyzer(LocalizableString titleAndMessage)
: base(GetDescriptors(titleAndMessage, out var classificationIdDescriptor, out var generatedCodeClassificationIdDescriptor), FadingOptions.FadeOutUnusedImports)
: base(GetDescriptors(titleAndMessage, out var classificationIdDescriptor, out var generatedCodeClassificationIdDescriptor))
{
_classificationIdDescriptor = classificationIdDescriptor;
_generatedCodeClassificationIdDescriptor = generatedCodeClassificationIdDescriptor;
Expand All @@ -56,7 +56,7 @@ protected AbstractRemoveUnnecessaryImportsDiagnosticAnalyzer(LocalizableString t
private static ImmutableArray<DiagnosticDescriptor> 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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,7 @@ protected AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer(
(s_expressionValueIsUnusedRule, unusedValueExpressionStatementOption),
(s_valueAssignedIsUnusedRule, unusedValueAssignmentOption),
(s_unusedParameterRule, CodeStyleOptions2.UnusedParameters)
],
fadingOption: null)
])
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,7 @@ protected SimplifyTypeNamesDiagnosticAnalyzerBase()
CodeStyleOptions2.PreferIntrinsicPredefinedTypeKeywordInDeclaration,
CodeStyleOptions2.PreferIntrinsicPredefinedTypeKeywordInMemberAccess,
])
],
fadingOption: null)
])
{
}

Expand Down
Loading
Loading