From 56af89713bee6b28a3f1566903e4818e1b227139 Mon Sep 17 00:00:00 2001 From: Josef Pihrt Date: Sat, 13 Nov 2021 10:59:33 +0100 Subject: [PATCH] Remove some cases from "RemoveRedundantInitialization" analyzers (RCS1129, RCS1188) --- ...ndantAutoPropertyInitializationAnalyzer.cs | 25 +++- ...oveRedundantFieldInitializationAnalyzer.cs | 24 +++- ...RemoveRedundantFieldInitializationTests.cs | 110 ++++-------------- ...edundantAutoPropertyInitializationTests.cs | 34 +++--- 4 files changed, 88 insertions(+), 105 deletions(-) diff --git a/src/Analyzers/CSharp/Analysis/RemoveRedundantAutoPropertyInitializationAnalyzer.cs b/src/Analyzers/CSharp/Analysis/RemoveRedundantAutoPropertyInitializationAnalyzer.cs index e7b03dfadc..81880608ba 100644 --- a/src/Analyzers/CSharp/Analysis/RemoveRedundantAutoPropertyInitializationAnalyzer.cs +++ b/src/Analyzers/CSharp/Analysis/RemoveRedundantAutoPropertyInitializationAnalyzer.cs @@ -43,7 +43,10 @@ private static void AnalyzePropertyDeclaration(SyntaxNodeAnalysisContext context ExpressionSyntax value = initializer?.Value?.WalkDownParentheses(); - if (value?.IsKind(SyntaxKind.SuppressNullableWarningExpression) != false) + if (value == null) + return; + + if (!CanBeConstantValue(value)) return; if (initializer.SpanOrLeadingTriviaContainsDirectives()) @@ -62,5 +65,25 @@ private static void AnalyzePropertyDeclaration(SyntaxNodeAnalysisContext context DiagnosticHelpers.ReportDiagnostic(context, DiagnosticRules.RemoveRedundantAutoPropertyInitialization, value); } + + private static bool CanBeConstantValue(ExpressionSyntax value) + { + if (value is CastExpressionSyntax castExpression) + value = castExpression.Expression.WalkDownParentheses(); + + switch (value.Kind()) + { + case SyntaxKind.NullLiteralExpression: + case SyntaxKind.NumericLiteralExpression: + case SyntaxKind.TrueLiteralExpression: + case SyntaxKind.FalseLiteralExpression: + case SyntaxKind.CharacterLiteralExpression: + case SyntaxKind.DefaultLiteralExpression: + case SyntaxKind.DefaultExpression: + return true; + default: + return false; + } + } } } diff --git a/src/Analyzers/CSharp/Analysis/RemoveRedundantFieldInitializationAnalyzer.cs b/src/Analyzers/CSharp/Analysis/RemoveRedundantFieldInitializationAnalyzer.cs index f055348d82..a7b620516c 100644 --- a/src/Analyzers/CSharp/Analysis/RemoveRedundantFieldInitializationAnalyzer.cs +++ b/src/Analyzers/CSharp/Analysis/RemoveRedundantFieldInitializationAnalyzer.cs @@ -1,5 +1,6 @@ // 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; using System.Collections.Immutable; using System.Threading; using Microsoft.CodeAnalysis; @@ -53,7 +54,11 @@ private static void AnalyzeFieldDeclaration(SyntaxNodeAnalysisContext context) if (initializer?.ContainsDirectives == false) { ExpressionSyntax value = initializer.Value?.WalkDownParentheses(); - if (value?.IsKind(SyntaxKind.SuppressNullableWarningExpression) == false) + + if (value is CastExpressionSyntax castExpression) + value = castExpression.Expression.WalkDownParentheses(); + + if (CanBeConstantValue(value)) { SemanticModel semanticModel = context.SemanticModel; CancellationToken cancellationToken = context.CancellationToken; @@ -76,5 +81,22 @@ private static void AnalyzeFieldDeclaration(SyntaxNodeAnalysisContext context) } } } + + private static bool CanBeConstantValue(ExpressionSyntax value) + { + switch (value.Kind()) + { + case SyntaxKind.NullLiteralExpression: + case SyntaxKind.NumericLiteralExpression: + case SyntaxKind.TrueLiteralExpression: + case SyntaxKind.FalseLiteralExpression: + case SyntaxKind.CharacterLiteralExpression: + case SyntaxKind.DefaultLiteralExpression: + case SyntaxKind.DefaultExpression: + return true; + default: + return false; + } + } } } diff --git a/src/Tests/Analyzers.Tests/RCS1129RemoveRedundantFieldInitializationTests.cs b/src/Tests/Analyzers.Tests/RCS1129RemoveRedundantFieldInitializationTests.cs index 99fd464ced..3d544538a4 100644 --- a/src/Tests/Analyzers.Tests/RCS1129RemoveRedundantFieldInitializationTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1129RemoveRedundantFieldInitializationTests.cs @@ -99,26 +99,6 @@ class C "); } - [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.RemoveRedundantFieldInitialization)] - public async Task Test_BoolConst() - { - await VerifyDiagnosticAndFixAsync(@" -class C -{ - const bool K = false; - - bool _f [|= K|]; -} -", @" -class C -{ - const bool K = false; - - bool _f; -} -"); - } - [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.RemoveRedundantFieldInitialization)] public async Task Test_Char() { @@ -135,26 +115,6 @@ class C "); } - [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.RemoveRedundantFieldInitialization)] - public async Task Test_CharConst() - { - await VerifyDiagnosticAndFixAsync(@" -class C -{ - const char K = '\0'; - - char _f [|= K|]; -} -", @" -class C -{ - const char K = '\0'; - - char _f; -} -"); - } - [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.RemoveRedundantFieldInitialization)] public async Task Test_Int() { @@ -171,26 +131,6 @@ class C "); } - [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.RemoveRedundantFieldInitialization)] - public async Task Test_IntConst() - { - await VerifyDiagnosticAndFixAsync(@" -class C -{ - const int K = 0; - - int _f [|= K|]; -} -", @" -class C -{ - const int K = 0; - - int _f; -} -"); - } - [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.RemoveRedundantFieldInitialization)] public async Task Test_ULong() { @@ -207,26 +147,6 @@ class C "); } - [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.RemoveRedundantFieldInitialization)] - public async Task Test_ULongConst() - { - await VerifyDiagnosticAndFixAsync(@" -class C -{ - const ulong K = 0; - - ulong _f [|= K|]; -} -", @" -class C -{ - const ulong K = 0; - - ulong _f; -} -"); - } - [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.RemoveRedundantFieldInitialization)] public async Task Test_Enum() { @@ -237,10 +157,9 @@ class C { const RegexOptions RegexOptionsConst = RegexOptions.None; - RegexOptions _f1 [|= 0|]; - RegexOptions _f2 [|= RegexOptions.None|]; + RegexOptions _f1 [|= default|]; + RegexOptions _f2 [|= default(RegexOptions)|]; RegexOptions _f3 [|= (RegexOptions)0|]; - RegexOptions _f4 [|= RegexOptionsConst|]; } ", @" using System.Text.RegularExpressions; @@ -252,7 +171,6 @@ class C RegexOptions _f1; RegexOptions _f2; RegexOptions _f3; - RegexOptions _f4; } "); } @@ -265,18 +183,32 @@ class C { const string K = null; - string _s2 [|= null|]; - string _s3 [|= default(string)|]; - string _s4 [|= K|]; + string _s1 [|= null|]; + string _s2 [|= default(string)|]; } ", @" class C { const string K = null; + string _s1; string _s2; - string _s3; - string _s4; +} +"); + } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.RemoveRedundantFieldInitialization)] + public async Task TestNoDiagnostic() + { + await VerifyNoDiagnosticAsync(@" +using System.Text.RegularExpressions; + +class C +{ +const bool K = false; + + bool _k = K; + RegexOptions _r = RegexOptions.None; } "); } diff --git a/src/Tests/Analyzers.Tests/RCS1188RemoveRedundantAutoPropertyInitializationTests.cs b/src/Tests/Analyzers.Tests/RCS1188RemoveRedundantAutoPropertyInitializationTests.cs index 3349ec3733..cc2f6ab4b5 100644 --- a/src/Tests/Analyzers.Tests/RCS1188RemoveRedundantAutoPropertyInitializationTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1188RemoveRedundantAutoPropertyInitializationTests.cs @@ -22,8 +22,7 @@ class C const bool K = false; bool P1 { get; set; } = [|false|]; - bool P2 { get; set; } = [|K|]; - bool P3 { get; set; } = [|default|]; + bool P2 { get; set; } = [|default|]; } ", @" class C @@ -32,7 +31,6 @@ class C bool P1 { get; set; } bool P2 { get; set; } - bool P3 { get; set; } } "); } @@ -70,8 +68,7 @@ class C const char K = '\0'; char P1 { get; set; } = [|'\0'|]; - char P2 { get; set; } = [|K|]; - char P3 { get; set; } = [|default|]; + char P2 { get; set; } = [|default|]; } ", @" class C @@ -80,7 +77,6 @@ class C char P1 { get; set; } char P2 { get; set; } - char P3 { get; set; } } "); } @@ -96,7 +92,6 @@ class C string P1 { get; set; } = [|null|]; string P2 { get; set; } = [|default(string)|]; string P3 { get; set; } = [|default|]; - string P4 { get; set; } = [|K|]; } ", @" class C @@ -106,7 +101,6 @@ class C string P1 { get; set; } string P2 { get; set; } string P3 { get; set; } - string P4 { get; set; } } "); } @@ -121,8 +115,7 @@ class C int P1 { get; set; } = [|0|]; int P2 { get; set; } = [|(int)0|]; - int P3 { get; set; } = [|K|]; - int P4 { get; set; } = [|default|]; + int P3 { get; set; } = [|default|]; } ", @" class C @@ -132,7 +125,6 @@ class C int P1 { get; set; } int P2 { get; set; } int P3 { get; set; } - int P4 { get; set; } } "); } @@ -146,8 +138,7 @@ class C const ulong K = 0; ulong P1 { get; set; } = [|(ulong)0|]; - ulong P2 { get; set; } = [|K|]; - ulong P3 { get; set; } = [|default|]; + ulong P2 { get; set; } = [|default|]; } ", @" class C @@ -156,7 +147,6 @@ class C ulong P1 { get; set; } ulong P2 { get; set; } - ulong P3 { get; set; } } "); } @@ -193,6 +183,22 @@ class C "); } + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.RemoveRedundantFieldInitialization)] + public async Task TestNoDiagnostic() + { + await VerifyNoDiagnosticAsync(@" +using System.Text.RegularExpressions; + +class C +{ + const bool K = false; + + bool P1 { get; set; } = K; + RegexOptions P2 { get; set; } = RegexOptions.None; +} +"); + } + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.RemoveRedundantAutoPropertyInitialization)] public async Task TestNoDiagnostic_NoInitializer() {