2016-02-23 36 views
6

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?

+0

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

+0

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

risposta

5

Sì, in casi semplici, quelle chiamate non sono necessarie. The code of RoslynQuoter ha l'opzione RemoveRedundantModifyingCalls, che credo dovrebbe fare esattamente quello che vuoi. Ma non è implementato, the only usage sia commentata:

private void AddModifyingCall(ApiCall apiCall, MethodCall methodCall) 
{ 
    // TODO: this needs scripting 
    ////if (RemoveRedundantModifyingCalls) 
    ////{ 
    //// var before = Evaluate(apiCall, UseDefaultFormatting); 
    //// apiCall.Add(methodCall); 
    //// var after = Evaluate(apiCall, UseDefaultFormatting); 
    //// if (before == after) 
    //// { 
    ////  apiCall.Remove(methodCall); 
    //// } 
    ////} 

    apiCall.Add(methodCall); 
    return; 
} 
7

@ risposta di svick è corretto. Ho appena dimenticato di riattivare quel codice perché Roslyn Scripting non era disponibile.

Ora che Scripting è pubblico, ho ri-enabled che codice e aggiornato il sito: http://roslynquoter.azurewebsites.net/

Prova il sito in questo momento, e le chiamate ridondanti come si parla sopra dovrebbe essere andato (che sarà ancora appaiono quando sono necessari per modificare trivia/commenti/etc).