2015-10-29 14 views
5

Roslyn, tanımlayıcılar ve anahtar kelimeler arasında boşluk olmadan kod oluşturmada ne yapıyorum? Ayrıca, yöntem bloğunun sonunda bir noktalı virgül koymaktadır. İşte benim kodudur:Neden Roslyn boşluk olmadan yöntem kodu üretiyor

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

Ve burada yaşıyorum sonucudur:

privatevoidsimpleButton1_Click(objectsender,EventArgse){}; 

cevap

2

Bence noktalı virgül koyuyorum, çünkü yöntem bildirimini oluşturan yönteme bir tane aktarıyorsunuz, sanırım bu, bir soyut yöntemini bir gövdesi olmadan bildirirken kullanılır.

Çıktının doğru biçimde biçimlendirilmesi için sınıfını Microsoft.CodeAnalysis.Formatting ad alanında kullanabilirsiniz. Bu size verecektir

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

ardından TypeSyntax

3

Sen oluşturmak sözdizimi düğümlerini biçimlendirmek için .WithAdditionalAnnotations(Formatter.Annotation) kullanabilirsiniz.

+0

Teşekkür @Tamas öneri için ama işe görünmüyor Verilen düğüme biçimlendirme varsayılan uygular. Bu yöntemden elde ettiğim, eklemek istemediğim yöntem hakkında ek açıklamalar ekleyecektir. Bunun yerine sadece doğru yöntem sözdizimi oluşturmak istiyorum. – WSK

+0

Bu kodu nereden üretiyorsunuz? Bu bir kod düzeltme sağlayıcısında mı ve Visual Studio'nun içinde misiniz? Değilse, biçimlendirmek istediğiniz sözdizimi düğümünde 'Formatter.Format()' ı kullanmanız gerekir. – Tamas

+1

Formatter.Format, bölümleri değiştirir ancak yine de yöntem bildirimi "privatevoidButton1_Click" gibidir. 'SyntaxFactory.TokenList (SyntaxFactory.Token (SyntaxKind.PrivateKeyword))' ve returnType '' SyntaxFactory.ParseName ("void") 'tarafından muhtemelen tanımlı değiştirici, gitmek için en iyi yol değildir. Nasıl geliştirileceği hakkında bir fikrin var mı? BTW çirkin bir hack, "void" yerine "void" 'yerine istenen sonuçları bulmak için – WSK

3

daha kapsamlı olması için, NormalizeWhiteSpace belirtilmelidir yapabileceği dönüş tipi için

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(); 

bu konuda bir ToString() beklenen çıktıyı üretecek:

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

NormalizeWhitespace benim için çalışır. Boşluklar (birçoğu) ekler, ancak en azından anahtar kelimeler ile kimlikleri arasında boşluk sağlar – Schneider

İlgili konular