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){};
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)
{
}
我认为将分号放在那里是因为您将分号传递给创建方法声明的方法,我猜这是在声明没有主体的抽象方法时使用的。
要正确格式化输出,您可以使用
Formatter
命名空间中的 Microsoft.CodeAnalysis.Formatting
类。
Workspace workspace = MSBuildWorkspace.Create();
SyntaxNode formattedNode = Microsoft.CodeAnalysis.Formatting.Formatter.Format(newMethod, workspace);
对于返回类型,您可以执行以下操作
SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.VoidKeyword));
这会给你一个
TypeSyntax
.WithAdditionalAnnotations(Formatter.Annotation)
来格式化您生成的语法节点。
在我正在开发的 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)
最后一点在类中做出了正确的缩进等。