diff --git a/ChangeLog.md b/ChangeLog.md index a76362b8e0..4066e8867d 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- Fix [RCS1234](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1234) ([PR](https://github.com/dotnet/roslynator/pull/1233)) + ## [4.6.1] - 2023-10-23 ### Fixed diff --git a/src/Analyzers.CodeFixes/CSharp/CodeFixes/EnumMemberDeclarationCodeFixProvider.cs b/src/Analyzers.CodeFixes/CSharp/CodeFixes/EnumMemberDeclarationCodeFixProvider.cs index 1c282cec2e..c6795c2f89 100644 --- a/src/Analyzers.CodeFixes/CSharp/CodeFixes/EnumMemberDeclarationCodeFixProvider.cs +++ b/src/Analyzers.CodeFixes/CSharp/CodeFixes/EnumMemberDeclarationCodeFixProvider.cs @@ -194,6 +194,9 @@ private static EnumMemberDeclarationSyntax FindMemberByValue( { IFieldSymbol fieldSymbol = semanticModel.GetDeclaredSymbol(enumMember, cancellationToken); + if (CSharpUtility.IsSymbolObsolete(fieldSymbol)) + continue; + if (!SymbolEqualityComparer.Default.Equals(fieldSymbolInfo.Symbol, fieldSymbol)) { EnumFieldSymbolInfo fieldSymbolInfo2 = EnumFieldSymbolInfo.Create(fieldSymbol); diff --git a/src/Analyzers/CSharp/Analysis/EnumSymbolAnalyzer.cs b/src/Analyzers/CSharp/Analysis/EnumSymbolAnalyzer.cs index 27850aed95..5bad422e50 100644 --- a/src/Analyzers/CSharp/Analysis/EnumSymbolAnalyzer.cs +++ b/src/Analyzers/CSharp/Analysis/EnumSymbolAnalyzer.cs @@ -196,6 +196,10 @@ private static void AnalyzeNamedType(SymbolAnalysisContext context) continue; } + if (CSharpUtility.IsSymbolObsolete(symbolInfo1.Symbol) + || CSharpUtility.IsSymbolObsolete(symbolInfo2.Symbol)) + continue; + var enumMember1 = (EnumMemberDeclarationSyntax)symbolInfo1.Symbol.GetSyntax(context.CancellationToken); if (enumMember1 is null) diff --git a/src/CSharp/CSharp/CSharpUtility.cs b/src/CSharp/CSharp/CSharpUtility.cs index d0e5e36ba6..62cdac0af9 100644 --- a/src/CSharp/CSharp/CSharpUtility.cs +++ b/src/CSharp/CSharp/CSharpUtility.cs @@ -1,7 +1,6 @@ // Copyright (c) .NET Foundation and Contributors. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.Threading; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; @@ -681,4 +680,9 @@ public static SeparatedSyntaxList GetTypeParameters(SyntaxN return null; } } + + public static bool IsSymbolObsolete(ISymbol symbol) + { + return symbol.HasAttribute(MetadataNames.System_ObsoleteAttribute); + } } diff --git a/src/Tests/Analyzers.Tests/RCS1234DuplicateEnumValueTests.cs b/src/Tests/Analyzers.Tests/RCS1234DuplicateEnumValueTests.cs index 19322b887e..c15143a404 100644 --- a/src/Tests/Analyzers.Tests/RCS1234DuplicateEnumValueTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1234DuplicateEnumValueTests.cs @@ -114,6 +114,34 @@ enum E "); } + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.DuplicateEnumValue)] + public async Task Test6() + { + await VerifyDiagnosticAndFixAsync(@" +using System; + +enum E +{ + [Obsolete] + A = 1, + + B = 1, + C = [|1|] +} +", @" +using System; + +enum E +{ + [Obsolete] + A = 1, + + B = 1, + C = B +} +"); + } + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.DuplicateEnumValue)] public async Task TestNoDiagnostic() { @@ -124,4 +152,20 @@ enum E B = A }"); } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.DuplicateEnumValue)] + public async Task TestNoDiagnostic2() + { + await VerifyNoDiagnosticAsync(@" +using System; + +enum E +{ + [Obsolete] + A = 1, + + B = 1, +} +"); + } }