Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/analysis/Analyzers/ExplicitNumberDeclarationAnalyzer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,11 @@ private static void AnalyzeForEachStatement(SyntaxNodeAnalysisContext context)

private static void ReportIfPrimitiveNumber(SyntaxNodeAnalysisContext context, SyntaxToken identifier, ISymbol? symbol)
{
if (identifier.Text == "_")
{
return;
}

if (symbol is ILocalSymbol local && IsSystemPrimitiveNumber(local.Type))
{
context.ReportDiagnostic(Diagnostic.Create(
Expand Down
151 changes: 141 additions & 10 deletions test/AnalyzerTests/SMA8001_ExplicitNumberDeclarationAnalyzerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ await VerifyCS.VerifyAnalyzerAsync(test,
}

[TestMethod]
public async Task SMA8001_Violation_OtherVarDeclarationsWithPrimitiveNumbers()
public async Task SMA8001_Violation_OutVarDeclaration()
{
var test = @"
using System.Collections.Generic;
Expand All @@ -171,28 +171,159 @@ public void M(Dictionary<string, int> dict)
if (dict.TryGetValue(""key"", out var {|#0:value|}))
{
}
}
}
}
";
await VerifyCS.VerifyAnalyzerAsync(test,
VerifyCS.Diagnostic(ExplicitNumberDeclarationAnalyzer.RuleId_ExplicitNumber).WithLocation(0).WithArguments("value")
);
}

foreach (var {|#1:item|} in new int[] { 1, 2, 3 })
[TestMethod]
public async Task SMA8001_Violation_ForEachVariable()
{
var test = @"
namespace Test
{
public class C
{
public void M()
{
foreach (var {|#0:item|} in new int[] { 1, 2, 3 })
{
}
}
}
}
";
await VerifyCS.VerifyAnalyzerAsync(test,
VerifyCS.Diagnostic(ExplicitNumberDeclarationAnalyzer.RuleId_ExplicitNumber).WithLocation(0).WithArguments("item")
);
}

var ({|#2:a|}, {|#3:b|}) = (1, 2.0);
[TestMethod]
public async Task SMA8001_Violation_Deconstruction()
{
var test = @"
namespace Test
{
public class C
{
public void M()
{
var ({|#0:a|}, {|#1:b|}) = (1, 2.0);
}
}
}
";
await VerifyCS.VerifyAnalyzerAsync(test,
VerifyCS.Diagnostic(ExplicitNumberDeclarationAnalyzer.RuleId_ExplicitNumber).WithLocation(0).WithArguments("a"),
VerifyCS.Diagnostic(ExplicitNumberDeclarationAnalyzer.RuleId_ExplicitNumber).WithLocation(1).WithArguments("b")
);
}

foreach (var ({|#4:x|}, {|#5:y|}) in new (int, int)[] { (1, 2) })
[TestMethod]
public async Task SMA8001_Violation_ForEachDeconstruction()
{
var test = @"
namespace Test
{
public class C
{
public void M()
{
foreach (var ({|#0:x|}, {|#1:y|}) in new (int, int)[] { (1, 2) })
{
}
}
}
}
";
await VerifyCS.VerifyAnalyzerAsync(test,
VerifyCS.Diagnostic(ExplicitNumberDeclarationAnalyzer.RuleId_ExplicitNumber).WithLocation(0).WithArguments("value"),
VerifyCS.Diagnostic(ExplicitNumberDeclarationAnalyzer.RuleId_ExplicitNumber).WithLocation(1).WithArguments("item"),
VerifyCS.Diagnostic(ExplicitNumberDeclarationAnalyzer.RuleId_ExplicitNumber).WithLocation(2).WithArguments("a"),
VerifyCS.Diagnostic(ExplicitNumberDeclarationAnalyzer.RuleId_ExplicitNumber).WithLocation(3).WithArguments("b"),
VerifyCS.Diagnostic(ExplicitNumberDeclarationAnalyzer.RuleId_ExplicitNumber).WithLocation(4).WithArguments("x"),
VerifyCS.Diagnostic(ExplicitNumberDeclarationAnalyzer.RuleId_ExplicitNumber).WithLocation(5).WithArguments("y")
VerifyCS.Diagnostic(ExplicitNumberDeclarationAnalyzer.RuleId_ExplicitNumber).WithLocation(0).WithArguments("x"),
VerifyCS.Diagnostic(ExplicitNumberDeclarationAnalyzer.RuleId_ExplicitNumber).WithLocation(1).WithArguments("y")
);
}

[TestMethod]
public async Task SMA8001_Violation_DeconstructionWithDiscard()
{
var test = @"
namespace Test
{
public class C
{
public void M()
{
var (_, {|#0:b|}) = (1, 2);
}
}
}
";
await VerifyCS.VerifyAnalyzerAsync(test,
VerifyCS.Diagnostic(ExplicitNumberDeclarationAnalyzer.RuleId_ExplicitNumber).WithLocation(0).WithArguments("b")
);
}

[TestMethod]
public async Task SMA8001_Compliant_OutVarWithDiscard()
{
var test = @"
using System.Collections.Generic;

namespace Test
{
public class C
{
public void M(Dictionary<string, int> dict)
{
if (dict.TryGetValue(""key"", out var _))
{
}
}
}
}
";
await VerifyCS.VerifyAnalyzerAsync(test);
}

[TestMethod]
public async Task SMA8001_Compliant_ForEachWithDiscard()
{
var test = @"
namespace Test
{
public class C
{
public void M()
{
foreach (var _ in new int[] { 1, 2, 3 })
{
}
}
}
}
";
await VerifyCS.VerifyAnalyzerAsync(test);
}

[TestMethod]
public async Task SMA8001_Compliant_DiscardAssignment()
{
var test = @"
namespace Test
{
public class C
{
public void M()
{
var _ = 1;
}
}
}
";
await VerifyCS.VerifyAnalyzerAsync(test);
}
}
}
Loading