繁体   English   中英

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

[英]Roslyn syntax tree transformation - Replacing return type of methods

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

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. 你选择正确的方法,但你可以简化代码WithReturnType的方法MethodDeclarationSyntaxAddTypeArgumentListArguments方法GenericNameSyntax
  2. 尝试将NormalizeWhitespace()方法用于格式前导和尾随琐事

试试这个代码:

syncInterface
  .ReplaceNodes(
      syncInterface.Members.OfType<MethodDeclarationSyntax>(),
      (a, b) =>
          b.WithReturnType(
              SyntaxFactory.GenericName("Task").AddTypeArgumentListArguments(b.ReturnType)))
  .NormalizeWhitespace();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM