diff --git a/src/NetAnalyzers/Core/Microsoft.NetCore.Analyzers/Runtime/DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzer.cs b/src/NetAnalyzers/Core/Microsoft.NetCore.Analyzers/Runtime/DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzer.cs index 4272e672a4..84e3d40c3a 100644 --- a/src/NetAnalyzers/Core/Microsoft.NetCore.Analyzers/Runtime/DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzer.cs +++ b/src/NetAnalyzers/Core/Microsoft.NetCore.Analyzers/Runtime/DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzer.cs @@ -10,6 +10,8 @@ namespace Microsoft.NetCore.Analyzers.Runtime { + using static MicrosoftNetCoreAnalyzersResources; + /// /// CA2021: Do not call Enumerable.Cast or Enumerable.OfType with incompatible types. /// @@ -18,11 +20,11 @@ public sealed class DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzer { internal const string RuleId = "CA2021"; - private static readonly LocalizableString s_localizableTitle = new LocalizableResourceString(nameof(MicrosoftNetCoreAnalyzersResources.DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesTitle), MicrosoftNetCoreAnalyzersResources.ResourceManager, typeof(MicrosoftNetCoreAnalyzersResources)); - private static readonly LocalizableString s_localizableDescription = new LocalizableResourceString(nameof(MicrosoftNetCoreAnalyzersResources.DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesDescription), MicrosoftNetCoreAnalyzersResources.ResourceManager, typeof(MicrosoftNetCoreAnalyzersResources)); + private static readonly LocalizableString s_localizableTitle = CreateLocalizableResourceString(nameof(DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesTitle)); + private static readonly LocalizableString s_localizableDescription = CreateLocalizableResourceString(nameof(DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesDescription)); - private static readonly LocalizableString s_localizableCastMessage = new LocalizableResourceString(nameof(MicrosoftNetCoreAnalyzersResources.DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesMessageCast), MicrosoftNetCoreAnalyzersResources.ResourceManager, typeof(MicrosoftNetCoreAnalyzersResources)); - private static readonly LocalizableString s_localizableOfTypeMessage = new LocalizableResourceString(nameof(MicrosoftNetCoreAnalyzersResources.DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesMessageOfType), MicrosoftNetCoreAnalyzersResources.ResourceManager, typeof(MicrosoftNetCoreAnalyzersResources)); + private static readonly LocalizableString s_localizableCastMessage = CreateLocalizableResourceString(nameof(DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesMessageCast)); + private static readonly LocalizableString s_localizableOfTypeMessage = CreateLocalizableResourceString(nameof(DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesMessageOfType)); internal static DiagnosticDescriptor CastRule = DiagnosticDescriptorHelper.Create(RuleId, s_localizableTitle, @@ -47,8 +49,8 @@ public sealed class DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzer (nameof(Enumerable.OfType), OfTypeRule) ); - public override ImmutableArray SupportedDiagnostics - => ImmutableArray.Create(OfTypeRule, CastRule); + public override ImmutableArray SupportedDiagnostics { get; } + = ImmutableArray.Create(OfTypeRule, CastRule); public override void Initialize(AnalysisContext context) { @@ -195,6 +197,7 @@ static ITypeSymbol UnwrapNullableValueType(ITypeSymbol typeSymbol) { return nullableTypeArgument; } + return typeSymbol; } @@ -231,6 +234,7 @@ static bool IsUnconstrainedTypeParameter(ITypeParameterSymbol typeParameterSymbo { return true; } + return false; case (_, TypeKind.TypeParameter): var castToTypeParam = (ITypeParameterSymbol)castTo.OriginalDefinition; @@ -249,6 +253,7 @@ static bool IsUnconstrainedTypeParameter(ITypeParameterSymbol typeParameterSymbo { return true; } + return false; case (TypeKind.Class, TypeKind.Class): @@ -261,11 +266,11 @@ static bool IsUnconstrainedTypeParameter(ITypeParameterSymbol typeParameterSymbo return castFrom.IsSealed && !castFrom.AllInterfaces.Contains(castTo); case (TypeKind.Class, TypeKind.Enum): - return castFrom.OriginalDefinition.SpecialType != SpecialType.System_Enum - && castFrom.OriginalDefinition.SpecialType != SpecialType.System_ValueType; + return castFrom.OriginalDefinition.SpecialType is not SpecialType.System_Enum + and not SpecialType.System_ValueType; case (TypeKind.Enum, TypeKind.Class): - return castTo.OriginalDefinition.SpecialType != SpecialType.System_Enum - && castTo.OriginalDefinition.SpecialType != SpecialType.System_ValueType; + return castTo.OriginalDefinition.SpecialType is not (SpecialType.System_Enum + and not SpecialType.System_ValueType); case (TypeKind.Struct, TypeKind.Enum) when castTo.OriginalDefinition is INamedTypeSymbol toEnum: diff --git a/src/NetAnalyzers/UnitTests/Microsoft.NetCore.Analyzers/Runtime/DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzerTests.cs b/src/NetAnalyzers/UnitTests/Microsoft.NetCore.Analyzers/Runtime/DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzerTests.cs index e4390ffb88..6d2faf82d4 100644 --- a/src/NetAnalyzers/UnitTests/Microsoft.NetCore.Analyzers/Runtime/DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzerTests.cs +++ b/src/NetAnalyzers/UnitTests/Microsoft.NetCore.Analyzers/Runtime/DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzerTests.cs @@ -4,7 +4,6 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Testing; using Xunit; using VerifyCS = Test.Utilities.CSharpCodeFixVerifier< Microsoft.NetCore.Analyzers.Runtime.DoNotCallEnumerableCastOrOfTypeWithIncompatibleTypesAnalyzer, diff --git a/src/Utilities/Compiler/DiagnosticCategoryAndIdRanges.txt b/src/Utilities/Compiler/DiagnosticCategoryAndIdRanges.txt index ed679ecdfe..8641989f9e 100644 --- a/src/Utilities/Compiler/DiagnosticCategoryAndIdRanges.txt +++ b/src/Utilities/Compiler/DiagnosticCategoryAndIdRanges.txt @@ -18,7 +18,7 @@ Usage: CA1801, CA1806, CA1816, CA2200-CA2209, CA2211-CA2260 Naming: CA1700-CA1727 Interoperability: CA1400-CA1422 Maintainability: CA1500-CA1513 -Reliability: CA9998-CA9999, CA2000-CA2020 +Reliability: CA9998-CA9999, CA2000-CA2021 Documentation: CA1200-CA1200 # Microsoft CodeAnalysis API rules