diff --git a/ChangeLog.md b/ChangeLog.md index 8ade0a03fd..be05ca2c5e 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 [RCS0034](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS0034) ([PR](https://github.com/dotnet/roslynator/pull/1351)) + ## [4.8.0] - 2024-01-02 ### Added diff --git a/src/Formatting.Analyzers/CSharp/PutTypeParameterConstraintOnItsOwnLineAnalyzer.cs b/src/Formatting.Analyzers/CSharp/PutTypeParameterConstraintOnItsOwnLineAnalyzer.cs index 7f6b057a63..bbd366f316 100644 --- a/src/Formatting.Analyzers/CSharp/PutTypeParameterConstraintOnItsOwnLineAnalyzer.cs +++ b/src/Formatting.Analyzers/CSharp/PutTypeParameterConstraintOnItsOwnLineAnalyzer.cs @@ -47,12 +47,16 @@ private static void AnalyzeTypeDeclaration(SyntaxNodeAnalysisContext context) SyntaxList constraintClauses = typeDeclaration.ConstraintClauses; - TypeParameterListSyntax typeParameterList = typeDeclaration.TypeParameterList; + BaseTypeSyntax baseType = typeDeclaration.BaseList?.Types.LastOrDefault(); - if (typeParameterList is null) - return; - - Analyze(context, typeParameterList.GreaterThanToken, constraintClauses); + if (baseType is not null) + { + Analyze(context, baseType, constraintClauses); + } + else if (typeDeclaration.TypeParameterList is not null) + { + Analyze(context, typeDeclaration.TypeParameterList.GreaterThanToken, constraintClauses); + } } private static void AnalyzeDelegateDeclaration(SyntaxNodeAnalysisContext context) diff --git a/src/Tests/Formatting.Analyzers.Tests/RCS0034PutTypeParameterConstraintOnItsOwnLineTests.cs b/src/Tests/Formatting.Analyzers.Tests/RCS0034PutTypeParameterConstraintOnItsOwnLineTests.cs index 0badd8f6e6..167e2f6e8c 100644 --- a/src/Tests/Formatting.Analyzers.Tests/RCS0034PutTypeParameterConstraintOnItsOwnLineTests.cs +++ b/src/Tests/Formatting.Analyzers.Tests/RCS0034PutTypeParameterConstraintOnItsOwnLineTests.cs @@ -167,4 +167,23 @@ class C where T : struct } "); } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.PutTypeParameterConstraintOnItsOwnLine)] + public async Task TestNoDiagnostic_BaseType() + { + await VerifyNoDiagnosticAsync(@" +using System; + +public interface IBaseInterface + where TType : class + where TKey : struct, IEquatable +{ +} + +public interface IInterface : IBaseInterface + where TType : class + where TKey : struct, IEquatable +{ +}"); + } }