diff --git a/CHANGELOG.md b/CHANGELOG.md index bde6f995fa..95e4c7f81c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Drop support for Visual Studio 2022 VSIX ([PR](https://github.com/dotnet/roslynator/pull/1787)) - Pin last 4.x release ([Roslynator 2022](https://marketplace.visualstudio.com/items?itemName=josefpihrt.Roslynator2022)) or use NuGet packages on Visual Studio 2022 +### Fixed + +- Fix analyzers [RCS1263](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1263) and [RCS1139](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1139) for C# 14 extension block documentation ([PR](https://github.com/dotnet/roslynator/pull/1799)) + ## [4.16.1] - 2026-08-16 ### Fixed diff --git a/src/Analyzers/CSharp/Analysis/SingleLineDocumentationCommentTriviaAnalyzer.cs b/src/Analyzers/CSharp/Analysis/SingleLineDocumentationCommentTriviaAnalyzer.cs index f2272c54f5..c8aff5f8b3 100644 --- a/src/Analyzers/CSharp/Analysis/SingleLineDocumentationCommentTriviaAnalyzer.cs +++ b/src/Analyzers/CSharp/Analysis/SingleLineDocumentationCommentTriviaAnalyzer.cs @@ -185,14 +185,18 @@ private static void AnalyzeSingleLineDocumentationCommentTrivia(SyntaxNodeAnalys return; } + SyntaxNode parent = documentationComment.ParentTrivia.Token.Parent; + if (!containsSummaryElement - && !containsContentElement) + && !containsContentElement +#if ROSLYN_5_0 + && parent?.IsKind(SyntaxKind.ExtensionBlockDeclaration) != true +#endif + ) { ReportDiagnosticIfEffective(context, DiagnosticRules.AddSummaryElementToDocumentationComment, documentationComment); } - SyntaxNode parent = documentationComment.ParentTrivia.Token.Parent; - bool invalidReference = DiagnosticRules.InvalidReferenceInDocumentationComment.IsEffective(context); bool orderParams = DiagnosticRules.OrderElementsInDocumentationComment.IsEffective(context); bool addParam = DiagnosticRules.AddParamElementToDocumentationComment.IsEffective(context); diff --git a/src/CSharp/CSharp/CSharpUtility.cs b/src/CSharp/CSharp/CSharpUtility.cs index d6627c6381..64e3b265a2 100644 --- a/src/CSharp/CSharp/CSharpUtility.cs +++ b/src/CSharp/CSharp/CSharpUtility.cs @@ -688,6 +688,10 @@ public static SeparatedSyntaxList GetParameters(SyntaxNode decl case SyntaxKind.StructDeclaration: case SyntaxKind.InterfaceDeclaration: return ((TypeDeclarationSyntax)declaration).ParameterList; +#endif +#if ROSLYN_5_0 + case SyntaxKind.ExtensionBlockDeclaration: + return ((ExtensionBlockDeclarationSyntax)declaration).ParameterList; #endif default: return null; @@ -720,6 +724,10 @@ public static SeparatedSyntaxList GetTypeParameters(SyntaxN case SyntaxKind.RecordStructDeclaration: #endif return ((RecordDeclarationSyntax)declaration).TypeParameterList; +#if ROSLYN_5_0 + case SyntaxKind.ExtensionBlockDeclaration: + return ((ExtensionBlockDeclarationSyntax)declaration).TypeParameterList; +#endif default: return null; } diff --git a/src/Tests/Analyzers.Tests/RCS1139AddSummaryElementToDocumentationCommentTests.cs b/src/Tests/Analyzers.Tests/RCS1139AddSummaryElementToDocumentationCommentTests.cs index 4440d63aa0..c24c76bee2 100644 --- a/src/Tests/Analyzers.Tests/RCS1139AddSummaryElementToDocumentationCommentTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1139AddSummaryElementToDocumentationCommentTests.cs @@ -50,4 +50,20 @@ partial class C } "); } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.AddSummaryElementToDocumentationComment)] + public async Task TestNoDiagnostic_ExtensionBlock_WithoutSummary() + { + await VerifyNoDiagnosticAsync(""" +static class C +{ + /// x + /// T + extension(T x) where T : struct + { + public int M() => 0; + } +} +"""); + } } diff --git a/src/Tests/Analyzers.Tests/RCS1263InvalidReferenceInDocumentationCommentTests.cs b/src/Tests/Analyzers.Tests/RCS1263InvalidReferenceInDocumentationCommentTests.cs index 8d980db15c..08046384f2 100644 --- a/src/Tests/Analyzers.Tests/RCS1263InvalidReferenceInDocumentationCommentTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1263InvalidReferenceInDocumentationCommentTests.cs @@ -205,6 +205,47 @@ public struct Foo(string value) { public string Value { get; } = value; } +"""); + } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.InvalidReferenceInDocumentationComment)] + public async Task TestNoDiagnostic_ExtensionBlock_ParamAndTypeParam() + { + await VerifyNoDiagnosticAsync(""" +static class C +{ + /// x + /// T + extension(T x) where T : struct + { + public int M() => 0; + } +} +"""); + } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.InvalidReferenceInDocumentationComment)] + public async Task Test_ExtensionBlock_InvalidParamName() + { + await VerifyDiagnosticAndFixAsync(""" +static class C +{ + /// + /// T + extension(T x) where T : struct + { + public int M() => 0; + } +} +""", """ +static class C +{ + /// T + extension(T x) where T : struct + { + public int M() => 0; + } +} """); } }