|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Formatting;
namespace Microsoft.CodeAnalysis.CSharp.Formatting
{
internal partial class CSharpTriviaFormatter
{
private class DocumentationCommentExteriorCommentRewriter : CSharpSyntaxRewriter
{
private readonly bool _forceIndentation;
private readonly int _indentation;
private readonly int _indentationDelta;
private readonly SyntaxFormattingOptions _options;
public DocumentationCommentExteriorCommentRewriter(
bool forceIndentation,
int indentation,
int indentationDelta,
SyntaxFormattingOptions options,
bool visitStructuredTrivia = true)
: base(visitIntoStructuredTrivia: visitStructuredTrivia)
{
_forceIndentation = forceIndentation;
_indentation = indentation;
_indentationDelta = indentationDelta;
_options = options;
}
public override SyntaxTrivia VisitTrivia(SyntaxTrivia trivia)
{
if (trivia.Kind() == SyntaxKind.DocumentationCommentExteriorTrivia)
{
if (IsBeginningOrEndOfDocumentComment(trivia))
{
return base.VisitTrivia(trivia);
}
else
{
var triviaText = trivia.ToFullString();
var newTriviaText = triviaText.AdjustIndentForXmlDocExteriorTrivia(
_forceIndentation,
_indentation,
_indentationDelta,
_options.UseTabs,
_options.TabSize);
if (triviaText == newTriviaText)
{
return base.VisitTrivia(trivia);
}
var parsedNewTrivia = SyntaxFactory.DocumentationCommentExterior(newTriviaText);
return parsedNewTrivia;
}
}
return base.VisitTrivia(trivia);
}
private static bool IsBeginningOrEndOfDocumentComment(SyntaxTrivia trivia)
{
var currentParent = trivia.Token.Parent;
while (currentParent != null)
{
if (currentParent.Kind() is SyntaxKind.SingleLineDocumentationCommentTrivia or
SyntaxKind.MultiLineDocumentationCommentTrivia)
{
if (trivia.Span.End == currentParent.SpanStart ||
trivia.Span.End == currentParent.Span.End)
{
return true;
}
else
{
return false;
}
}
currentParent = currentParent.Parent;
}
return false;
}
}
}
}
|