将 MethodDeclarationSyntax 转换为 ConstructorDeclarationSyntax 的规范方法是什么?

What is the canonical way to convert a MethodDeclarationSyntax to a ConstructorDeclarationSyntax?

我正在为 API 迁移 (AutoMapper V5 Profiles) 编写分析器和代码修复程序,将 protected override Configure 方法转换为构造函数:

来自:

public class MappingProfile : Profile
{
    protected override Configure()
    {
        CreateMap<Foo, Bar>();
        RecognizePrefix("m_");
    }
}

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<Foo, Bar>();
        RecognizePrefix("m_");
    }
}

我找到了一种将方法节点转换为构造函数的方法,但我一直在努力使空格正确。这引出了一个问题,如果我没有忽略将方法转换为构造函数的更简单方法。

所以我的问题是:Roslyn 是否已经为您提供了将 MethodDeclarationSyntax 转换为 ConstructorDeclarationSyntax 的重构?或者比 this LINQPad script.

更简单的方法

在 CodeFix 中,只需添加格式化程序注释:

SyntaxFactory
    .ConstructorDeclaration(constructorIdentifier)
    .‌​WithModifiers(Syntax‌​Factory.TokenList(Sy‌​ntaxFactory.Token(Sy‌​ntaxKind.PublicKeywo‌​rd)))
    .WithAttributeL‌​ists(oldMethodNode.A‌​ttributeLists)
    .WithP‌​arameterList(newPara‌​meterList)
    .WithBody(‌​newBody)
    .WithTriviaF‌​rom(oldMethodNode)
    .W‌​ithAdditionalAnnotat‌​ions(Formatter.Annot‌​ation)

这足以在代码修复中发挥作用,因为代码修复基础结构将处理注释。

在 CodeFix 之外,您可以使用 Microsoft.CodeAnalysis.Formatting 中的 Formatter.Format() 来显式处理注释。