2015-10-29 7 views
5

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

答えて

2

メソッド宣言を作成するメソッドに渡しているのでセミコロンを置いていると思いますが、ボディなしで抽象メソッドを宣言するときに使用されていると思います。

出力を正しくフォーマットするには、Microsoft.CodeAnalysis.Formatting名前空間でFormatterクラスを使用できます。あなたはこれはあなたを与えるだろう

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

TypeSyntax

3

あなたが生成する構文ノードをフォーマットする.WithAdditionalAnnotations(Formatter.Annotation)を使用することができます。

+0

おかげ@Tamas提案をしたが、動作するように表示されません。これは、指定されたノードにデフォルト書式を適用します。私がこのメソッドから得たことは、それが私が挿入しようとしていないメソッドに追加の注釈を追加することです。代わりに、正しいメソッド構文を作成したいだけです。 – WSK

+0

このコードはどこで生成されていますか?これはcodefixプロバイダにありますか?Visual Studioの中にいますか?そうでなければ、書式設定する構文ノードで 'Formatter.Format()'を使う必要があります。 – Tamas

+1

Formatter.Formatはパラメータの部分を修正しますが、メソッドの宣言は "privatevoidButton1_Click"と同じです。 'SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PrivateKeyword))'によって修飾子が定義されていて、 'SyntaxFactory.ParseName(" void ")によるreturnTypeは最善の方法ではありません。どのようにそれを改善するためのアイデア? BTW醜いハックは、 '' void ''の代わりに' 'void''をパースして、望ましい結果を見つけることです。 – WSK

3

、より包括的であるために、NormalizeWhiteSpaceが言及されるべきである何ができる戻り値の型については

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

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

NormalizeWhitespaceが私に役立ちます。スペースを追加しますが、少なくともキーワードとIDの間のスペースを確保します – Schneider

関連する問題