Skip to content

Commit e61e414

Browse files
committed
xunit/xunit#3244: xUnit2017 analyzer's code fixer generate incompatible code
1 parent 2923ace commit e61e414

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

src/xunit.analyzers.fixes/X2000/AssertCollectionContainsShouldNotUseBoolCheckFixer.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Microsoft.CodeAnalysis;
66
using Microsoft.CodeAnalysis.CodeActions;
77
using Microsoft.CodeAnalysis.CodeFixes;
8+
using Microsoft.CodeAnalysis.CSharp;
89
using Microsoft.CodeAnalysis.CSharp.Syntax;
910
using Microsoft.CodeAnalysis.Editing;
1011
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
@@ -63,11 +64,18 @@ static async Task<Document> UseContainsCheck(
6364
if (invocationExpressionSyntax.Expression is MemberAccessExpressionSyntax anyMethodInvocation)
6465
{
6566
var anyTarget = anyMethodInvocation.Expression;
67+
var isTrailingNull =
68+
invocationExpressionSyntax.ArgumentList.Arguments.Count == 2
69+
&& invocationExpressionSyntax.ArgumentList.Arguments[1].Expression.Kind() == SyntaxKind.NullLiteralExpression;
70+
var existingArguments =
71+
isTrailingNull
72+
? SeparatedList([invocationExpressionSyntax.ArgumentList.Arguments[0]])
73+
: invocationExpressionSyntax.ArgumentList.Arguments;
6674

6775
editor.ReplaceNode(
6876
invocation,
6977
invocation
70-
.WithArgumentList(ArgumentList(SeparatedList(invocationExpressionSyntax.ArgumentList.Arguments.Insert(1, Argument(anyTarget)))))
78+
.WithArgumentList(ArgumentList(SeparatedList(existingArguments.Insert(1, Argument(anyTarget)))))
7179
.WithExpression(memberAccess.WithName(IdentifierName(replacement)))
7280
);
7381
}

src/xunit.analyzers.tests/Fixes/X2000/AssertCollectionContainsShouldNotUseBoolCheckFixerTests.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,18 @@ public void TestMethod() {{
2727
[InlineData(
2828
/* lang=c#-test */ @"[|Assert.True(items.Contains(""b"", StringComparer.Ordinal))|]",
2929
/* lang=c#-test */ @"Assert.Contains(""b"", items, StringComparer.Ordinal)")]
30+
[InlineData(
31+
/* lang=c#-test */ @"[|Assert.True(items.Contains(""b"", null))|]",
32+
/* lang=c#-test */ @"Assert.Contains(""b"", items)")]
3033
[InlineData(
3134
/* lang=c#-test */ @"[|Assert.False(items.Contains(""b""))|]",
3235
/* lang=c#-test */ @"Assert.DoesNotContain(""b"", items)")]
3336
[InlineData(
3437
/* lang=c#-test */ @"[|Assert.False(items.Contains(""b"", StringComparer.Ordinal))|]",
3538
/* lang=c#-test */ @"Assert.DoesNotContain(""b"", items, StringComparer.Ordinal)")]
39+
[InlineData(
40+
/* lang=c#-test */ @"[|Assert.False(items.Contains(""b"", null))|]",
41+
/* lang=c#-test */ @"Assert.DoesNotContain(""b"", items)")]
3642
public async Task ReplacesBooleanAssert(
3743
string beforeAssert,
3844
string afterAssert)

0 commit comments

Comments
 (0)