Ero al TechEd pochi giorni fa, e ho visto this talk by Kevin Pilch-Bisson (relevent part starts at about 18 minutes) ... Ho pensato che fosse abbastanza bello, così ho deciso di giocare con Roslyn me stesso.Aggiungi il modificatore di accesso al metodo utilizzando Roslyn CodeFixProvider?
Sto cercando di fare una regola "Accesso modificatore deve essere dichiarato" (StyleCop SA1400) - significato,
Questo viola la regola:
static void Main(string[] args)
{
}
Questo è ok:
public static void Main(string[] args)
{
}
Deve avere una parola chiave interna, una parola chiave pubblica, una parola chiave privata o una parola chiave parola chiave tected.
Rilevare la violazione era abbastanza semplice, ma ora sto cercando di fornire una soluzione. Ho provato cose e cercato ovunque, ma non riesco a scoprire come aggiungere i modificatori di accesso.
Questo è quello che ho finora:
public async Task<IEnumerable<CodeAction>> GetFixesAsync(Document document, TextSpan span, IEnumerable<Diagnostic> diagnostics, CancellationToken cancellationToken)
{
var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
var token = root.FindToken(span.Start);
var methodDeclaration = token.Parent as MethodDeclarationSyntax;
//var newModifiers = methodDeclaration.Modifiers.Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.PublicKeyword));
//var newModifiers = new SyntaxTokenList() { new SyntaxToken() };
MethodDeclarationSyntax newMethodDeclaration = methodDeclaration.WithModifiers(methodDeclaration.Modifiers);
var newRoot = root.ReplaceNode(methodDeclaration, newMethodDeclaration);
var newDocument = document.WithSyntaxRoot(newRoot);
return new[] { CodeAction.Create("Add Public Keyword", newDocument) };
}
Il WithModifiers
ha bisogno di un SyntaxTokenList
, che posso New(), ma non so come fare di SyntaxKind.PublicKeyword
. Non sono nemmeno sicuro di dover supporre che sia nuovo, o di usare lo SyntaxFactory
. Tuttavia, quando si utilizza il SyntaxFactory
, anche io non riesco a capire quale metodo che ho bisogno di creare un SyntaxToken
di SyntaxKind.PublicKeyword
posso postare l'intera cosa, compreso il DiagnosticAnalyzer
se c'è interesse ...
Mi sembra buono, tranne che tu hai un "TokenList pubblico" locale inutilizzato.Il tuo Func verrà chiamato per creare l'anteprima e quando cliccato, ma dovrebbe andare bene –
Ok grazie :). publicTokenList, di solito resharper mi dice di questi, ma dato che stavo lavorando su vs14 non ha avuto questo .. –