diff --git a/src/Meziantou.Analyzer/Rules/CommaAnalyzer.cs b/src/Meziantou.Analyzer/Rules/CommaAnalyzer.cs index ab43cfe8..bee14b60 100644 --- a/src/Meziantou.Analyzer/Rules/CommaAnalyzer.cs +++ b/src/Meziantou.Analyzer/Rules/CommaAnalyzer.cs @@ -36,6 +36,7 @@ public override void Initialize(AnalysisContext context) context.RegisterSyntaxNodeAction(HandleEnumDeclaration, SyntaxKind.EnumDeclaration); context.RegisterSyntaxNodeAction(HandleWithExpression, SyntaxKind.WithExpression); context.RegisterSyntaxNodeAction(HandleSwitchExpression, SyntaxKind.SwitchExpression); + context.RegisterSyntaxNodeAction(HandleRecursivePattern, SyntaxKind.RecursivePattern); #if CSHARP12_OR_GREATER context.RegisterSyntaxNodeAction(HandleCollectionExpression, SyntaxKind.CollectionExpression); #endif @@ -101,4 +102,13 @@ private static void HandleAnonymousObjectInitializer(SyntaxNodeAnalysisContext c var node = (AnonymousObjectCreationExpressionSyntax)context.Node; HandleSeparatedList(context, node, node.Initializers); } + + private static void HandleRecursivePattern(SyntaxNodeAnalysisContext context) + { + var node = (RecursivePatternSyntax)context.Node; + if (node.PropertyPatternClause is null) + return; + + HandleSeparatedList(context, node, node.PropertyPatternClause.Subpatterns); + } } diff --git a/tests/Meziantou.Analyzer.Test/Rules/CommaAnalyzerTests.cs b/tests/Meziantou.Analyzer.Test/Rules/CommaAnalyzerTests.cs index 72d6227e..35686446 100644 --- a/tests/Meziantou.Analyzer.Test/Rules/CommaAnalyzerTests.cs +++ b/tests/Meziantou.Analyzer.Test/Rules/CommaAnalyzerTests.cs @@ -421,4 +421,86 @@ public Task WithExpressionWithoutLeadingCommaSingleLine() record Sample(int A, int B); """) .ValidateAsync(); + + [Fact] + public Task PropertyPatternWithoutTrailingComma() + => CreateProjectBuilder() + .WithLanguageVersion(Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp8) + .WithSourceCode(""" + class TypeName + { + public int A { get; set; } + public int B { get; set; } + + public void Test() + { + var obj = new TypeName(); + _ = obj is + { + A: 1, + [||]B: 2 + }; + } + } + """) + .ShouldFixCodeWith(""" + class TypeName + { + public int A { get; set; } + public int B { get; set; } + + public void Test() + { + var obj = new TypeName(); + _ = obj is + { + A: 1, + B: 2, + }; + } + } + """) + .ValidateAsync(); + + [Fact] + public Task PropertyPatternWithTrailingComma() + => CreateProjectBuilder() + .WithLanguageVersion(Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp8) + .WithSourceCode(""" + class TypeName + { + public int A { get; set; } + public int B { get; set; } + + public void Test() + { + var obj = new TypeName(); + _ = obj is + { + A: 1, + B: 2, + }; + } + } + """) + .ValidateAsync(); + + [Fact] + public Task PropertyPatternSingleLine() + => CreateProjectBuilder() + .WithLanguageVersion(Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp8) + .WithSourceCode(""" + class TypeName + { + public int A { get; set; } + public int B { get; set; } + + public void Test() + { + var obj = new TypeName(); + _ = obj is { A: 1, B: 2 }; + } + } + """) + .ValidateAsync(); }