diff --git a/StyleCop.Analyzers/StyleCop.Analyzers.Test/LayoutRules/SA1514UnitTests.cs b/StyleCop.Analyzers/StyleCop.Analyzers.Test/LayoutRules/SA1514UnitTests.cs
index f276e60e6..39072fce0 100644
--- a/StyleCop.Analyzers/StyleCop.Analyzers.Test/LayoutRules/SA1514UnitTests.cs
+++ b/StyleCop.Analyzers/StyleCop.Analyzers.Test/LayoutRules/SA1514UnitTests.cs
@@ -829,33 +829,143 @@ public void Method2()
}
";
- var fixedCode = @"
+ await this.VerifyCSharpDiagnosticAsync(testCode, EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
+ }
+
+ ///
+ /// Verifies that preprocessor directives before a documentation header are properly handled.
+ /// This is regression for https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/1231
+ ///
+ /// A representing the asynchronous unit test.
+ [Fact]
+ public async Task TestDirectivesPrecedingDocumentationAsync()
+ {
+ var testCode = @"
public class TestClass
{
- #pragma warning disable RS1012
-
+#if true
///
/// ...
///
public void Method1()
{
}
+#else
+ ///
+ /// ...
+ ///
+ public void Method2()
+ {
+ }
+#endif
+ ///
+ /// ...
+ ///
+ public void Method3()
+ {
+ }
- #pragma checksum ""test0.cs"" ""{00000000-0000-0000-0000-000000000000}"" ""{01234567}"" // comment
+#region SomeRegion
+ ///
+ /// ...
+ ///
+ public void Method4()
+ {
+ }
+#endregion SomeRegion
+ ///
+ /// ...
+ ///
+ public void Method5()
+ {
+ }
+
+#region AnotherRegion // comment
+ ///
+ /// ...
+ ///
+ public void Method6()
+ {
+ }
+#endregion AnotherRegion // comment
+ ///
+ /// ...
+ ///
+ public void Method7()
+ {
+ }
+}
+";
+ var fixedCode = @"
+public class TestClass
+{
+#if true
+ ///
+ /// ...
+ ///
+ public void Method1()
+ {
+ }
+#else
///
/// ...
///
public void Method2()
{
}
+#endif
+
+ ///
+ /// ...
+ ///
+ public void Method3()
+ {
+ }
+
+#region SomeRegion
+
+ ///
+ /// ...
+ ///
+ public void Method4()
+ {
+ }
+#endregion SomeRegion
+
+ ///
+ /// ...
+ ///
+ public void Method5()
+ {
+ }
+
+#region AnotherRegion // comment
+
+ ///
+ /// ...
+ ///
+ public void Method6()
+ {
+ }
+#endregion AnotherRegion // comment
+
+ ///
+ /// ...
+ ///
+ public void Method7()
+ {
+ }
}
";
DiagnosticResult[] expected =
{
- this.CSharpDiagnostic().WithLocation(5, 5),
- this.CSharpDiagnostic().WithLocation(13, 5)
+ this.CSharpDiagnostic().WithLocation(19, 5),
+ this.CSharpDiagnostic().WithLocation(27, 5),
+ this.CSharpDiagnostic().WithLocation(34, 5),
+ this.CSharpDiagnostic().WithLocation(42, 5),
+ this.CSharpDiagnostic().WithLocation(49, 5)
};
await this.VerifyCSharpDiagnosticAsync(testCode, expected, CancellationToken.None).ConfigureAwait(false);
diff --git a/StyleCop.Analyzers/StyleCop.Analyzers/LayoutRules/SA1514ElementDocumentationHeaderMustBePrecededByBlankLine.cs b/StyleCop.Analyzers/StyleCop.Analyzers/LayoutRules/SA1514ElementDocumentationHeaderMustBePrecededByBlankLine.cs
index e86092ab2..a6cf31c48 100644
--- a/StyleCop.Analyzers/StyleCop.Analyzers/LayoutRules/SA1514ElementDocumentationHeaderMustBePrecededByBlankLine.cs
+++ b/StyleCop.Analyzers/StyleCop.Analyzers/LayoutRules/SA1514ElementDocumentationHeaderMustBePrecededByBlankLine.cs
@@ -113,22 +113,26 @@ private static void HandleDeclaration(SyntaxNodeAnalysisContext context)
var done = false;
for (var i = documentationHeaderIndex - 1; !done && (i >= 0); i--)
{
- switch (triviaList[i].Kind())
+ var trivia = triviaList[i];
+ if (trivia.IsDirective
+ && !trivia.IsKind(SyntaxKind.EndIfDirectiveTrivia)
+ && !trivia.IsKind(SyntaxKind.RegionDirectiveTrivia)
+ && !trivia.IsKind(SyntaxKind.EndRegionDirectiveTrivia))
+ {
+ return;
+ }
+
+ switch (trivia.Kind())
{
case SyntaxKind.WhitespaceTrivia:
break;
case SyntaxKind.EndOfLineTrivia:
eolCount++;
break;
- case SyntaxKind.IfDirectiveTrivia:
- case SyntaxKind.ElseDirectiveTrivia:
- case SyntaxKind.ElifDirectiveTrivia:
- // if the documentation header is inside a directive trivia, no leading blank line is needed
- return;
case SyntaxKind.EndIfDirectiveTrivia:
- case SyntaxKind.PragmaWarningDirectiveTrivia:
- case SyntaxKind.PragmaChecksumDirectiveTrivia:
+ case SyntaxKind.RegionDirectiveTrivia:
+ case SyntaxKind.EndRegionDirectiveTrivia:
eolCount++;
done = true;
break;