为什么 Roslyn 生成不带空格的方法代码

问题描述 投票:0回答:4

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

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){};
c# roslyn
4个回答
13
投票

为了更全面,应该提到

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)
{
}

5
投票

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

要正确格式化输出,您可以使用

Formatter
命名空间中的
Microsoft.CodeAnalysis.Formatting
类。

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

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

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

这会给你一个

TypeSyntax


3
投票

您可以使用

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


0
投票

在我正在开发的 roslyn CodeFixProvider 中,以上内容都不适用于我。

我发现可靠的解决方案是将方法类型名称更改为

" void "
(注意空格)。

将其从

privatevoidMethod() {
修复为
private void Method() {

MethodDeclarationSyntax method = SyntaxFactory.MethodDeclaration(
            SyntaxFactory.List<AttributeListSyntax>(),
            SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PrivateKeyword)),
            SyntaxFactory.ParseName(" void "), // <--------------!!!!
            null,
            SyntaxFactory.Identifier("Method"),
            null,
            SyntaxFactory.ParameterList(),
            SyntaxFactory.List<TypeParameterConstraintClauseSyntax>(),
            SyntaxFactory.Block(SyntaxFactory.ParseStatement(bodyText)),
            null)
            .WithAdditionalAnnotations(Formatter.Annotation);
        return method;

然后,我将该方法添加到 classDeclarationSyntax,用新的 ClassDeclarationSyntax 更新根节点,并调用:

await Formatter.FormatAsync(document)

最后一点在类中做出了正确的缩进等。

© www.soinside.com 2019 - 2024. All rights reserved.