为什么 Roslyn 生成的方法代码没有空格

Why Roslyn is generating method code without spaces

Roslyn 生成的代码在标识符和关键字之间没有任何 space,我做错了什么?它还在方法块的末尾放置了一个分号。 这是我的代码:

SeparatedSyntaxList<ParameterSyntax> parametersList = new SeparatedSyntaxList<ParameterSyntax>().AddRange
(new ParameterSyntax[]
    {
        SyntaxFactory.Parameter(SyntaxFactory.Identifier("sender")).WithType(SyntaxFactory.ParseTypeName("object")),
        SyntaxFactory.Parameter(SyntaxFactory.Identifier("args")).WithType(SyntaxFactory.ParseTypeName("EventArgs"))
    }
);

MethodDeclarationSyntax newMethod = SyntaxFactory.MethodDeclaration(
    SyntaxFactory.List<AttributeListSyntax>(),
    SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PrivateKeyword)),
    SyntaxFactory.ParseName("void"),
    null,
    SyntaxFactory.Identifier("simpleButton1_Click"),
    null,
    SyntaxFactory.ParameterList(parametersList),
    SyntaxFactory.List<TypeParameterConstraintClauseSyntax>(),
    SyntaxFactory.Block(),
    SyntaxFactory.Token(SyntaxKind.SemicolonToken)
);

这是我得到的结果:

privatevoidsimpleButton1_Click(objectsender,EventArgse){};

您可以使用 .WithAdditionalAnnotations(Formatter.Annotation) 来格式化您生成的语法节点。

我认为将分号放在那里是因为您将一个分号传递给创建方法声明的方法,我猜这是在声明没有主体的抽象方法时使用的。

要正确格式化输出,您可以使用 Microsoft.CodeAnalysis.Formatting 命名空间中的 Formatter class。

Workspace workspace = MSBuildWorkspace.Create();
SyntaxNode formattedNode = Microsoft.CodeAnalysis.Formatting.Formatter.Format(newMethod, workspace);

对于 return 类型,您可以执行以下操作

SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.VoidKeyword));   

这会给你一个 TypeSyntax

为了更全面,应该提到 NormalizeWhiteSpace。它将默认格式应用于给定节点:

MethodDeclarationSyntax newMethod = SyntaxFactory.MethodDeclaration(
    SyntaxFactory.List<AttributeListSyntax>(),
    SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PrivateKeyword)),
    SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.VoidKeyword)),
    null,
    SyntaxFactory.Identifier("simpleButton1_Click"),
    null,
    SyntaxFactory.ParameterList(parametersList),
    SyntaxFactory.List<TypeParameterConstraintClauseSyntax>(),
    SyntaxFactory.Block(),
    null
  )

newMethod = newMethod.NormalizeWhitespace();

A ToString() 将产生预期的输出:

private void simpleButton1_Click(object sender, EventArgs args)
{
}