Skip to content

Commit 8b8b005

Browse files
committed
Allow paragraphs before the last to end with ':' instead of '.'
1 parent 2d7aa8e commit 8b8b005

2 files changed

Lines changed: 38 additions & 3 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers.Test/DocumentationRules/SA1629UnitTests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,38 @@ public interface ITest
486486
await this.VerifyCSharpFixAsync(testCode, fixedTestCode).ConfigureAwait(false);
487487
}
488488

489+
[Fact]
490+
public async Task TestMultipleParagraphBlocksWithColonsAsync()
491+
{
492+
var testCode = @"
493+
/// <summary>
494+
/// <para>Paragraph 1:</para>
495+
/// <para>Paragraph 2:</para>
496+
/// <para>Paragraph 3:</para>
497+
/// </summary>
498+
public interface ITest
499+
{
500+
}
501+
";
502+
503+
var fixedTestCode = @"
504+
/// <summary>
505+
/// <para>Paragraph 1:</para>
506+
/// <para>Paragraph 2:</para>
507+
/// <para>Paragraph 3:.</para>
508+
/// </summary>
509+
public interface ITest
510+
{
511+
}
512+
";
513+
514+
DiagnosticResult expected = this.CSharpDiagnostic().WithLocation(5, 23);
515+
516+
await this.VerifyCSharpDiagnosticAsync(testCode, expected, CancellationToken.None).ConfigureAwait(false);
517+
await this.VerifyCSharpDiagnosticAsync(fixedTestCode, EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
518+
await this.VerifyCSharpFixAsync(testCode, fixedTestCode).ConfigureAwait(false);
519+
}
520+
489521
[Fact]
490522
public async Task TestMultipleParagraphInlinesAsync()
491523
{

StyleCop.Analyzers/StyleCop.Analyzers/DocumentationRules/SA1629DocumentationTextMustEndWithAPeriod.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ protected override void HandleXmlElement(SyntaxNodeAnalysisContext context, bool
7878
{
7979
foreach (var xmlElement in syntaxList.OfType<XmlElementSyntax>())
8080
{
81-
HandleSectionOrBlockXmlElement(context, xmlElement);
81+
HandleSectionOrBlockXmlElement(context, xmlElement, startingWithFinalParagraph: true);
8282
}
8383
}
8484

@@ -101,7 +101,7 @@ protected override void HandleCompleteDocumentation(SyntaxNodeAnalysisContext co
101101
}
102102
}
103103

104-
private static void HandleSectionOrBlockXmlElement(SyntaxNodeAnalysisContext context, XmlElementSyntax xmlElement)
104+
private static void HandleSectionOrBlockXmlElement(SyntaxNodeAnalysisContext context, XmlElementSyntax xmlElement, bool startingWithFinalParagraph)
105105
{
106106
if (xmlElement.StartTag?.Name?.LocalName.ValueText == XmlCommentHelper.SeeAlsoXmlTag)
107107
{
@@ -121,6 +121,7 @@ private static void HandleSectionOrBlockXmlElement(SyntaxNodeAnalysisContext con
121121
if (!string.IsNullOrEmpty(textWithoutTrailingWhitespace))
122122
{
123123
if (!textWithoutTrailingWhitespace.EndsWith(".", StringComparison.Ordinal)
124+
&& (startingWithFinalParagraph || !textWithoutTrailingWhitespace.EndsWith(":", StringComparison.Ordinal))
124125
&& !textWithoutTrailingWhitespace.EndsWith("-or-", StringComparison.Ordinal))
125126
{
126127
var location = Location.Create(xmlElement.SyntaxTree, new TextSpan(textToken.SpanStart + textWithoutTrailingWhitespace.Length, 1));
@@ -145,7 +146,7 @@ private static void HandleSectionOrBlockXmlElement(SyntaxNodeAnalysisContext con
145146
case XmlCommentHelper.NoteXmlTag:
146147
case XmlCommentHelper.ParaXmlTag:
147148
// Recursively handle <note> and <para> elements
148-
HandleSectionOrBlockXmlElement(context, childXmlElement);
149+
HandleSectionOrBlockXmlElement(context, childXmlElement, startingWithFinalParagraph);
149150
break;
150151

151152
default:
@@ -155,6 +156,7 @@ private static void HandleSectionOrBlockXmlElement(SyntaxNodeAnalysisContext con
155156
if (childXmlElement.IsBlockElement())
156157
{
157158
currentParagraphDone = false;
159+
startingWithFinalParagraph = false;
158160
}
159161
}
160162
else if (xmlElement.Content[i] is XmlEmptyElementSyntax emptyElement)
@@ -163,6 +165,7 @@ private static void HandleSectionOrBlockXmlElement(SyntaxNodeAnalysisContext con
163165
if (emptyElement.Name?.LocalName.ValueText == XmlCommentHelper.ParaXmlTag)
164166
{
165167
currentParagraphDone = false;
168+
startingWithFinalParagraph = false;
166169
}
167170
}
168171
}

0 commit comments

Comments
 (0)