Skip to content
This repository was archived by the owner on Jul 12, 2022. It is now read-only.

Commit 5cf9e8a

Browse files
author
Lakshmi Priya Sekar
committed
Newline before using and namespace rule
1 parent 4f7f51a commit 5cf9e8a

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

src/Microsoft.DotNet.CodeFormatting/Microsoft.DotNet.CodeFormatting.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
<Compile Include="Filters\IgnoreDesignerGeneratedCodeFilter.cs" />
8080
<Compile Include="Properties\AssemblyInfo.cs" />
8181
<Compile Include="Rules\HasCopyrightHeaderFormattingRule.cs" />
82+
<Compile Include="Rules\HasNewLinesAtStartOfDocumentFormattingRule.cs" />
8283
<Compile Include="Rules\HasNoNewLineAfterOpenBraceFormattingRule.cs" />
8384
<Compile Include="Rules\HasNoNewLineBeforeEndBraceFormattingRule.cs" />
8485
<Compile Include="Rules\HasNoXmlBasedCopyrightHeaderFormattingRule.cs" />

src/Microsoft.DotNet.CodeFormatting/Rules/HasNewLinesAtStartOfDocumentFormattingRule.cs

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,40 @@ public async Task<Document> ProcessAsync(Document document, CancellationToken ca
2121
var syntaxRoot = await document.GetSyntaxRootAsync(cancellationToken) as CSharpSyntaxNode;
2222
if (syntaxRoot == null)
2323
return document;
24-
Document newDocument;
25-
// NewLine between copyright and using directives.
24+
IEnumerable<SyntaxNode> nodesToAdd = new List<SyntaxNode>();
2625
var firstUsing = syntaxRoot.DescendantNodesAndSelf().OfType<UsingDirectiveSyntax>().First();
27-
var hasEndOfLineTrivia = firstUsing.GetLeadingTrivia().First().CSharpKind() == SyntaxKind.EndOfLineTrivia;
28-
if (!hasEndOfLineTrivia)
26+
var firstNamespace = syntaxRoot.DescendantNodesAndSelf().OfType<NamespaceDeclarationSyntax>().First();
27+
// NewLine between copyright and using directives.
28+
var newUsingTriviaList = !firstUsing.HasLeadingTrivia ? SyntaxTriviaList.Create(SyntaxFactory.EndOfLine("\n")) : SyntaxTriviaList.Empty;
29+
if (!newUsingTriviaList.Any())
30+
{
31+
newUsingTriviaList = !(firstUsing.GetLeadingTrivia().First().CSharpKind() == SyntaxKind.EndOfLineTrivia) ?
32+
firstUsing.GetLeadingTrivia().Insert(0, SyntaxFactory.EndOfLine("\n")) : SyntaxTriviaList.Empty;
33+
if (newUsingTriviaList.Any()) nodesToAdd = nodesToAdd.Concat(new[] { firstUsing });
34+
}
35+
36+
// NewLine between copyright and using directives.
37+
var newNamespaceTriviaList = !firstNamespace.HasLeadingTrivia ? SyntaxTriviaList.Create(SyntaxFactory.EndOfLine("\n")) : SyntaxTriviaList.Empty;
38+
if (!newNamespaceTriviaList.Any())
39+
{
40+
newNamespaceTriviaList = !(firstNamespace.GetLeadingTrivia().First().CSharpKind() == SyntaxKind.EndOfLineTrivia) ?
41+
firstNamespace.GetLeadingTrivia().Insert(0, SyntaxFactory.EndOfLine("\n")) : SyntaxTriviaList.Empty;
42+
if (newNamespaceTriviaList.Any()) nodesToAdd = nodesToAdd.Concat(new[] { firstNamespace });
43+
}
44+
45+
Func<SyntaxNode, SyntaxNode, SyntaxNode> replacementForNodes = (node, dummy) =>
46+
{
47+
if (node as NamespaceDeclarationSyntax != null)
48+
return node.WithLeadingTrivia(newNamespaceTriviaList);
49+
if (node as UsingDirectiveSyntax != null)
50+
return node.WithLeadingTrivia(newUsingTriviaList);
51+
52+
return null;
53+
};
54+
55+
if (nodesToAdd.Any())
2956
{
30-
var newTriviaList = firstUsing.GetLeadingTrivia().Insert(0, SyntaxFactory.EndOfLine("\n"));
31-
newDocument = document.WithSyntaxRoot(syntaxRoot.ReplaceNode(firstUsing, firstUsing.WithLeadingTrivia(newTriviaList)));
57+
return document.WithSyntaxRoot(syntaxRoot.ReplaceNodes(nodesToAdd, replacementForNodes));
3258
}
3359

3460
return document;

0 commit comments

Comments
 (0)