Roslyn语法树转换 - 替换返回类型的方法

时间:2015-08-11 01:44:42

标签: c# roslyn

我正在尝试使用Roslyn编写代码转换,将接口方法的返回类型从T更改为Task<T>(假设没有返回void)。以下是我提出的代码。

CODE

InterfaceDeclarationSyntax asyncInterface = syncInterface.ReplaceNodes(
                syncInterface.Members.OfType<MethodDeclarationSyntax>(),
                (a, m) => m.ReplaceNode(
                    m.ReturnType,
                    SF.GenericName(SF.Identifier("Task"), SF.TypeArgumentList(new SeparatedSyntaxList<TypeSyntax>().Add(m.ReturnType)))));

首先这是正确的方法吗?

其次这会在格式化时弄乱缩进。我该如何解决这个问题?

修改

我能够通过保留Trivia来解决第二个问题。这是更新的代码(我也将其迁移到使用重写器)。

代码

sealed class AsyncMethodRewriter : CSharpSyntaxRewriter
{
    public override SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax m)
    {
        var newReturnType = SF.GenericName(SF.Identifier("Task"), SF.TypeArgumentList(new SeparatedSyntaxList<TypeSyntax>().Add(m.ReturnType.WithoutTrivia())));
        newReturnType = newReturnType.InsertTriviaBefore(newReturnType.GetLeadingTrivia().First(), m.ReturnType.GetLeadingTrivia().AsEnumerable());
        newReturnType = newReturnType.InsertTriviaAfter(newReturnType.GetTrailingTrivia().First(), m.ReturnType.GetTrailingTrivia().AsEnumerable());
        return m.ReplaceNode(m.ReturnType, newReturnType);
    }
}

1 个答案:

答案 0 :(得分:2)

  1. 您选择了正确的方法,但您可以使用WithReturnType MethodDeclarationSyntax方法和AddTypeArgumentListArguments类<{1}}方法来简化代码
  2. 尝试使用GenericNameSyntax方法处理格式前导和尾随trivias
  3. 试试这段代码:

    NormalizeWhitespace()