Skip to content

Commit 83a8107

Browse files
committed
Added test case for array type parameter and fixed issues with array type parameters
1 parent 84f14c1 commit 83a8107

4 files changed

Lines changed: 46 additions & 21 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers.CodeFixes/ReadabilityRules/SA1135CodeFixProvider.cs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,10 @@ private static SyntaxNode GetReplacementNode(SemanticModel semanticModel, UsingD
6868
var symbolNameSyntax = SyntaxFactory.ParseName(symbolInfo.Symbol.ToQualifiedString());
6969

7070
var newName = GetReplacementName(symbolNameSyntax, node.Name);
71-
return node.WithName(newName);
71+
return node.WithName((NameSyntax)newName);
7272
}
7373

74-
private static NameSyntax GetReplacementName(NameSyntax symbolNameSyntax, NameSyntax nameSyntax)
74+
private static TypeSyntax GetReplacementName(TypeSyntax symbolNameSyntax, TypeSyntax nameSyntax)
7575
{
7676
switch (nameSyntax.Kind())
7777
{
@@ -86,7 +86,7 @@ private static NameSyntax GetReplacementName(NameSyntax symbolNameSyntax, NameSy
8686
}
8787
}
8888

89-
private static NameSyntax GetReplacementGenericName(NameSyntax symbolNameSyntax, GenericNameSyntax genericNameSyntax)
89+
private static NameSyntax GetReplacementGenericName(TypeSyntax symbolNameSyntax, GenericNameSyntax genericNameSyntax)
9090
{
9191
var symbolQualifiedNameSyntax = symbolNameSyntax as QualifiedNameSyntax;
9292
var symbolGenericNameSyntax = (GenericNameSyntax)(symbolQualifiedNameSyntax?.Right ?? symbolNameSyntax);
@@ -104,19 +104,20 @@ private static NameSyntax GetReplacementGenericName(NameSyntax symbolNameSyntax,
104104

105105
private static TypeArgumentListSyntax GetReplacementTypeArgumentList(GenericNameSyntax symbolGenericNameSyntax, GenericNameSyntax genericNameSyntax)
106106
{
107-
var replacements = new Dictionary<NameSyntax, NameSyntax>();
107+
var replacements = new Dictionary<TypeSyntax, TypeSyntax>();
108108
for (var i = 0; i < genericNameSyntax.TypeArgumentList.Arguments.Count; i++)
109109
{
110-
if (!genericNameSyntax.TypeArgumentList.Arguments[i].IsKind(SyntaxKind.PredefinedType))
110+
var argument = genericNameSyntax.TypeArgumentList.Arguments[i];
111+
112+
if (!argument.IsKind(SyntaxKind.PredefinedType))
111113
{
112-
var argument = (NameSyntax)genericNameSyntax.TypeArgumentList.Arguments[i];
113-
var symbolArgument = (NameSyntax)symbolGenericNameSyntax.TypeArgumentList.Arguments[i];
114+
var symbolArgument = symbolGenericNameSyntax.TypeArgumentList.Arguments[i];
114115

115-
var replacementArgument = GetReplacementName(symbolArgument, argument)
116-
.WithLeadingTrivia(argument.GetLeadingTrivia())
117-
.WithTrailingTrivia(argument.GetTrailingTrivia());
116+
var replacementArgument = GetReplacementName(symbolArgument, argument)
117+
.WithLeadingTrivia(argument.GetLeadingTrivia())
118+
.WithTrailingTrivia(argument.GetTrailingTrivia());
118119

119-
replacements.Add(argument, replacementArgument);
120+
replacements.Add(argument, replacementArgument);
120121
}
121122
}
122123

StyleCop.Analyzers/StyleCop.Analyzers.Test/ReadabilityRules/SA1135UnitTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,8 @@ namespace Test
257257
Exception>;
258258
259259
using Example2 = ValueTuple<
260-
Exception,
261-
Exception>;
260+
Exception[],
261+
Exception[,,]>;
262262
263263
using Example3 = ValueTuple<
264264
ValueTuple<
@@ -282,8 +282,8 @@ namespace Test
282282
System.Exception>;
283283
284284
using Example2 = System.ValueTuple<
285-
System.Exception,
286-
System.Exception>;
285+
System.Exception[],
286+
System.Exception[,,]>;
287287
288288
using Example3 = System.ValueTuple<
289289
System.ValueTuple<
@@ -300,7 +300,7 @@ namespace Test
300300
DiagnosticResult[] expected =
301301
{
302302
Diagnostic(SA1135UsingDirectivesMustBeQualified.DescriptorType).WithLocation(7, 5).WithArguments("System.ValueTuple<System.Exception, System.Exception>"),
303-
Diagnostic(SA1135UsingDirectivesMustBeQualified.DescriptorType).WithLocation(11, 5).WithArguments("System.ValueTuple<System.Exception, System.Exception>"),
303+
Diagnostic(SA1135UsingDirectivesMustBeQualified.DescriptorType).WithLocation(11, 5).WithArguments("System.ValueTuple<System.Exception[], System.Exception[,,]>"),
304304
Diagnostic(SA1135UsingDirectivesMustBeQualified.DescriptorType).WithLocation(15, 5).WithArguments("System.ValueTuple<System.ValueTuple<System.Exception, System.Exception>, System.Exception>"),
305305
Diagnostic(SA1135UsingDirectivesMustBeQualified.DescriptorType).WithLocation(21, 5).WithArguments("System.ValueTuple<System.Exception, System.Exception>"),
306306
};

StyleCop.Analyzers/StyleCop.Analyzers/Helpers/SymbolNameHelpers.cs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
namespace StyleCop.Analyzers.Helpers
55
{
6-
using System;
76
using System.Text;
87
using Microsoft.CodeAnalysis;
98
using Microsoft.CodeAnalysis.CSharp.Syntax;
@@ -73,9 +72,25 @@ public static string ToQualifiedString(this ISymbol symbol)
7372

7473
private static void AppendQualifiedSymbolName(StringBuilder builder, ISymbol symbol)
7574
{
76-
builder.Append(symbol.ContainingNamespace.ToDisplayString());
77-
builder.Append(".");
78-
builder.Append(symbol.Name);
75+
switch (symbol)
76+
{
77+
case IArrayTypeSymbol arraySymbol:
78+
builder
79+
.Append(arraySymbol.ElementType.ContainingNamespace.ToDisplayString())
80+
.Append(".")
81+
.Append(arraySymbol.ElementType.Name)
82+
.Append("[")
83+
.Append(',', arraySymbol.Rank - 1)
84+
.Append("]");
85+
break;
86+
87+
default:
88+
builder
89+
.Append(symbol.ContainingNamespace.ToDisplayString())
90+
.Append(".")
91+
.Append(symbol.Name);
92+
break;
93+
}
7994
}
8095
}
8196
}

StyleCop.Analyzers/StyleCop.Analyzers/ReadabilityRules/SA1135UsingDirectivesMustBeQualified.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ private static void CheckUsingDeclaration(SyntaxNodeAnalysisContext context, Usi
124124
private static string UsingDirectiveSyntaxToCanonicalString(UsingDirectiveSyntax usingDirective)
125125
{
126126
var builder = StringBuilderPool.Allocate();
127+
var insideArrayDeclaration = false;
127128

128129
// NOTE: this does not cover embedded comments. It is very unlikely that comments are present
129130
// within a multiline using statement and handling them requires a lot more effort (and keeping of state).
@@ -136,8 +137,16 @@ private static string UsingDirectiveSyntaxToCanonicalString(UsingDirectiveSyntax
136137
case '\r':
137138
case '\n':
138139
break;
140+
case '[':
141+
insideArrayDeclaration = true;
142+
builder.Append(c);
143+
break;
144+
case ']':
145+
insideArrayDeclaration = false;
146+
builder.Append(c);
147+
break;
139148
case ',':
140-
builder.Append(", ");
149+
builder.Append(insideArrayDeclaration ? "," : ", ");
141150
break;
142151
default:
143152
builder.Append(c);

0 commit comments

Comments
 (0)