From b7be789997ec79d2587480cb631b926fc7499f0e Mon Sep 17 00:00:00 2001 From: Youssef1313 Date: Tue, 15 Feb 2022 11:17:34 +0200 Subject: [PATCH] Respect PreferParameterNullChecking user option --- .../AddParameterCheckTests.cs | 42 ++++++++++++++----- ...ddParameterCheckCodeRefactoringProvider.cs | 9 +++- ...ddParameterCheckCodeRefactoringProvider.cs | 2 +- ...ddParameterCheckCodeRefactoringProvider.vb | 2 +- 4 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/EditorFeatures/CSharpTest/InitializeParameter/AddParameterCheckTests.cs b/src/EditorFeatures/CSharpTest/InitializeParameter/AddParameterCheckTests.cs index cc1287e100ecb..276d2c32f290e 100644 --- a/src/EditorFeatures/CSharpTest/InitializeParameter/AddParameterCheckTests.cs +++ b/src/EditorFeatures/CSharpTest/InitializeParameter/AddParameterCheckTests.cs @@ -29,30 +29,50 @@ public async Task TestEmptyFile() await VerifyCS.VerifyRefactoringAsync(code, code); } - [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInitializeParameter)] - public async Task TestSimpleReferenceType() + [Theory, Trait(Traits.Feature, Traits.Features.CodeActionsInitializeParameter)] + [InlineData("", true)] + [InlineData("csharp_style_prefer_parameter_null_checking = true", true)] + [InlineData("csharp_style_prefer_parameter_null_checking = false", false)] + public async Task TestSimpleReferenceType(string editorConfig, bool useParameterNullChecking) { - await new VerifyCS.Test - { - LanguageVersion = LanguageVersionExtensions.CSharpNext, - TestCode = @" + var fixedCode = useParameterNullChecking ? @" using System; class C { - public C([||]string s) + public C(string s!!) { } -}", - FixedCode = @" +}" : @" using System; class C { - public C(string s!!) + public C(string s) + { + if (s is null) + { + throw new ArgumentNullException(nameof(s)); + } + } +}"; + await new VerifyCS.Test + { + LanguageVersion = LanguageVersionExtensions.CSharpNext, + TestCode = @" +using System; + +class C +{ + public C([||]string s) { } -}" +}", + FixedCode = fixedCode, + EditorConfig = $@" +[*] +{editorConfig} +", }.RunAsync(); } diff --git a/src/Features/CSharp/Portable/InitializeParameter/CSharpAddParameterCheckCodeRefactoringProvider.cs b/src/Features/CSharp/Portable/InitializeParameter/CSharpAddParameterCheckCodeRefactoringProvider.cs index fd114d1d3d3ac..50021c5381471 100644 --- a/src/Features/CSharp/Portable/InitializeParameter/CSharpAddParameterCheckCodeRefactoringProvider.cs +++ b/src/Features/CSharp/Portable/InitializeParameter/CSharpAddParameterCheckCodeRefactoringProvider.cs @@ -5,6 +5,7 @@ using System; using System.Composition; using System.Threading; +using System.Threading.Tasks; using Microsoft.CodeAnalysis.CodeRefactorings; using Microsoft.CodeAnalysis.CSharp.CodeStyle; using Microsoft.CodeAnalysis.CSharp.Extensions; @@ -102,14 +103,18 @@ protected override StatementSyntax CreateParameterCheckIfStatement(DocumentOptio @else: null); } - protected override Document? TryAddNullCheckToParameterDeclaration(Document document, ParameterSyntax parameterSyntax, CancellationToken cancellationToken) + protected override async Task TryAddNullCheckToParameterDeclarationAsync(Document document, ParameterSyntax parameterSyntax, CancellationToken cancellationToken) { var tree = parameterSyntax.SyntaxTree; if (!tree.Options.LanguageVersion().IsCSharp11OrAbove()) return null; + var options = await document.GetOptionsAsync(cancellationToken).ConfigureAwait(false); + if (!options.GetOption(CSharpCodeStyleOptions.PreferParameterNullChecking).Value) + return null; + // We expect the syntax tree to already be in memory since we already have a node from the tree - var syntaxRoot = tree.GetRoot(cancellationToken); + var syntaxRoot = await tree.GetRootAsync(cancellationToken).ConfigureAwait(false); syntaxRoot = syntaxRoot.ReplaceNode( parameterSyntax, parameterSyntax.WithExclamationExclamationToken(Token(SyntaxKind.ExclamationExclamationToken))); diff --git a/src/Features/Core/Portable/InitializeParameter/AbstractAddParameterCheckCodeRefactoringProvider.cs b/src/Features/Core/Portable/InitializeParameter/AbstractAddParameterCheckCodeRefactoringProvider.cs index 62c1143f6fcda..364cb9b3fd588 100644 --- a/src/Features/Core/Portable/InitializeParameter/AbstractAddParameterCheckCodeRefactoringProvider.cs +++ b/src/Features/Core/Portable/InitializeParameter/AbstractAddParameterCheckCodeRefactoringProvider.cs @@ -42,7 +42,7 @@ internal abstract partial class AbstractAddParameterCheckCodeRefactoringProvider protected abstract bool PrefersThrowExpression(DocumentOptionSet options); protected abstract string EscapeResourceString(string input); protected abstract TStatementSyntax CreateParameterCheckIfStatement(DocumentOptionSet options, TExpressionSyntax condition, TStatementSyntax ifTrueStatement); - protected abstract Document? TryAddNullCheckToParameterDeclaration(Document document, TParameterSyntax parameterSyntax, CancellationToken cancellationToken); + protected abstract Task TryAddNullCheckToParameterDeclarationAsync(Document document, TParameterSyntax parameterSyntax, CancellationToken cancellationToken); protected override async Task> GetRefactoringsForAllParametersAsync( Document document, diff --git a/src/Features/VisualBasic/Portable/InitializeParameter/VisualBasicAddParameterCheckCodeRefactoringProvider.vb b/src/Features/VisualBasic/Portable/InitializeParameter/VisualBasicAddParameterCheckCodeRefactoringProvider.vb index 8872ff80664a8..07302fedbba90 100644 --- a/src/Features/VisualBasic/Portable/InitializeParameter/VisualBasicAddParameterCheckCodeRefactoringProvider.vb +++ b/src/Features/VisualBasic/Portable/InitializeParameter/VisualBasicAddParameterCheckCodeRefactoringProvider.vb @@ -72,7 +72,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.InitializeParameter elseBlock:=Nothing) End Function - Protected Overrides Function TryAddNullCheckToParameterDeclaration(document As Document, parameterSyntax As ParameterSyntax, cancellationToken As CancellationToken) As Document + Protected Overrides Function TryAddNullCheckToParameterDeclarationAsync(document As Document, parameterSyntax As ParameterSyntax, cancellationToken As CancellationToken) As Task(Of Document) Return Nothing End Function End Class