2015-10-29 3 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

Я думаю, что он помещает точку с запятой, потому что вы передаете ее методу, который создает объявление метода, я предполагаю, что это используется при объявлении абстрактного метода без тела.

Для правильного форматирования вывода вы можете использовать класс 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

Спасибо @Tamas за предложение, но она не появляется на работе. Что я получил от этого метода, это добавит дополнительные аннотации к методу, который я не хочу вставлять. Вместо этого я просто хочу создать правильный синтаксис метода. – WSK

+0

Где генерировать код? Является ли это поставщиком кода и вы находитесь внутри Visual Studio? Если нет, вам нужно использовать 'Formatter.Format()' на узле синтаксиса, который вы хотите отформатировать. – Tamas

+1

Formatter.Format исправляет часть параметров, но все же объявление метода похоже на «privatevoidButton1_Click». Вероятно определенный модификатор 'SyntaxFactory.TokenList (SyntaxFactory.Token (SyntaxKind.PrivateKeyword))' и returnType by 'SyntaxFactory.ParseName (" void ")' не лучший способ. Есть идеи, как улучшить его? BTW уродливый взлом - это разбор '' void "' вместо '' void "' для поиска желаемых результатов – WSK

3

Чтобы быть еще более всеобъемлющим, 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) 
{ 
} 
+0

NormalizeWhitespace работает для меня. Он добавляет пробелы (многие из них), но по крайней мере обеспечивает пространство между ключевыми словами и идентификаторами – Schneider

Смежные вопросы