Skip to content

Commit

Permalink
Merge pull request #49501 from CyrusNajmabadi/preserveFormattingAnnot…
Browse files Browse the repository at this point in the history
…ation

Preserve annotation on comment trivia when performing formatting.
  • Loading branch information
msftbot[bot] authored Nov 19, 2020
2 parents 449aba9 + 2609575 commit c8d646a
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 23 deletions.
28 changes: 28 additions & 0 deletions src/EditorFeatures/CSharpTest/Formatting/FormattingEngineTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2234,6 +2234,34 @@ public void SeparateGroups_GroupIfSorted_RecognizeSystemNotFirst()
AssertFormatWithView(expected, code, (GenerationOptions.SeparateImportDirectiveGroups, true));
}

[Fact, WorkItem(49492, "https://github.com/dotnet/roslyn/issues/49492")]
public void PreserveAnnotationsOnMultiLineTrivia()
{
var text = @"
namespace TestApp
{
class Test
{
/* __marker__ */
}
}
";

var position = text.IndexOf("/* __marker__ */");
var syntaxTree = CSharpSyntaxTree.ParseText(text);
var root = syntaxTree.GetRoot();

var annotation = new SyntaxAnnotation("marker");
var markerTrivia = root.FindTrivia(position, findInsideTrivia: true);
var annotatedMarkerTrivia = markerTrivia.WithAdditionalAnnotations(annotation);
root = root.ReplaceTrivia(markerTrivia, annotatedMarkerTrivia);

var formattedRoot = Formatter.Format(root, new AdhocWorkspace());
var annotatedTrivia = formattedRoot.GetAnnotatedTrivia("marker");

Assert.Single(annotatedTrivia);
}

private static void AssertFormatAfterTypeChar(string code, string expected, Dictionary<OptionKey2, object> changedOptionSet = null)
{
using var workspace = TestWorkspace.CreateCSharp(code);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,32 +180,33 @@ private static bool IsMultilineComment(SyntaxTrivia trivia1)

private bool TryFormatMultiLineCommentTrivia(LineColumn lineColumn, SyntaxTrivia trivia, out SyntaxTrivia result)
{
result = default;

if (trivia.Kind() != SyntaxKind.MultiLineCommentTrivia)
{
return false;
}

var indentation = lineColumn.Column;
var indentationDelta = indentation - GetExistingIndentation(trivia);
if (indentationDelta != 0)
if (trivia.Kind() == SyntaxKind.MultiLineCommentTrivia)
{
var multiLineComment = trivia.ToFullString().ReindentStartOfXmlDocumentationComment(
false /* forceIndentation */,
indentation,
indentationDelta,
this.Options.GetOption(FormattingOptions2.UseTabs),
this.Options.GetOption(FormattingOptions2.TabSize),
this.Options.GetOption(FormattingOptions2.NewLine));

var multilineCommentTrivia = SyntaxFactory.ParseLeadingTrivia(multiLineComment);
Contract.ThrowIfFalse(multilineCommentTrivia.Count == 1);

result = multilineCommentTrivia.ElementAt(0);
return true;
var indentation = lineColumn.Column;
var indentationDelta = indentation - GetExistingIndentation(trivia);
if (indentationDelta != 0)
{
var multiLineComment = trivia.ToFullString().ReindentStartOfXmlDocumentationComment(
false /* forceIndentation */,
indentation,
indentationDelta,
this.Options.GetOption(FormattingOptions2.UseTabs),
this.Options.GetOption(FormattingOptions2.TabSize),
this.Options.GetOption(FormattingOptions2.NewLine));

var multilineCommentTrivia = SyntaxFactory.ParseLeadingTrivia(multiLineComment);
Contract.ThrowIfFalse(multilineCommentTrivia.Count == 1);

// Preserve annotations on this comment as the formatter is only supposed to touch whitespace, and
// thus should make it appear as if the original comment trivia (with annotations) is still there in
// the resultant formatted tree.
var firstTrivia = multilineCommentTrivia.First();
result = trivia.CopyAnnotationsTo(firstTrivia);
return true;
}
}

result = default;
return false;
}

Expand Down

0 comments on commit c8d646a

Please sign in to comment.