2015-10-29 16 views
5

Was mache ich falsch, dass Roslyn Code ohne Leerzeichen zwischen Bezeichnern und Schlüsselwörtern generiert? Außerdem wird am Ende des Methodenblocks ein Semikolon eingefügt. Hier ist mein Code:Warum Roslyn Methodencode ohne Leerzeichen generiert

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

Und hier ist das Ergebnis, dass ich habe:

privatevoidsimpleButton1_Click(objectsender,EventArgse){}; 

Antwort

2

Ich denke, es ist das Semikolon dort setzen, weil Sie eine an die Methode übergeben, die die Methode Deklaration erstellt, ich vermute, das wird verwendet, wenn eine abstrakte Methode ohne einen Körper deklariert.

Um richtig formatiert die Ausgabe Sie die Formatter Klasse im Microsoft.CodeAnalysis.Formatting Namespace verwenden könnte.

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

Für den Rückgabetyp Sie diese Sie eine TypeSyntax

3

Sie .WithAdditionalAnnotations(Formatter.Annotation) verwenden könnte die Syntax Knoten zu formatieren, die Sie generieren.

+0

Dank @Tamas für den Vorschlag, aber es scheint nicht zu funktionieren. Was ich von dieser Methode erhalten habe, ist, dass ich zusätzliche Anmerkungen zu der Methode hinzufügen werde, die ich nicht einfügen möchte. Stattdessen möchte ich nur die korrekte Methodensyntax erstellen. – WSK

+0

Wo generieren Sie diesen Code? Ist dies ein Codefix-Anbieter und Sie befinden sich in Visual Studio? Wenn nicht, müssen Sie 'Formatter.Format()' auf dem Syntaxknoten verwenden, den Sie formatieren möchten. – Tamas

+1

Formatter.Format behebt Parameter Teil aber immer noch die Methodendeklaration ist wie "privatevoidButton1_Click". Wahrscheinlich definierten Modifikator von 'SyntaxFactory.TokenList (SyntaxFactory.Token (SyntaxKind.PrivateKeyword))' und returnType von 'SyntaxFactory.ParseName (" void ")' ist nicht der beste Weg zu gehen. Irgendeine Idee, wie man es verbessert? BTW ein hässlicher Hack ist zu analysieren "" void "' anstelle von '" void "', um die gewünschten Ergebnisse zu finden – WSK

3

Um noch mehr Informationen, geben die folgende

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

tun konnte NormalizeWhiteSpace erwähnt werden sollte. Es gilt Standardformatierung auf den angegebenen Knoten:

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() on, produzieren die erwartete Ausgabe:

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

NormalizeWhitespace funktioniert für mich. Es fügt Leerzeichen hinzu (viele von ihnen), aber sorgt zumindest für einen Abstand zwischen Schlüsselwörtern und IDs – Schneider