Skip to content

Commit 24d08d1

Browse files
authored
Add tests for RCS1172 (#1708)
1 parent aa0e509 commit 24d08d1

File tree

3 files changed

+67
-35
lines changed

3 files changed

+67
-35
lines changed

src/Analyzers.CodeFixes/CSharp/CodeFixes/UseIsOperatorInsteadOfAsOperatorCodeFixProvider.cs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@
22

33
using System.Collections.Immutable;
44
using System.Composition;
5+
using System.Threading;
56
using System.Threading.Tasks;
67
using Microsoft.CodeAnalysis;
78
using Microsoft.CodeAnalysis.CodeActions;
89
using Microsoft.CodeAnalysis.CodeFixes;
910
using Microsoft.CodeAnalysis.CSharp;
11+
using Microsoft.CodeAnalysis.CSharp.Syntax;
1012
using Roslynator.CodeFixes;
1113
using Roslynator.CSharp.Refactorings;
14+
using Roslynator.CSharp.Syntax;
15+
using static Roslynator.CSharp.CSharpFactory;
1216

1317
namespace Roslynator.CSharp.CodeFixes;
1418

@@ -38,9 +42,33 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context)
3842

3943
CodeAction codeAction = CodeAction.Create(
4044
"Use 'is' operator",
41-
ct => UseIsOperatorInsteadOfAsOperatorRefactoring.RefactorAsync(context.Document, node, ct),
45+
ct => RefactorAsync(context.Document, node, ct),
4246
GetEquivalenceKey(diagnostic));
4347

4448
context.RegisterCodeFix(codeAction, diagnostic);
4549
}
50+
51+
private static Task<Document> RefactorAsync(
52+
Document document,
53+
SyntaxNode node,
54+
CancellationToken cancellationToken)
55+
{
56+
NullCheckExpressionInfo nullCheck = SyntaxInfo.NullCheckExpressionInfo(node);
57+
58+
AsExpressionInfo asExpressionInfo = SyntaxInfo.AsExpressionInfo(nullCheck.Expression);
59+
60+
ExpressionSyntax newNode = IsExpression(
61+
asExpressionInfo.Expression,
62+
SyntaxFactory.Token(asExpressionInfo.OperatorToken.LeadingTrivia, SyntaxKind.IsKeyword, asExpressionInfo.OperatorToken.TrailingTrivia),
63+
asExpressionInfo.Type);
64+
65+
if (nullCheck.IsCheckingNull)
66+
newNode = LogicalNotExpression(newNode.WithoutTrivia().Parenthesize()).WithTriviaFrom(newNode);
67+
68+
newNode = newNode
69+
.Parenthesize()
70+
.WithFormatterAnnotation();
71+
72+
return document.ReplaceNodeAsync(node, newNode, cancellationToken);
73+
}
4674
}

src/Analyzers.CodeFixes/CSharp/Refactorings/UseIsOperatorInsteadOfAsOperatorRefactoring.cs

Lines changed: 0 additions & 34 deletions
This file was deleted.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System.Threading.Tasks;
2+
using Microsoft.CodeAnalysis;
3+
using Roslynator.CSharp.CodeFixes;
4+
using Roslynator.Testing.CSharp;
5+
using Xunit;
6+
7+
namespace Roslynator.CSharp.Analysis.Tests;
8+
9+
public class RCS1172UseIsOperatorInsteadOfAsOperatorTests : AbstractCSharpDiagnosticVerifier<UseIsOperatorInsteadOfAsOperatorAnalyzer, UseIsOperatorInsteadOfAsOperatorCodeFixProvider>
10+
{
11+
public override DiagnosticDescriptor Descriptor { get; } = DiagnosticRules.UseIsOperatorInsteadOfAsOperator;
12+
13+
[Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.UseIsOperatorInsteadOfAsOperator)]
14+
public async Task Test()
15+
{
16+
await VerifyDiagnosticAndFixAsync(@"
17+
class MyClass
18+
{
19+
void M(object item)
20+
{
21+
if ([|item as MyClass != null|])
22+
{
23+
}
24+
}
25+
}
26+
", @"
27+
class MyClass
28+
{
29+
void M(object item)
30+
{
31+
if (item is MyClass)
32+
{
33+
}
34+
}
35+
}
36+
");
37+
}
38+
}

0 commit comments

Comments
 (0)