Sto provando le funzionalità di generazione del codice di Roslyn utilizzando LinqPad per eseguire i frammenti. Il metodo di estensione .Dump() di LinqPad esegue il rendering di una vista formattata dell'oggetto nel riquadro dei risultati.Le chiamate ".WithFooToken()" di Roslyn sono superflue?
Il codice generato da http://roslynquoter.azurewebsites.net/ include un sacco di codice che non sembra fare molto altro che aggiungere ingigantito. Il codice seguente produce return null;
se le chiamate .WithFooToken(...)
sono commentate o meno.
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
var syn =
SyntaxFactory.ReturnStatement(
SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)
// .WithToken(SyntaxFactory.Token(SyntaxKind.NullKeyword))
)
// .WithReturnKeyword(
// SyntaxFactory.Token(SyntaxKind.ReturnKeyword)
// )
// .WithSemicolonToken(
// SyntaxFactory.Token(SyntaxKind.SemicolonToken)
// )
;
syn.NormalizeWhitespace().ToFullString().Dump();
sono tali chiamate optional per tutte le lingue o solo per le lingue che hanno ragionevoli valori predefiniti incorporati nelle loro librerie di supporto Roslyn?
Queste chiamate sono certamente utili in casi come 'return/**/null;'. Per quanto riguarda il motivo per cui sono inclusi sempre, forse è per qualche motivo difficile distinguere i due casi? – svick
Uno scenario in cui suppongo potrebbe essere importante quando il codice è solo parzialmente costruito. Per impostazione predefinita si assume che la parola chiave 'return' e il punto e virgola siano presenti, quindi li aggiunge per impostazione predefinita, ma cosa succede se il punto e virgola non è ancora digitato? 'syntax = syntax.WithSemicolonToken (SyntaxFactory.MissingToken (SyntaxKind.SemicolonToken));' –