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

时间:2015-10-29 14:19:06

标签: c# roslyn

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

3 个答案:

答案 0 :(得分:7)

为了更加全面,应该提到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();

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

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

答案 1 :(得分:4)

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

要正确格式化输出,可以使用Submit命名空间中的Formatter类。

Microsoft.CodeAnalysis.Formatting

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

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

这会给你一个SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.VoidKeyword));

答案 2 :(得分:3)

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