提交 48e26a84 编写于 作者: C CyrusNajmabadi

Fix issue with inline-formatting changing indentation of multi-line constructs.

上级 7f38544a
......@@ -1161,6 +1161,40 @@ public static void Method(Expression<Action> expression)
{
}
}");
}
[WorkItem(16198, "https://github.com/dotnet/roslyn/issues/16198")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInlineDeclaration)]
public async Task TestIndentation1()
{
await TestAsync(
@"
using System;
class C
{
private int Bar()
{
IProjectRuleSnapshot [|unresolvedReferenceSnapshot|] = null;
var itemType = GetUnresolvedReferenceItemType(originalItemSpec,
updatedUnresolvedSnapshots,
catalogs,
out unresolvedReferenceSnapshot);
}
}",
@"
using System;
class C
{
private int Bar()
{
var itemType = GetUnresolvedReferenceItemType(originalItemSpec,
updatedUnresolvedSnapshots,
catalogs,
out IProjectRuleSnapshot unresolvedReferenceSnapshot);
}
}");
}
}
......
......@@ -92,16 +92,14 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context)
var block = (BlockSyntax)localDeclarationStatement.Parent;
var declarationIndex = block.Statements.IndexOf(localDeclarationStatement);
// Comments on the local declaration will move to the next statement. Format it
// so that it the comments show up properly.
// Trivia on the local declaration will move to the next statement.
// use the callback form as the next statement may be hte place where we're
// inlining the declaration, and thus need to see the effects of that change.
editor.ReplaceNode(
block.Statements[declarationIndex + 1],
(s, g) => s.WithAdditionalAnnotations(Formatter.Annotation));
(s, g) => MoveNonIndentationTrivia(localDeclarationStatement, s));
var removeOptions = localDeclarationStatement.GetTrailingTrivia().Any(t => t.IsRegularComment())
? SyntaxRemoveOptions.KeepLeadingTrivia | SyntaxRemoveOptions.KeepTrailingTrivia
: SyntaxRemoveOptions.KeepLeadingTrivia;
editor.RemoveNode(localDeclarationStatement, removeOptions);
editor.RemoveNode(localDeclarationStatement, SyntaxRemoveOptions.KeepUnbalancedDirectives);
}
else
{
......@@ -165,6 +163,30 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context)
editor.ReplaceNode(identifier, declarationExpression);
}
private static SyntaxNode MoveNonIndentationTrivia(
SyntaxNode from, SyntaxNode to)
{
// get all the preceding trivia from the 'from' node, not counting the leading
// indentation trivia is has.
var finalTrivia = from.GetLeadingTrivia().ToList();
while (finalTrivia.Count > 0 && finalTrivia.Last().Kind() == SyntaxKind.WhitespaceTrivia)
{
finalTrivia.RemoveAt(finalTrivia.Count - 1);
}
// Also, add on hte trailing trivia if there are trailing comments.
var hasTrailingComments = from.GetTrailingTrivia().Any(t => t.IsRegularComment());
if (hasTrailingComments)
{
finalTrivia.AddRange(from.GetTrailingTrivia());
}
// Merge this trivia with the existing trivia on the node. Format in case
// we added comments and need them indented properly.
return to.WithPrependedLeadingTrivia(finalTrivia)
.WithAdditionalAnnotations(Formatter.Annotation);
}
private static DeclarationExpressionSyntax GetDeclarationExpression(
SourceText sourceText, IdentifierNameSyntax identifier,
TypeSyntax newType, VariableDeclaratorSyntax declaratorOpt)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册