Skip to content

Commit af056c3

Browse files
committed
Update SA1305 to handle C# 7 features
* Support variable designators (pattern syntax) * Test local function parameters
1 parent fa46a54 commit af056c3

2 files changed

Lines changed: 74 additions & 2 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp7/NamingRules/SA1305CSharp7UnitTests.cs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,74 @@
33

44
namespace StyleCop.Analyzers.Test.CSharp7.NamingRules
55
{
6+
using System.Threading;
7+
using System.Threading.Tasks;
68
using StyleCop.Analyzers.Test.NamingRules;
9+
using TestHelper;
10+
using Xunit;
711

812
public class SA1305CSharp7UnitTests : SA1305UnitTests
913
{
14+
[Fact]
15+
public async Task TestInvalidVariableDesignatorNamesAreReportedAsync()
16+
{
17+
var testCode = @" public class TestClass
18+
{
19+
public void TestMethod()
20+
{
21+
var (baR, caRe, daRE, fAre) = (1, 2, 3, 4);
22+
}
23+
}
24+
";
25+
26+
DiagnosticResult[] expected =
27+
{
28+
this.CSharpDiagnostic().WithLocation(5, 14).WithArguments("variable", "baR"),
29+
this.CSharpDiagnostic().WithLocation(5, 19).WithArguments("variable", "caRe"),
30+
this.CSharpDiagnostic().WithLocation(5, 25).WithArguments("variable", "daRE"),
31+
this.CSharpDiagnostic().WithLocation(5, 31).WithArguments("variable", "fAre"),
32+
};
33+
34+
await this.VerifyCSharpDiagnosticAsync(testCode, expected, CancellationToken.None).ConfigureAwait(false);
35+
}
36+
37+
[Fact]
38+
public async Task TestParameterInLocalFunctionAsync()
39+
{
40+
var testCode = @"
41+
public class TypeName
42+
{
43+
public void MethodName()
44+
{
45+
void LocalFunction(bool abX)
46+
{
47+
}
48+
}
49+
}";
50+
51+
DiagnosticResult[] expected =
52+
{
53+
this.CSharpDiagnostic().WithArguments("parameter", "abX").WithLocation(6, 33),
54+
};
55+
56+
await this.VerifyCSharpDiagnosticAsync(testCode, expected, CancellationToken.None).ConfigureAwait(false);
57+
}
58+
59+
[Fact]
60+
public async Task TestParameterInNativeClassLocalFunctionAsync()
61+
{
62+
var testCode = @"
63+
public class TypeNameNativeMethods
64+
{
65+
public void MethodName()
66+
{
67+
void LocalFunction(bool abX)
68+
{
69+
}
70+
}
71+
}";
72+
73+
await this.VerifyCSharpDiagnosticAsync(testCode, EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
74+
}
1075
}
1176
}

StyleCop.Analyzers/StyleCop.Analyzers/NamingRules/SA1305FieldNamesMustNotUseHungarianNotation.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ namespace StyleCop.Analyzers.NamingRules
55
{
66
using System;
77
using System.Collections.Immutable;
8-
using System.Linq;
98
using System.Text.RegularExpressions;
10-
using Helpers;
119
using Microsoft.CodeAnalysis;
1210
using Microsoft.CodeAnalysis.CSharp;
1311
using Microsoft.CodeAnalysis.CSharp.Syntax;
1412
using Microsoft.CodeAnalysis.Diagnostics;
1513
using Settings.ObjectModel;
14+
using StyleCop.Analyzers.Helpers;
15+
using StyleCop.Analyzers.Lightup;
1616

1717
/// <summary>
1818
/// The name of a field or variable in C# uses Hungarian notation.
@@ -76,6 +76,7 @@ internal class SA1305FieldNamesMustNotUseHungarianNotation : DiagnosticAnalyzer
7676
private static readonly Action<SyntaxNodeAnalysisContext, StyleCopSettings> JoinClauseAction = Analyzer.HandleJoinClause;
7777
private static readonly Action<SyntaxNodeAnalysisContext, StyleCopSettings> JoinIntoClauseAction = Analyzer.HandleJoinIntoClause;
7878
private static readonly Action<SyntaxNodeAnalysisContext, StyleCopSettings> ForEachStatementAction = Analyzer.HandleForEachStatement;
79+
private static readonly Action<SyntaxNodeAnalysisContext, StyleCopSettings> SingleVariableDesignationAction = Analyzer.HandleSingleVariableDesignation;
7980

8081
/// <inheritdoc/>
8182
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } =
@@ -96,6 +97,7 @@ public override void Initialize(AnalysisContext context)
9697
context.RegisterSyntaxNodeAction(JoinClauseAction, SyntaxKind.JoinClause);
9798
context.RegisterSyntaxNodeAction(JoinIntoClauseAction, SyntaxKind.JoinIntoClause);
9899
context.RegisterSyntaxNodeAction(ForEachStatementAction, SyntaxKind.ForEachStatement);
100+
context.RegisterSyntaxNodeAction(SingleVariableDesignationAction, SyntaxKindEx.SingleVariableDesignation);
99101
}
100102

101103
private static class Analyzer
@@ -189,6 +191,11 @@ public static void HandleForEachStatement(SyntaxNodeAnalysisContext context, Sty
189191
CheckIdentifier(context, ((ForEachStatementSyntax)context.Node).Identifier, settings);
190192
}
191193

194+
public static void HandleSingleVariableDesignation(SyntaxNodeAnalysisContext context, StyleCopSettings settings)
195+
{
196+
CheckIdentifier(context, ((SingleVariableDesignationSyntaxWrapper)context.Node).Identifier, settings);
197+
}
198+
192199
private static void CheckIdentifier(SyntaxNodeAnalysisContext context, SyntaxToken identifier, StyleCopSettings settings, string declarationType = "variable")
193200
{
194201
if (identifier.IsMissing)

0 commit comments

Comments
 (0)