如何格式化代码选择并与Roslyn保持领先的琐事?

时间:2015-06-03 19:09:29

标签: c# roslyn

我想格式化我用roslyn修改的代码。 我正在修改方法中的代码。 我不想重新格式化整个文件。 原始格式看起来如下:

MyNamespace
{
    class CodeBasicTests
    {
        int OperationOrder_0()
        {
            int a = 20;
            int b = 10;
            int sum = a + b;
            return (int) sum;
        }
    }
}

格式化方法体之后,它会与边框对齐,而不是与方法签名对齐。

MyNamespace
{
    class CodeBasicTests
    {
int OperationOrder_0()
{
    int a = 20;
    int b = 10;
    int c = 30; //new instruction
    int sum = a + b + c;
    return (int) sum;
}
     }
}

我在方法访问者(CSharpSyntaxRewriter)中尝试了以下内容:

MethodDeclarationSyntax method = visited method node;
updatedMethod = method.ReplaceNode(method.Body, newBody);
updatedMethod = updatedMethod.NormalizeWhitespace().WithTriviaFrom(method);
return updatedMethod;

或仅选择方法主体

newBody = (BlockSyntax) Formatter.Format(oldBody, texts, VisualStudioSolutionHandler.workspace);

我也尝试过使用格式化程序的文本范围,但我根本无法使其工作。

我不希望/知道编写访问者向newBody中的每个元素插入一个右侧选项卡,因为我插入的语句要复杂得多,我想仅使用自动格式化功能进行更新的方法

我不知道保持原始方法缩进的热度。

1 个答案:

答案 0 :(得分:1)

将琐事替换为当前的琐事列表,并插入新的琐事。

以下是我创建的扩展方法示例,用于向某些带注释的节点添加换行符。

public static TNode AddNewlineToAnnotated<TNode>(this TNode node, string annotationKind)
    where TNode : CSharpSyntaxNode =>
    node.ReplaceNodes(node.GetAnnotatedNodes(annotationKind), (_, n) =>
        n.WithLeadingTrivia(n.GetLeadingTrivia()
            .Insert(0, SyntaxTree.ElasticEndOfLine(Environment.NewLine))
        )
    );

获得领先的琐事会为您提供SyntaxTriviaList,您可以Add()Insert()或以其他方式修改琐事列表,为您提供新的琐事列表。