From 1fc09ff130e35c94154230fce614ca45b66c51be Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Sat, 19 Nov 2022 00:42:23 +0100 Subject: [PATCH 1/8] Analyzer: Simplify null check --- .../CodeFixes/IfStatementCodeFixProvider.cs | 39 ++++++- src/Analyzers/Analyzers.SimplifyNullCheck.xml | 20 ++++ .../Analysis/SimplifyNullCheckAnalyzer2.cs | 102 ++++++++++++++++++ .../CSharp/DiagnosticIdentifiers.Generated.cs | 1 + .../CSharp/DiagnosticRules.Generated.cs | 14 ++- .../Analyzers.Tests/Analyzers.Tests.csproj | 2 +- .../RCS1255SimplifyNullCheckTests.cs | 100 +++++++++++++++++ 7 files changed, 275 insertions(+), 3 deletions(-) create mode 100644 src/Analyzers/Analyzers.SimplifyNullCheck.xml create mode 100644 src/Analyzers/CSharp/Analysis/SimplifyNullCheckAnalyzer2.cs create mode 100644 src/Tests/Analyzers.Tests/RCS1255SimplifyNullCheckTests.cs diff --git a/src/Analyzers.CodeFixes/CSharp/CodeFixes/IfStatementCodeFixProvider.cs b/src/Analyzers.CodeFixes/CSharp/CodeFixes/IfStatementCodeFixProvider.cs index e47b3d3c0d..5efce6a9b7 100644 --- a/src/Analyzers.CodeFixes/CSharp/CodeFixes/IfStatementCodeFixProvider.cs +++ b/src/Analyzers.CodeFixes/CSharp/CodeFixes/IfStatementCodeFixProvider.cs @@ -16,6 +16,9 @@ using Roslynator.CSharp.Analysis.If; using Roslynator.CSharp.Refactorings; using Roslynator.CSharp.Refactorings.ReduceIfNesting; +using Roslynator.CSharp.Syntax; +using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; +using static Roslynator.CSharp.CSharpFactory; namespace Roslynator.CSharp.CodeFixes { @@ -33,7 +36,8 @@ public override ImmutableArray FixableDiagnosticIds DiagnosticIdentifiers.ConvertIfToReturnStatement, DiagnosticIdentifiers.ConvertIfToAssignment, DiagnosticIdentifiers.ReduceIfNesting, - DiagnosticIdentifiers.UseExceptionFilter); + DiagnosticIdentifiers.UseExceptionFilter, + DiagnosticIdentifiers.SimplifyNullCheck); } } @@ -110,6 +114,22 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context) }, GetEquivalenceKey(diagnostic)); + context.RegisterCodeFix(codeAction, diagnostic); + break; + } + case DiagnosticIdentifiers.SimplifyNullCheck: + { + CodeAction codeAction = CodeAction.Create( + "Use ArgumentNullException.ThrowIfNull", + ct => + { + return UseArgumentNullExceptionThrowIfNullAsync( + context.Document, + ifStatement, + cancellationToken: ct); + }, + GetEquivalenceKey(diagnostic)); + context.RegisterCodeFix(codeAction, diagnostic); break; } @@ -216,5 +236,22 @@ private static IfStatementSyntax GetNewIfStatement(IfStatementSyntax ifStatement return ifStatement.ReplaceNode(ifStatement.Statement, ifStatement2.Statement); } } + + private Task UseArgumentNullExceptionThrowIfNullAsync( + Document document, + IfStatementSyntax ifStatement, + CancellationToken cancellationToken) + { + NullCheckExpressionInfo nullCheck = SyntaxInfo.NullCheckExpressionInfo(ifStatement.Condition); + + ExpressionStatementSyntax newStatement = ExpressionStatement( + SimpleMemberInvocationExpression( + ParseExpression("global::System.ArgumentNullException").WithSimplifierAnnotation(), + IdentifierName("ThrowIfNull"), + Argument(nullCheck.Expression.WithoutTrivia()))) + .WithTriviaFrom(ifStatement); + + return document.ReplaceNodeAsync(ifStatement, newStatement, cancellationToken); + } } } diff --git a/src/Analyzers/Analyzers.SimplifyNullCheck.xml b/src/Analyzers/Analyzers.SimplifyNullCheck.xml new file mode 100644 index 0000000000..fd71a6ffba --- /dev/null +++ b/src/Analyzers/Analyzers.SimplifyNullCheck.xml @@ -0,0 +1,20 @@ + + + + RCS1255 + Simplify null check. + General + Info + true + Use `ArgumentNullException` instead of `if` null check. + + + + + + + + \ No newline at end of file diff --git a/src/Analyzers/CSharp/Analysis/SimplifyNullCheckAnalyzer2.cs b/src/Analyzers/CSharp/Analysis/SimplifyNullCheckAnalyzer2.cs new file mode 100644 index 0000000000..df23999cbe --- /dev/null +++ b/src/Analyzers/CSharp/Analysis/SimplifyNullCheckAnalyzer2.cs @@ -0,0 +1,102 @@ +// Copyright (c) Josef Pihrt and Contributors. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Immutable; +using System.Linq; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; +using Roslynator.CSharp.Syntax; + +namespace Roslynator.CSharp.Analysis +{ + [DiagnosticAnalyzer(LanguageNames.CSharp)] + public sealed class SimplifyNullCheckAnalyzer2 : BaseDiagnosticAnalyzer + { + private static ImmutableArray _supportedDiagnostics; + + public override ImmutableArray SupportedDiagnostics + { + get + { + if (_supportedDiagnostics.IsDefault) + Immutable.InterlockedInitialize(ref _supportedDiagnostics, DiagnosticRules.SimplifyNullCheck); + + return _supportedDiagnostics; + } + } + + public override void Initialize(AnalysisContext context) + { + base.Initialize(context); + + context.RegisterSyntaxNodeAction(f => AnalyzeIfStatement(f), SyntaxKind.IfStatement); + } + + private static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context) + { + var ifStatement = (IfStatementSyntax)context.Node; + + if (!ifStatement.IsSimpleIf()) + return; + + NullCheckExpressionInfo nullCheck = SyntaxInfo.NullCheckExpressionInfo( + ifStatement.Condition, + NullCheckStyles.EqualsToNull | NullCheckStyles.IsNull); + + if (!nullCheck.Success) + return; + + if (nullCheck.Expression is not IdentifierNameSyntax identifierName) + return; + + if (ifStatement.SingleNonBlockStatementOrDefault() is not ThrowStatementSyntax throwStatement) + return; + + if (throwStatement.Expression is not ObjectCreationExpressionSyntax objectCreation) + return; + + INamedTypeSymbol containingTypeSymbol = context.SemanticModel + .GetSymbol(objectCreation, context.CancellationToken)? + .ContainingType; + + if (containingTypeSymbol?.HasMetadataName(MetadataNames.System_ArgumentNullException) != true) + return; + + if (!containingTypeSymbol.GetMembers("ThrowIfNull").Any(f => f.IsKind(SymbolKind.Method))) + return; + + ExpressionSyntax expression = objectCreation.ArgumentList?.Arguments.FirstOrDefault()?.Expression; + + if (expression is null) + return; + + if (IsFixable()) + context.ReportDiagnostic(DiagnosticRules.SimplifyNullCheck, ifStatement.IfKeyword); + + bool IsFixable() + { + if (expression.IsKind(SyntaxKind.StringLiteralExpression)) + { + var literal = (LiteralExpressionSyntax)expression; + + if (string.Equals(identifierName.Identifier.ValueText, literal.Token.ValueText)) + { + return true; + } + } + else if (expression is InvocationExpressionSyntax invocationExpression) + { + if (CSharpUtility.IsNameOfExpression(invocationExpression, context.SemanticModel, context.CancellationToken) + && invocationExpression.ArgumentList.Arguments.FirstOrDefault().Expression is IdentifierNameSyntax identifierName2 + && string.Equals(identifierName.Identifier.ValueText, identifierName2.Identifier.ValueText)) + { + return true; + } + } + + return false; + } + } + } +} diff --git a/src/Analyzers/CSharp/DiagnosticIdentifiers.Generated.cs b/src/Analyzers/CSharp/DiagnosticIdentifiers.Generated.cs index 7cb72d0735..9105eb03bc 100644 --- a/src/Analyzers/CSharp/DiagnosticIdentifiers.Generated.cs +++ b/src/Analyzers/CSharp/DiagnosticIdentifiers.Generated.cs @@ -211,5 +211,6 @@ public static partial class DiagnosticIdentifiers public const string NormalizeUsageOfInfiniteLoop = "RCS1252"; public const string FormatDocumentationCommentSummary = "RCS1253"; public const string NormalizeFormatOfEnumFlagValue = "RCS1254"; + public const string SimplifyNullCheck = "RCS1255"; } } \ No newline at end of file diff --git a/src/Analyzers/CSharp/DiagnosticRules.Generated.cs b/src/Analyzers/CSharp/DiagnosticRules.Generated.cs index 0ece7cd9fa..4a4a7410fe 100644 --- a/src/Analyzers/CSharp/DiagnosticRules.Generated.cs +++ b/src/Analyzers/CSharp/DiagnosticRules.Generated.cs @@ -778,7 +778,7 @@ public static partial class DiagnosticRules messageFormat: "Use '{0}' property instead of 'Any' method.", category: DiagnosticCategories.Roslynator, defaultSeverity: DiagnosticSeverity.Info, - isEnabledByDefault: true, + isEnabledByDefault: false, description: null, helpLinkUri: DiagnosticIdentifiers.UseCountOrLengthPropertyInsteadOfAnyMethod, customTags: Array.Empty()); @@ -2497,5 +2497,17 @@ public static partial class DiagnosticRules helpLinkUri: DiagnosticIdentifiers.NormalizeFormatOfEnumFlagValue, customTags: Array.Empty()); + /// RCS1255 + public static readonly DiagnosticDescriptor SimplifyNullCheck = DiagnosticDescriptorFactory.Create( + id: DiagnosticIdentifiers.SimplifyNullCheck, + title: "Simplify null check.", + messageFormat: "Simplify null check.", + category: DiagnosticCategories.Roslynator, + defaultSeverity: DiagnosticSeverity.Info, + isEnabledByDefault: true, + description: null, + helpLinkUri: DiagnosticIdentifiers.SimplifyNullCheck, + customTags: Array.Empty()); + } } \ No newline at end of file diff --git a/src/Tests/Analyzers.Tests/Analyzers.Tests.csproj b/src/Tests/Analyzers.Tests/Analyzers.Tests.csproj index 7a1d0fd704..2f608ea820 100644 --- a/src/Tests/Analyzers.Tests/Analyzers.Tests.csproj +++ b/src/Tests/Analyzers.Tests/Analyzers.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + net6.0 diff --git a/src/Tests/Analyzers.Tests/RCS1255SimplifyNullCheckTests.cs b/src/Tests/Analyzers.Tests/RCS1255SimplifyNullCheckTests.cs new file mode 100644 index 0000000000..705bad30f5 --- /dev/null +++ b/src/Tests/Analyzers.Tests/RCS1255SimplifyNullCheckTests.cs @@ -0,0 +1,100 @@ +// Copyright (c) Josef Pihrt and Contributors. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Roslynator.CSharp.CodeFixes; +using Roslynator.Testing.CSharp; +using Xunit; + +namespace Roslynator.CSharp.Analysis.Tests +{ + public class RCS1255SimplifyNullCheckTests : AbstractCSharpDiagnosticVerifier + { + public override DiagnosticDescriptor Descriptor { get; } = DiagnosticRules.SimplifyNullCheck; + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.SimplifyNullCheck)] + public async Task Test_IfStatement_Block_Nameof() + { + await VerifyDiagnosticAndFixAsync(@" +using System; + +class C +{ + C(string x) + { + [|if|] (x is null) + { + throw new ArgumentNullException(nameof(x)); + } + } +} +", @" +using System; + +class C +{ + C(string x) + { + ArgumentNullException.ThrowIfNull(x); + } +} +"); + } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.SimplifyNullCheck)] + public async Task Test_IfStatement_Block_Literal() + { + await VerifyDiagnosticAndFixAsync(@" +using System; + +class C +{ + C(string x) + { + [|if|] (x is null) + { + throw new ArgumentNullException(""x""); + } + } +} +", @" +using System; + +class C +{ + C(string x) + { + ArgumentNullException.ThrowIfNull(x); + } +} +"); + } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.SimplifyNullCheck)] + public async Task Test_IfStatement_Embedded_Nameof() + { + await VerifyDiagnosticAndFixAsync(@" +using System; + +class C +{ + C(string x) + { + [|if|] (x is null) + throw new ArgumentNullException(nameof(x)); + } +} +", @" +using System; + +class C +{ + C(string x) + { + ArgumentNullException.ThrowIfNull(x); + } +} +"); + } + } +} From 72be8d039de3a8d40e83e8d9ee57f393c7d66d4d Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Sat, 19 Nov 2022 00:43:59 +0100 Subject: [PATCH 2/8] changelog --- ChangeLog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog.md b/ChangeLog.md index f469b88c58..f4a0498ff8 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Add Arm64 VS 2022 extension support ([#990](https://github.com/JosefPihrt/Roslynator/pull/990) by @snickler). +- Add analyzer "Simplify null check" ([RCS1255](https://github.com/JosefPihrt/Roslynator/blob/main/docs/analyzers/RCS1255.md)) ([#994](https://github.com/JosefPihrt/Roslynator/pull/994)). ### Changed From aa1776b6320a590a97bc40b0cbb248e03daf8537 Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Sat, 19 Nov 2022 13:54:00 +0100 Subject: [PATCH 3/8] update --- ChangeLog.md | 3 ++- .../CSharp/CodeFixes/IfStatementCodeFixProvider.cs | 6 +++--- src/Analyzers/Analyzers.SimplifyNullCheck.xml | 6 +++--- ...alyzer2.cs => SimplifyArgumentNullCheckAnalyzer.cs} | 6 +++--- .../CSharp/DiagnosticIdentifiers.Generated.cs | 2 +- src/Analyzers/CSharp/DiagnosticRules.Generated.cs | 10 +++++----- ...sts.cs => RCS1255SimplifyArgumentNullCheckTests.cs} | 10 +++++----- 7 files changed, 22 insertions(+), 21 deletions(-) rename src/Analyzers/CSharp/Analysis/{SimplifyNullCheckAnalyzer2.cs => SimplifyArgumentNullCheckAnalyzer.cs} (95%) rename src/Tests/Analyzers.Tests/{RCS1255SimplifyNullCheckTests.cs => RCS1255SimplifyArgumentNullCheckTests.cs} (86%) diff --git a/ChangeLog.md b/ChangeLog.md index f4a0498ff8..75676c072c 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -10,7 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Add Arm64 VS 2022 extension support ([#990](https://github.com/JosefPihrt/Roslynator/pull/990) by @snickler). -- Add analyzer "Simplify null check" ([RCS1255](https://github.com/JosefPihrt/Roslynator/blob/main/docs/analyzers/RCS1255.md)) ([#994](https://github.com/JosefPihrt/Roslynator/pull/994)). +- Add analyzer "Simplify argument null check" ([RCS1255](https://github.com/JosefPihrt/Roslynator/blob/main/docs/analyzers/RCS1255.md)) ([#994](https://github.com/JosefPihrt/Roslynator/pull/994)). + - Convert `if` null check to `ArgumentNullException.ThrowIfNull`. ### Changed diff --git a/src/Analyzers.CodeFixes/CSharp/CodeFixes/IfStatementCodeFixProvider.cs b/src/Analyzers.CodeFixes/CSharp/CodeFixes/IfStatementCodeFixProvider.cs index 5efce6a9b7..3bd28c06fb 100644 --- a/src/Analyzers.CodeFixes/CSharp/CodeFixes/IfStatementCodeFixProvider.cs +++ b/src/Analyzers.CodeFixes/CSharp/CodeFixes/IfStatementCodeFixProvider.cs @@ -37,7 +37,7 @@ public override ImmutableArray FixableDiagnosticIds DiagnosticIdentifiers.ConvertIfToAssignment, DiagnosticIdentifiers.ReduceIfNesting, DiagnosticIdentifiers.UseExceptionFilter, - DiagnosticIdentifiers.SimplifyNullCheck); + DiagnosticIdentifiers.SimplifyArgumentNullCheck); } } @@ -117,10 +117,10 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context) context.RegisterCodeFix(codeAction, diagnostic); break; } - case DiagnosticIdentifiers.SimplifyNullCheck: + case DiagnosticIdentifiers.SimplifyArgumentNullCheck: { CodeAction codeAction = CodeAction.Create( - "Use ArgumentNullException.ThrowIfNull", + "Call ArgumentNullException.ThrowIfNull", ct => { return UseArgumentNullExceptionThrowIfNullAsync( diff --git a/src/Analyzers/Analyzers.SimplifyNullCheck.xml b/src/Analyzers/Analyzers.SimplifyNullCheck.xml index fd71a6ffba..369c1eaed8 100644 --- a/src/Analyzers/Analyzers.SimplifyNullCheck.xml +++ b/src/Analyzers/Analyzers.SimplifyNullCheck.xml @@ -1,12 +1,12 @@ - + RCS1255 - Simplify null check. + Simplify argument null check. General Info true - Use `ArgumentNullException` instead of `if` null check. + Use `ArgumentNullException.ThrowIfNull` instead of `if` null check. _supportedDiagnostics; @@ -20,7 +20,7 @@ public override ImmutableArray SupportedDiagnostics get { if (_supportedDiagnostics.IsDefault) - Immutable.InterlockedInitialize(ref _supportedDiagnostics, DiagnosticRules.SimplifyNullCheck); + Immutable.InterlockedInitialize(ref _supportedDiagnostics, DiagnosticRules.SimplifyArgumentNullCheck); return _supportedDiagnostics; } @@ -72,7 +72,7 @@ private static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context) return; if (IsFixable()) - context.ReportDiagnostic(DiagnosticRules.SimplifyNullCheck, ifStatement.IfKeyword); + context.ReportDiagnostic(DiagnosticRules.SimplifyArgumentNullCheck, ifStatement.IfKeyword); bool IsFixable() { diff --git a/src/Analyzers/CSharp/DiagnosticIdentifiers.Generated.cs b/src/Analyzers/CSharp/DiagnosticIdentifiers.Generated.cs index 9105eb03bc..8712feca6a 100644 --- a/src/Analyzers/CSharp/DiagnosticIdentifiers.Generated.cs +++ b/src/Analyzers/CSharp/DiagnosticIdentifiers.Generated.cs @@ -211,6 +211,6 @@ public static partial class DiagnosticIdentifiers public const string NormalizeUsageOfInfiniteLoop = "RCS1252"; public const string FormatDocumentationCommentSummary = "RCS1253"; public const string NormalizeFormatOfEnumFlagValue = "RCS1254"; - public const string SimplifyNullCheck = "RCS1255"; + public const string SimplifyArgumentNullCheck = "RCS1255"; } } \ No newline at end of file diff --git a/src/Analyzers/CSharp/DiagnosticRules.Generated.cs b/src/Analyzers/CSharp/DiagnosticRules.Generated.cs index 4a4a7410fe..1303a79bfb 100644 --- a/src/Analyzers/CSharp/DiagnosticRules.Generated.cs +++ b/src/Analyzers/CSharp/DiagnosticRules.Generated.cs @@ -2498,15 +2498,15 @@ public static partial class DiagnosticRules customTags: Array.Empty()); /// RCS1255 - public static readonly DiagnosticDescriptor SimplifyNullCheck = DiagnosticDescriptorFactory.Create( - id: DiagnosticIdentifiers.SimplifyNullCheck, - title: "Simplify null check.", - messageFormat: "Simplify null check.", + public static readonly DiagnosticDescriptor SimplifyArgumentNullCheck = DiagnosticDescriptorFactory.Create( + id: DiagnosticIdentifiers.SimplifyArgumentNullCheck, + title: "Simplify argument null check.", + messageFormat: "Simplify argument null check.", category: DiagnosticCategories.Roslynator, defaultSeverity: DiagnosticSeverity.Info, isEnabledByDefault: true, description: null, - helpLinkUri: DiagnosticIdentifiers.SimplifyNullCheck, + helpLinkUri: DiagnosticIdentifiers.SimplifyArgumentNullCheck, customTags: Array.Empty()); } diff --git a/src/Tests/Analyzers.Tests/RCS1255SimplifyNullCheckTests.cs b/src/Tests/Analyzers.Tests/RCS1255SimplifyArgumentNullCheckTests.cs similarity index 86% rename from src/Tests/Analyzers.Tests/RCS1255SimplifyNullCheckTests.cs rename to src/Tests/Analyzers.Tests/RCS1255SimplifyArgumentNullCheckTests.cs index 705bad30f5..7ddfa8f840 100644 --- a/src/Tests/Analyzers.Tests/RCS1255SimplifyNullCheckTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1255SimplifyArgumentNullCheckTests.cs @@ -8,11 +8,11 @@ namespace Roslynator.CSharp.Analysis.Tests { - public class RCS1255SimplifyNullCheckTests : AbstractCSharpDiagnosticVerifier + public class RCS1255SimplifyArgumentNullCheckTests : AbstractCSharpDiagnosticVerifier { - public override DiagnosticDescriptor Descriptor { get; } = DiagnosticRules.SimplifyNullCheck; + public override DiagnosticDescriptor Descriptor { get; } = DiagnosticRules.SimplifyArgumentNullCheck; - [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.SimplifyNullCheck)] + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.SimplifyArgumentNullCheck)] public async Task Test_IfStatement_Block_Nameof() { await VerifyDiagnosticAndFixAsync(@" @@ -41,7 +41,7 @@ class C "); } - [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.SimplifyNullCheck)] + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.SimplifyArgumentNullCheck)] public async Task Test_IfStatement_Block_Literal() { await VerifyDiagnosticAndFixAsync(@" @@ -70,7 +70,7 @@ class C "); } - [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.SimplifyNullCheck)] + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.SimplifyArgumentNullCheck)] public async Task Test_IfStatement_Embedded_Nameof() { await VerifyDiagnosticAndFixAsync(@" From 5b81464803d16445001d441324a5a07963e3c815 Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Sat, 19 Nov 2022 14:44:25 +0100 Subject: [PATCH 4/8] update --- ChangeLog.md | 2 +- src/Analyzers/Analyzers.SimplifyNullCheck.xml | 20 --- src/Analyzers/Analyzers.xml | 17 +++ .../SimplifyArgumentNullCheckAnalyzer.cs | 123 +++++++++--------- .../RCS1255SimplifyArgumentNullCheckTests.cs | 37 +++--- 5 files changed, 97 insertions(+), 102 deletions(-) delete mode 100644 src/Analyzers/Analyzers.SimplifyNullCheck.xml diff --git a/ChangeLog.md b/ChangeLog.md index 51705c5e20..ca7ed24c03 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -13,7 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add analyzer "Add/remove blank line after file scoped namespace declaration" [RCS0060](https://github.com/JosefPihrt/Roslynator/blob/main/docs/analyzers/RCS0060.md) ([#993](https://github.com/josefpihrt/roslynator/pull/993). - Required option: `roslynator_blank_line_after_file_scoped_namespace_declaration = true|false` - Add analyzer "Simplify argument null check" ([RCS1255](https://github.com/JosefPihrt/Roslynator/blob/main/docs/analyzers/RCS1255.md)) ([#994](https://github.com/JosefPihrt/Roslynator/pull/994)). - - Convert `if` null check to `ArgumentNullException.ThrowIfNull`. + - Use `ArgumentNullException.ThrowIfNull` instead of `if` null check. ### Changed diff --git a/src/Analyzers/Analyzers.SimplifyNullCheck.xml b/src/Analyzers/Analyzers.SimplifyNullCheck.xml deleted file mode 100644 index 369c1eaed8..0000000000 --- a/src/Analyzers/Analyzers.SimplifyNullCheck.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - RCS1255 - Simplify argument null check. - General - Info - true - Use `ArgumentNullException.ThrowIfNull` instead of `if` null check. - - - - - - - - \ No newline at end of file diff --git a/src/Analyzers/Analyzers.xml b/src/Analyzers/Analyzers.xml index 37928a8cff..380e95f9d9 100644 --- a/src/Analyzers/Analyzers.xml +++ b/src/Analyzers/Analyzers.xml @@ -5741,4 +5741,21 @@ void M() + + RCS1255 + Simplify argument null check. + General + Info + true + Use `ArgumentNullException.ThrowIfNull` instead of `if` null check. + + + + + + + \ No newline at end of file diff --git a/src/Analyzers/CSharp/Analysis/SimplifyArgumentNullCheckAnalyzer.cs b/src/Analyzers/CSharp/Analysis/SimplifyArgumentNullCheckAnalyzer.cs index c0f78b0e39..b50a2aa0cd 100644 --- a/src/Analyzers/CSharp/Analysis/SimplifyArgumentNullCheckAnalyzer.cs +++ b/src/Analyzers/CSharp/Analysis/SimplifyArgumentNullCheckAnalyzer.cs @@ -8,95 +8,94 @@ using Microsoft.CodeAnalysis.Diagnostics; using Roslynator.CSharp.Syntax; -namespace Roslynator.CSharp.Analysis +namespace Roslynator.CSharp.Analysis; + +[DiagnosticAnalyzer(LanguageNames.CSharp)] +public sealed class SimplifyArgumentNullCheckAnalyzer : BaseDiagnosticAnalyzer { - [DiagnosticAnalyzer(LanguageNames.CSharp)] - public sealed class SimplifyArgumentNullCheckAnalyzer : BaseDiagnosticAnalyzer - { - private static ImmutableArray _supportedDiagnostics; + private static ImmutableArray _supportedDiagnostics; - public override ImmutableArray SupportedDiagnostics + public override ImmutableArray SupportedDiagnostics + { + get { - get - { - if (_supportedDiagnostics.IsDefault) - Immutable.InterlockedInitialize(ref _supportedDiagnostics, DiagnosticRules.SimplifyArgumentNullCheck); + if (_supportedDiagnostics.IsDefault) + Immutable.InterlockedInitialize(ref _supportedDiagnostics, DiagnosticRules.SimplifyArgumentNullCheck); - return _supportedDiagnostics; - } + return _supportedDiagnostics; } + } - public override void Initialize(AnalysisContext context) - { - base.Initialize(context); + public override void Initialize(AnalysisContext context) + { + base.Initialize(context); - context.RegisterSyntaxNodeAction(f => AnalyzeIfStatement(f), SyntaxKind.IfStatement); - } + context.RegisterSyntaxNodeAction(f => AnalyzeIfStatement(f), SyntaxKind.IfStatement); + } - private static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context) - { - var ifStatement = (IfStatementSyntax)context.Node; + private static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context) + { + var ifStatement = (IfStatementSyntax)context.Node; - if (!ifStatement.IsSimpleIf()) - return; + if (!ifStatement.IsSimpleIf()) + return; - NullCheckExpressionInfo nullCheck = SyntaxInfo.NullCheckExpressionInfo( - ifStatement.Condition, - NullCheckStyles.EqualsToNull | NullCheckStyles.IsNull); + NullCheckExpressionInfo nullCheck = SyntaxInfo.NullCheckExpressionInfo( + ifStatement.Condition, + NullCheckStyles.EqualsToNull | NullCheckStyles.IsNull); - if (!nullCheck.Success) - return; + if (!nullCheck.Success) + return; - if (nullCheck.Expression is not IdentifierNameSyntax identifierName) - return; + if (nullCheck.Expression is not IdentifierNameSyntax identifierName) + return; - if (ifStatement.SingleNonBlockStatementOrDefault() is not ThrowStatementSyntax throwStatement) - return; + if (ifStatement.SingleNonBlockStatementOrDefault() is not ThrowStatementSyntax throwStatement) + return; - if (throwStatement.Expression is not ObjectCreationExpressionSyntax objectCreation) - return; + if (throwStatement.Expression is not ObjectCreationExpressionSyntax objectCreation) + return; - INamedTypeSymbol containingTypeSymbol = context.SemanticModel - .GetSymbol(objectCreation, context.CancellationToken)? - .ContainingType; + INamedTypeSymbol containingTypeSymbol = context.SemanticModel + .GetSymbol(objectCreation, context.CancellationToken)? + .ContainingType; - if (containingTypeSymbol?.HasMetadataName(MetadataNames.System_ArgumentNullException) != true) - return; + if (containingTypeSymbol?.HasMetadataName(MetadataNames.System_ArgumentNullException) != true) + return; - if (!containingTypeSymbol.GetMembers("ThrowIfNull").Any(f => f.IsKind(SymbolKind.Method))) - return; + if (!containingTypeSymbol.GetMembers("ThrowIfNull").Any(f => f.IsKind(SymbolKind.Method))) + return; - ExpressionSyntax expression = objectCreation.ArgumentList?.Arguments.FirstOrDefault()?.Expression; + ExpressionSyntax expression = objectCreation.ArgumentList?.Arguments.FirstOrDefault()?.Expression; - if (expression is null) - return; + if (expression is null) + return; - if (IsFixable()) - context.ReportDiagnostic(DiagnosticRules.SimplifyArgumentNullCheck, ifStatement.IfKeyword); + if (IsFixable()) + context.ReportDiagnostic(DiagnosticRules.SimplifyArgumentNullCheck, ifStatement.IfKeyword); - bool IsFixable() + bool IsFixable() + { + if (expression.IsKind(SyntaxKind.StringLiteralExpression)) { - if (expression.IsKind(SyntaxKind.StringLiteralExpression)) - { - var literal = (LiteralExpressionSyntax)expression; + var literal = (LiteralExpressionSyntax)expression; - if (string.Equals(identifierName.Identifier.ValueText, literal.Token.ValueText)) - { - return true; - } + if (string.Equals(identifierName.Identifier.ValueText, literal.Token.ValueText)) + { + return true; } - else if (expression is InvocationExpressionSyntax invocationExpression) + } + else if (expression is InvocationExpressionSyntax invocationExpression) + { + if (CSharpUtility.IsNameOfExpression(invocationExpression, context.SemanticModel, context.CancellationToken) + && invocationExpression.ArgumentList.Arguments.FirstOrDefault().Expression is IdentifierNameSyntax identifierName2 + && string.Equals(identifierName.Identifier.ValueText, identifierName2.Identifier.ValueText)) { - if (CSharpUtility.IsNameOfExpression(invocationExpression, context.SemanticModel, context.CancellationToken) - && invocationExpression.ArgumentList.Arguments.FirstOrDefault().Expression is IdentifierNameSyntax identifierName2 - && string.Equals(identifierName.Identifier.ValueText, identifierName2.Identifier.ValueText)) - { - return true; - } + return true; } - - return false; } + + return false; } } } diff --git a/src/Tests/Analyzers.Tests/RCS1255SimplifyArgumentNullCheckTests.cs b/src/Tests/Analyzers.Tests/RCS1255SimplifyArgumentNullCheckTests.cs index 7ddfa8f840..e9acaced93 100644 --- a/src/Tests/Analyzers.Tests/RCS1255SimplifyArgumentNullCheckTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1255SimplifyArgumentNullCheckTests.cs @@ -6,16 +6,16 @@ using Roslynator.Testing.CSharp; using Xunit; -namespace Roslynator.CSharp.Analysis.Tests +namespace Roslynator.CSharp.Analysis.Tests; + +public class RCS1255SimplifyArgumentNullCheckTests : AbstractCSharpDiagnosticVerifier { - public class RCS1255SimplifyArgumentNullCheckTests : AbstractCSharpDiagnosticVerifier - { - public override DiagnosticDescriptor Descriptor { get; } = DiagnosticRules.SimplifyArgumentNullCheck; + public override DiagnosticDescriptor Descriptor { get; } = DiagnosticRules.SimplifyArgumentNullCheck; - [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.SimplifyArgumentNullCheck)] - public async Task Test_IfStatement_Block_Nameof() - { - await VerifyDiagnosticAndFixAsync(@" + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.SimplifyArgumentNullCheck)] + public async Task Test_IfStatement_Block_Nameof() + { + await VerifyDiagnosticAndFixAsync(@" using System; class C @@ -39,12 +39,12 @@ class C } } "); - } + } - [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.SimplifyArgumentNullCheck)] - public async Task Test_IfStatement_Block_Literal() - { - await VerifyDiagnosticAndFixAsync(@" + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.SimplifyArgumentNullCheck)] + public async Task Test_IfStatement_Block_Literal() + { + await VerifyDiagnosticAndFixAsync(@" using System; class C @@ -68,12 +68,12 @@ class C } } "); - } + } - [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.SimplifyArgumentNullCheck)] - public async Task Test_IfStatement_Embedded_Nameof() - { - await VerifyDiagnosticAndFixAsync(@" + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.SimplifyArgumentNullCheck)] + public async Task Test_IfStatement_Embedded_Nameof() + { + await VerifyDiagnosticAndFixAsync(@" using System; class C @@ -95,6 +95,5 @@ class C } } "); - } } } From b8a113462749aa53c4dd97c81b22b2ce9104aaba Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Sat, 19 Nov 2022 14:54:52 +0100 Subject: [PATCH 5/8] update --- .../CodeFixes/IfStatementCodeFixProvider.cs | 64 +++++++++---------- .../SimplifyArgumentNullCheckAnalyzer.cs | 13 ++-- .../RCS1255SimplifyArgumentNullCheckTests.cs | 19 ++++++ 3 files changed, 59 insertions(+), 37 deletions(-) diff --git a/src/Analyzers.CodeFixes/CSharp/CodeFixes/IfStatementCodeFixProvider.cs b/src/Analyzers.CodeFixes/CSharp/CodeFixes/IfStatementCodeFixProvider.cs index 8fd9e0297e..76ce45cca2 100644 --- a/src/Analyzers.CodeFixes/CSharp/CodeFixes/IfStatementCodeFixProvider.cs +++ b/src/Analyzers.CodeFixes/CSharp/CodeFixes/IfStatementCodeFixProvider.cs @@ -117,22 +117,22 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context) context.RegisterCodeFix(codeAction, diagnostic); break; } - case DiagnosticIdentifiers.SimplifyArgumentNullCheck: - { - CodeAction codeAction = CodeAction.Create( - "Call ArgumentNullException.ThrowIfNull", - ct => - { - return UseArgumentNullExceptionThrowIfNullAsync( - context.Document, - ifStatement, - cancellationToken: ct); - }, - GetEquivalenceKey(diagnostic)); - - context.RegisterCodeFix(codeAction, diagnostic); - break; - } + case DiagnosticIdentifiers.SimplifyArgumentNullCheck: + { + CodeAction codeAction = CodeAction.Create( + "Call ArgumentNullException.ThrowIfNull", + ct => + { + return CallArgumentNullExceptionThrowIfNullAsync( + context.Document, + ifStatement, + cancellationToken: ct); + }, + GetEquivalenceKey(diagnostic)); + + context.RegisterCodeFix(codeAction, diagnostic); + break; + } } } } @@ -176,7 +176,7 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context) CatchClauseSyntax newCatchClause = catchClause.Update( catchKeyword: catchClause.CatchKeyword, declaration: catchClause.Declaration, - filter: SyntaxFactory.CatchFilterClause(filterExpression.WalkDownParentheses()), + filter: CatchFilterClause(filterExpression.WalkDownParentheses()), block: catchClause.Block.WithStatements(newStatements)); newCatchClause = newCatchClause.WithFormatterAnnotation(); @@ -209,7 +209,7 @@ SyntaxList ReplaceStatement(StatementSyntax statement) if (!right.IsKind(SyntaxKind.LogicalAndExpression)) right = right.Parenthesize(); - BinaryExpressionSyntax newCondition = CSharpFactory.LogicalAndExpression(left, right); + BinaryExpressionSyntax newCondition = LogicalAndExpression(left, right); IfStatementSyntax newNode = GetNewIfStatement(ifStatement, nestedIf) .WithCondition(newCondition) @@ -235,22 +235,22 @@ private static IfStatementSyntax GetNewIfStatement(IfStatementSyntax ifStatement { return ifStatement.ReplaceNode(ifStatement.Statement, ifStatement2.Statement); } - } + } - private Task UseArgumentNullExceptionThrowIfNullAsync( - Document document, - IfStatementSyntax ifStatement, - CancellationToken cancellationToken) - { - NullCheckExpressionInfo nullCheck = SyntaxInfo.NullCheckExpressionInfo(ifStatement.Condition); + private Task CallArgumentNullExceptionThrowIfNullAsync( + Document document, + IfStatementSyntax ifStatement, + CancellationToken cancellationToken) + { + NullCheckExpressionInfo nullCheck = SyntaxInfo.NullCheckExpressionInfo(ifStatement.Condition); - ExpressionStatementSyntax newStatement = ExpressionStatement( - SimpleMemberInvocationExpression( - ParseExpression("global::System.ArgumentNullException").WithSimplifierAnnotation(), - IdentifierName("ThrowIfNull"), - Argument(nullCheck.Expression.WithoutTrivia()))) - .WithTriviaFrom(ifStatement); + ExpressionStatementSyntax newStatement = ExpressionStatement( + SimpleMemberInvocationExpression( + ParseExpression("global::System.ArgumentNullException").WithSimplifierAnnotation(), + IdentifierName("ThrowIfNull"), + Argument(nullCheck.Expression.WithoutTrivia()))) + .WithTriviaFrom(ifStatement); - return document.ReplaceNodeAsync(ifStatement, newStatement, cancellationToken); + return document.ReplaceNodeAsync(ifStatement, newStatement, cancellationToken); } } diff --git a/src/Analyzers/CSharp/Analysis/SimplifyArgumentNullCheckAnalyzer.cs b/src/Analyzers/CSharp/Analysis/SimplifyArgumentNullCheckAnalyzer.cs index b50a2aa0cd..0c26a87944 100644 --- a/src/Analyzers/CSharp/Analysis/SimplifyArgumentNullCheckAnalyzer.cs +++ b/src/Analyzers/CSharp/Analysis/SimplifyArgumentNullCheckAnalyzer.cs @@ -56,6 +56,14 @@ private static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context) if (throwStatement.Expression is not ObjectCreationExpressionSyntax objectCreation) return; + ExpressionSyntax expression = objectCreation.ArgumentList?.Arguments.SingleOrDefault(shouldThrow: false)?.Expression; + + if (expression is null) + return; + + if (ifStatement.ContainsUnbalancedIfElseDirectives()) + return; + INamedTypeSymbol containingTypeSymbol = context.SemanticModel .GetSymbol(objectCreation, context.CancellationToken)? .ContainingType; @@ -66,11 +74,6 @@ private static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context) if (!containingTypeSymbol.GetMembers("ThrowIfNull").Any(f => f.IsKind(SymbolKind.Method))) return; - ExpressionSyntax expression = objectCreation.ArgumentList?.Arguments.FirstOrDefault()?.Expression; - - if (expression is null) - return; - if (IsFixable()) context.ReportDiagnostic(DiagnosticRules.SimplifyArgumentNullCheck, ifStatement.IfKeyword); diff --git a/src/Tests/Analyzers.Tests/RCS1255SimplifyArgumentNullCheckTests.cs b/src/Tests/Analyzers.Tests/RCS1255SimplifyArgumentNullCheckTests.cs index e9acaced93..069dcf0d03 100644 --- a/src/Tests/Analyzers.Tests/RCS1255SimplifyArgumentNullCheckTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1255SimplifyArgumentNullCheckTests.cs @@ -94,6 +94,25 @@ class C ArgumentNullException.ThrowIfNull(x); } } +"); + } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.SimplifyArgumentNullCheck)] + public async Task TestNoDiagnostic_TwoArguments() + { + await VerifyNoDiagnosticAsync(@" +using System; + +class C +{ + C(string x) + { + if (x is null) + { + throw new ArgumentNullException(nameof(x), ""message""); + } + } +} "); } } From ec5487f4a4b513db28decad971f64eb87b92bd84 Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Sat, 19 Nov 2022 14:59:57 +0100 Subject: [PATCH 6/8] update --- .../SimplifyArgumentNullCheckAnalyzer.cs | 39 ++++++++----------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/src/Analyzers/CSharp/Analysis/SimplifyArgumentNullCheckAnalyzer.cs b/src/Analyzers/CSharp/Analysis/SimplifyArgumentNullCheckAnalyzer.cs index 0c26a87944..c34d22a273 100644 --- a/src/Analyzers/CSharp/Analysis/SimplifyArgumentNullCheckAnalyzer.cs +++ b/src/Analyzers/CSharp/Analysis/SimplifyArgumentNullCheckAnalyzer.cs @@ -42,7 +42,7 @@ private static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context) NullCheckExpressionInfo nullCheck = SyntaxInfo.NullCheckExpressionInfo( ifStatement.Condition, - NullCheckStyles.EqualsToNull | NullCheckStyles.IsNull); + NullCheckStyles.CheckingNull); if (!nullCheck.Success) return; @@ -74,31 +74,26 @@ private static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context) if (!containingTypeSymbol.GetMembers("ThrowIfNull").Any(f => f.IsKind(SymbolKind.Method))) return; - if (IsFixable()) - context.ReportDiagnostic(DiagnosticRules.SimplifyArgumentNullCheck, ifStatement.IfKeyword); - - bool IsFixable() + if (expression.IsKind(SyntaxKind.StringLiteralExpression)) { - if (expression.IsKind(SyntaxKind.StringLiteralExpression)) - { - var literal = (LiteralExpressionSyntax)expression; + var literal = (LiteralExpressionSyntax)expression; - if (string.Equals(identifierName.Identifier.ValueText, literal.Token.ValueText)) - { - return true; - } - } - else if (expression is InvocationExpressionSyntax invocationExpression) + if (string.Equals(identifierName.Identifier.ValueText, literal.Token.ValueText)) + ReportDiagnostic(context, ifStatement); + } + else if (expression is InvocationExpressionSyntax invocationExpression) + { + if (CSharpUtility.IsNameOfExpression(invocationExpression, context.SemanticModel, context.CancellationToken) + && invocationExpression.ArgumentList.Arguments.FirstOrDefault().Expression is IdentifierNameSyntax identifierName2 + && string.Equals(identifierName.Identifier.ValueText, identifierName2.Identifier.ValueText)) { - if (CSharpUtility.IsNameOfExpression(invocationExpression, context.SemanticModel, context.CancellationToken) - && invocationExpression.ArgumentList.Arguments.FirstOrDefault().Expression is IdentifierNameSyntax identifierName2 - && string.Equals(identifierName.Identifier.ValueText, identifierName2.Identifier.ValueText)) - { - return true; - } + ReportDiagnostic(context, ifStatement); } - - return false; } } + + private static void ReportDiagnostic(SyntaxNodeAnalysisContext context, IfStatementSyntax ifStatement) + { + context.ReportDiagnostic(DiagnosticRules.SimplifyArgumentNullCheck, ifStatement.IfKeyword); + } } From 69e04586291e6b1cdb4f211d50e35bb423ab84f3 Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Sat, 19 Nov 2022 15:09:46 +0100 Subject: [PATCH 7/8] update --- .editorconfig | 1 + ChangeLog.md | 2 ++ src/Analyzers/Analyzers.xml | 2 +- .../CSharp/Analysis/SimplifyArgumentNullCheckAnalyzer.cs | 2 +- src/Analyzers/CSharp/DiagnosticRules.Generated.cs | 2 +- 5 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.editorconfig b/.editorconfig index 034defa6af..0c0dc310ea 100644 --- a/.editorconfig +++ b/.editorconfig @@ -138,6 +138,7 @@ dotnet_diagnostic.RCS1250.severity = suggestion dotnet_diagnostic.RCS1252.severity = suggestion dotnet_diagnostic.RCS1253.severity = suggestion dotnet_diagnostic.RCS1254.severity = suggestion +dotnet_diagnostic.RCS1255.severity = suggestion dotnet_diagnostic.IDE0007.severity = none dotnet_diagnostic.IDE0007WithoutSuggestion.severity = none diff --git a/ChangeLog.md b/ChangeLog.md index ca7ed24c03..ecb7a1ab5f 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -12,8 +12,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add Arm64 VS 2022 extension support ([#990](https://github.com/JosefPihrt/Roslynator/pull/990) by @snickler). - Add analyzer "Add/remove blank line after file scoped namespace declaration" [RCS0060](https://github.com/JosefPihrt/Roslynator/blob/main/docs/analyzers/RCS0060.md) ([#993](https://github.com/josefpihrt/roslynator/pull/993). - Required option: `roslynator_blank_line_after_file_scoped_namespace_declaration = true|false` + - Not enabled by default - Add analyzer "Simplify argument null check" ([RCS1255](https://github.com/JosefPihrt/Roslynator/blob/main/docs/analyzers/RCS1255.md)) ([#994](https://github.com/JosefPihrt/Roslynator/pull/994)). - Use `ArgumentNullException.ThrowIfNull` instead of `if` null check. + - Not enabled by default ### Changed diff --git a/src/Analyzers/Analyzers.xml b/src/Analyzers/Analyzers.xml index 380e95f9d9..7124e69790 100644 --- a/src/Analyzers/Analyzers.xml +++ b/src/Analyzers/Analyzers.xml @@ -5746,7 +5746,7 @@ void M() Simplify argument null check. General Info - true + false Use `ArgumentNullException.ThrowIfNull` instead of `if` null check. diff --git a/src/Analyzers/CSharp/Analysis/SimplifyArgumentNullCheckAnalyzer.cs b/src/Analyzers/CSharp/Analysis/SimplifyArgumentNullCheckAnalyzer.cs index c34d22a273..a18279046c 100644 --- a/src/Analyzers/CSharp/Analysis/SimplifyArgumentNullCheckAnalyzer.cs +++ b/src/Analyzers/CSharp/Analysis/SimplifyArgumentNullCheckAnalyzer.cs @@ -42,7 +42,7 @@ private static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context) NullCheckExpressionInfo nullCheck = SyntaxInfo.NullCheckExpressionInfo( ifStatement.Condition, - NullCheckStyles.CheckingNull); + NullCheckStyles.EqualsToNull | NullCheckStyles.IsNull); if (!nullCheck.Success) return; diff --git a/src/Analyzers/CSharp/DiagnosticRules.Generated.cs b/src/Analyzers/CSharp/DiagnosticRules.Generated.cs index 1303a79bfb..bd08134461 100644 --- a/src/Analyzers/CSharp/DiagnosticRules.Generated.cs +++ b/src/Analyzers/CSharp/DiagnosticRules.Generated.cs @@ -2504,7 +2504,7 @@ public static partial class DiagnosticRules messageFormat: "Simplify argument null check.", category: DiagnosticCategories.Roslynator, defaultSeverity: DiagnosticSeverity.Info, - isEnabledByDefault: true, + isEnabledByDefault: false, description: null, helpLinkUri: DiagnosticIdentifiers.SimplifyArgumentNullCheck, customTags: Array.Empty()); From 7b767ec0a8b7931127223059fe4662c715ebe7a2 Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Sat, 19 Nov 2022 15:16:31 +0100 Subject: [PATCH 8/8] update --- src/Tests/CSharp.Tests/CSharp.Tests.csproj | 2 +- .../CSharp.Workspaces.Tests/CSharp.Workspaces.Tests.csproj | 2 +- .../CodeAnalysis.Analyzers.Tests.csproj | 2 +- src/Tests/CodeFixes.Tests/CodeFixes.Tests.csproj | 2 +- src/Tests/Core.Tests/Core.Tests.csproj | 2 +- .../Formatting.Analyzers.Tests.csproj | 2 +- src/Tests/Refactorings.Tests/Refactorings.Tests.csproj | 2 +- src/Tests/TestConsole/TestConsole.csproj | 2 +- src/Tests/TestLibrary/TestLibrary.csproj | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Tests/CSharp.Tests/CSharp.Tests.csproj b/src/Tests/CSharp.Tests/CSharp.Tests.csproj index b044dc4390..43dbb5187a 100644 --- a/src/Tests/CSharp.Tests/CSharp.Tests.csproj +++ b/src/Tests/CSharp.Tests/CSharp.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + net6.0 diff --git a/src/Tests/CSharp.Workspaces.Tests/CSharp.Workspaces.Tests.csproj b/src/Tests/CSharp.Workspaces.Tests/CSharp.Workspaces.Tests.csproj index b878a18dbf..6bece60bf7 100644 --- a/src/Tests/CSharp.Workspaces.Tests/CSharp.Workspaces.Tests.csproj +++ b/src/Tests/CSharp.Workspaces.Tests/CSharp.Workspaces.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + net6.0 diff --git a/src/Tests/CodeAnalysis.Analyzers.Tests/CodeAnalysis.Analyzers.Tests.csproj b/src/Tests/CodeAnalysis.Analyzers.Tests/CodeAnalysis.Analyzers.Tests.csproj index 460b8d9b69..d71efa9844 100644 --- a/src/Tests/CodeAnalysis.Analyzers.Tests/CodeAnalysis.Analyzers.Tests.csproj +++ b/src/Tests/CodeAnalysis.Analyzers.Tests/CodeAnalysis.Analyzers.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + net6.0 diff --git a/src/Tests/CodeFixes.Tests/CodeFixes.Tests.csproj b/src/Tests/CodeFixes.Tests/CodeFixes.Tests.csproj index 281ea2394c..1012a9016c 100644 --- a/src/Tests/CodeFixes.Tests/CodeFixes.Tests.csproj +++ b/src/Tests/CodeFixes.Tests/CodeFixes.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + net6.0 diff --git a/src/Tests/Core.Tests/Core.Tests.csproj b/src/Tests/Core.Tests/Core.Tests.csproj index f7728612f4..f912775826 100644 --- a/src/Tests/Core.Tests/Core.Tests.csproj +++ b/src/Tests/Core.Tests/Core.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + net6.0 diff --git a/src/Tests/Formatting.Analyzers.Tests/Formatting.Analyzers.Tests.csproj b/src/Tests/Formatting.Analyzers.Tests/Formatting.Analyzers.Tests.csproj index 36668c3ba0..1340a3b67a 100644 --- a/src/Tests/Formatting.Analyzers.Tests/Formatting.Analyzers.Tests.csproj +++ b/src/Tests/Formatting.Analyzers.Tests/Formatting.Analyzers.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + net6.0 diff --git a/src/Tests/Refactorings.Tests/Refactorings.Tests.csproj b/src/Tests/Refactorings.Tests/Refactorings.Tests.csproj index d8a46dad3f..94d7e7d09a 100644 --- a/src/Tests/Refactorings.Tests/Refactorings.Tests.csproj +++ b/src/Tests/Refactorings.Tests/Refactorings.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + net6.0 diff --git a/src/Tests/TestConsole/TestConsole.csproj b/src/Tests/TestConsole/TestConsole.csproj index c6bbf19242..11a227d4e5 100644 --- a/src/Tests/TestConsole/TestConsole.csproj +++ b/src/Tests/TestConsole/TestConsole.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net6.0 diff --git a/src/Tests/TestLibrary/TestLibrary.csproj b/src/Tests/TestLibrary/TestLibrary.csproj index 75dbe5c172..cb0d038cec 100644 --- a/src/Tests/TestLibrary/TestLibrary.csproj +++ b/src/Tests/TestLibrary/TestLibrary.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net6.0