diff --git a/ChangeLog.md b/ChangeLog.md index 15cd730d67..8f5aeef8a5 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 analyzer [RCS1077](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1077) ([PR](https://github.com/dotnet/roslynator/pull/1428)) + ## [4.12.0] - 2024-03-19 ### Added diff --git a/src/Analyzers/CSharp/Analysis/OptimizeLinqMethodCallAnalysis.cs b/src/Analyzers/CSharp/Analysis/OptimizeLinqMethodCallAnalysis.cs index 276a4c7355..5a2ca58ee9 100644 --- a/src/Analyzers/CSharp/Analysis/OptimizeLinqMethodCallAnalysis.cs +++ b/src/Analyzers/CSharp/Analysis/OptimizeLinqMethodCallAnalysis.cs @@ -236,7 +236,7 @@ public static void AnalyzeFirstOrDefault(SyntaxNodeAnalysisContext context, in S { ITypeSymbol typeSymbol = context.SemanticModel.GetTypeSymbol(invocationInfo.Expression, context.CancellationToken); - if (typeSymbol?.OriginalDefinition.HasMetadataName(MetadataNames.System_Collections_Generic_List_T) == true) + if (typeSymbol?.OriginalDefinition.EqualsOrInheritsFrom(MetadataNames.System_Collections_Generic_List_T) == true) { Report(context, invocationInfo.Name); return; diff --git a/src/Tests/Analyzers.Tests/RCS1077OptimizeLinqMethodCallTests.cs b/src/Tests/Analyzers.Tests/RCS1077OptimizeLinqMethodCallTests.cs index 18b68d953c..398148e264 100644 --- a/src/Tests/Analyzers.Tests/RCS1077OptimizeLinqMethodCallTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1077OptimizeLinqMethodCallTests.cs @@ -708,6 +708,38 @@ void M() "); } + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.OptimizeLinqMethodCall)] + public async Task Test_CallFindInsteadOfFirstOrDefault_DerivedFromList() + { + await VerifyDiagnosticAndFixAsync(@" +using System.Collections.Generic; +using System.Linq; + +class C : List +{ + void M() + { + var items = new C(); + + var x = items.[|FirstOrDefault|](_ => true); + } +} +", @" +using System.Collections.Generic; +using System.Linq; + +class C : List +{ + void M() + { + var items = new C(); + + var x = items.Find(_ => true); + } +} +"); + } + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.OptimizeLinqMethodCall)] public async Task Test_CallFindInsteadOfFirstOrDefault_Array() {