Skip to content

Commit 6b94444

Browse files
authored
Merge pull request #3205 from sharwell/with-expression
Update SA1101 to support 'with' expressions
2 parents 4dcc786 + be02dd3 commit 6b94444

3 files changed

Lines changed: 48 additions & 6 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp9/ReadabilityRules/SA1101CSharp9UnitTests.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,40 @@
33

44
namespace StyleCop.Analyzers.Test.CSharp9.ReadabilityRules
55
{
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
using Microsoft.CodeAnalysis.CSharp;
69
using StyleCop.Analyzers.Test.CSharp8.ReadabilityRules;
10+
using StyleCop.Analyzers.Test.Verifiers;
11+
using Xunit;
12+
using static StyleCop.Analyzers.Test.Verifiers.StyleCopCodeFixVerifier<
13+
StyleCop.Analyzers.ReadabilityRules.SA1101PrefixLocalCallsWithThis,
14+
StyleCop.Analyzers.ReadabilityRules.SA1101CodeFixProvider>;
715

816
public class SA1101CSharp9UnitTests : SA1101CSharp8UnitTests
917
{
18+
[Fact]
19+
[WorkItem(3201, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3201")]
20+
public async Task TestRecordWithExpressionAsync()
21+
{
22+
var testCode = @"public class Test
23+
{
24+
public record A
25+
{
26+
public string Prop { get; init; }
27+
}
28+
29+
public A UpdateA(A value)
30+
{
31+
return value with { Prop = ""newValue"" };
32+
}
33+
}";
34+
35+
await new CSharpTest(LanguageVersion.CSharp9)
36+
{
37+
ReferenceAssemblies = GenericAnalyzerTest.ReferenceAssembliesNet50,
38+
TestCode = testCode,
39+
}.RunAsync(CancellationToken.None).ConfigureAwait(false);
40+
}
1041
}
1142
}

StyleCop.Analyzers/StyleCop.Analyzers/Lightup/SyntaxKindEx.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,6 @@ internal static class SyntaxKindEx
4949
public const SyntaxKind ImplicitStackAllocArrayCreationExpression = (SyntaxKind)9053;
5050
public const SyntaxKind SuppressNullableWarningExpression = (SyntaxKind)9054;
5151
public const SyntaxKind NullableDirectiveTrivia = (SyntaxKind)9055;
52+
public const SyntaxKind WithInitializerExpression = (SyntaxKind)9062;
5253
}
5354
}

StyleCop.Analyzers/StyleCop.Analyzers/ReadabilityRules/SA1101PrefixLocalCallsWithThis.cs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,23 @@ private static void HandleSimpleName(SyntaxNodeAnalysisContext context)
9696
return;
9797

9898
case SyntaxKind.SimpleAssignmentExpression:
99-
if (((AssignmentExpressionSyntax)context.Node.Parent).Left == context.Node
100-
&& (context.Node.Parent.Parent?.IsKind(SyntaxKind.ObjectInitializerExpression) ?? true))
99+
if (((AssignmentExpressionSyntax)context.Node.Parent).Left == context.Node)
101100
{
102-
/* Handle 'X' in:
103-
* new TypeName() { X = 3 }
104-
*/
105-
return;
101+
if (context.Node.Parent.Parent.IsKind(SyntaxKind.ObjectInitializerExpression))
102+
{
103+
/* Handle 'X' in:
104+
* new TypeName() { X = 3 }
105+
*/
106+
return;
107+
}
108+
109+
if (context.Node.Parent.Parent.IsKind(SyntaxKindEx.WithInitializerExpression))
110+
{
111+
/* Handle 'X' in:
112+
* value with { X = 3 }
113+
*/
114+
return;
115+
}
106116
}
107117

108118
break;

0 commit comments

Comments
 (0)