Skip to content

Commit b694579

Browse files
committed
Merge pull request #1836 from sharwell/fix-1830
Fix handling of tabs inside of documentation comments
2 parents 932e6e9 + 3252adf commit b694579

2 files changed

Lines changed: 46 additions & 6 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers.Test/SpacingRules/SA1027UnitTests.cs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,13 @@ public void Bar()
101101
public async Task TestInvalidTabsInDocumentationCommentsAsync()
102102
{
103103
var testCode =
104-
"\t/// <summary>\r\n" +
105-
"\t/// foo bar\r\n" +
106-
"\t/// </summary>\r\n" +
104+
"\t///\t<summary>\r\n" +
105+
"\t/// foo\tbar\r\n" +
106+
"\t///\t</summary>\r\n" +
107107
"\tpublic class Foo\r\n" +
108108
"\t{\r\n" +
109-
"\t \t/// <MyElement> Value </MyElement>\r\n" +
110-
"\t\t/// <MyElement> Value </MyElement>\r\n" +
109+
"\t \t/// <MyElement>\tValue </MyElement>\r\n" +
110+
"\t\t/**\t \t<MyElement> Value </MyElement>\t*/\r\n" +
111111
"\t}\r\n";
112112

113113
var fixedTestCode = @" /// <summary>
@@ -116,19 +116,25 @@ public async Task TestInvalidTabsInDocumentationCommentsAsync()
116116
public class Foo
117117
{
118118
/// <MyElement> Value </MyElement>
119-
/// <MyElement> Value </MyElement>
119+
/** <MyElement> Value </MyElement> */
120120
}
121121
";
122122

123123
DiagnosticResult[] expected =
124124
{
125125
this.CSharpDiagnostic().WithLocation(1, 1),
126+
this.CSharpDiagnostic().WithLocation(1, 5),
126127
this.CSharpDiagnostic().WithLocation(2, 1),
128+
this.CSharpDiagnostic().WithLocation(2, 5),
127129
this.CSharpDiagnostic().WithLocation(3, 1),
130+
this.CSharpDiagnostic().WithLocation(3, 5),
128131
this.CSharpDiagnostic().WithLocation(4, 1),
129132
this.CSharpDiagnostic().WithLocation(5, 1),
130133
this.CSharpDiagnostic().WithLocation(6, 1),
134+
this.CSharpDiagnostic().WithLocation(6, 19),
131135
this.CSharpDiagnostic().WithLocation(7, 1),
136+
this.CSharpDiagnostic().WithLocation(7, 6),
137+
this.CSharpDiagnostic().WithLocation(7, 39),
132138
this.CSharpDiagnostic().WithLocation(8, 1),
133139
};
134140

StyleCop.Analyzers/StyleCop.Analyzers/SpacingRules/SA1027TabsMustNotBeUsed.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,11 @@ private static void HandleSyntaxTree(SyntaxTreeAnalysisContext context)
6969
HandleWhitespaceTrivia(context, trivia);
7070
break;
7171

72+
case SyntaxKind.SingleLineDocumentationCommentTrivia:
73+
case SyntaxKind.MultiLineDocumentationCommentTrivia:
74+
HandleDocumentationCommentTrivia(context, trivia);
75+
break;
76+
7277
default:
7378
break;
7479
}
@@ -93,5 +98,34 @@ private static void HandleWhitespaceTrivia(SyntaxTreeAnalysisContext context, Sy
9398
// Tabs must not be used.
9499
context.ReportDiagnostic(Diagnostic.Create(Descriptor, trivia.GetLocation()));
95100
}
101+
102+
private static void HandleWhitespaceToken(SyntaxTreeAnalysisContext context, SyntaxToken token)
103+
{
104+
string fullString = token.ToFullString();
105+
if (fullString.IndexOf('\t') < 0)
106+
{
107+
// No hard tabs were found.
108+
return;
109+
}
110+
111+
// Tabs must not be used.
112+
context.ReportDiagnostic(Diagnostic.Create(Descriptor, token.GetLocation()));
113+
}
114+
115+
private static void HandleDocumentationCommentTrivia(SyntaxTreeAnalysisContext context, SyntaxTrivia trivia)
116+
{
117+
foreach (var token in trivia.GetStructure().DescendantTokens(descendIntoTrivia: true))
118+
{
119+
switch (token.Kind())
120+
{
121+
case SyntaxKind.XmlTextLiteralToken:
122+
HandleWhitespaceToken(context, token);
123+
break;
124+
125+
default:
126+
break;
127+
}
128+
}
129+
}
96130
}
97131
}

0 commit comments

Comments
 (0)