Sto creando una correzione del codice che trasforma il modificatore di accesso dei metodi rilevati public
. L'implementazione è semplice: rimuovi tutti i modificatori di accesso esistenti e aggiungi public
nella parte anteriore. Successivamente sostituisco il nodo e restituisco la soluzione.La formattazione di una firma del metodo perde il rientro
Ciò tuttavia risulta in un elenco di modificatori simile al seguente: publicvirtual void Method()
. Sopra i modificatori incollati l'uno contro l'altro, quella riga di codice è indentata in modo errato. Assomiglia a questo:
[TestClass]
public class MyClass
{
[TestMethod]
publicvirtual void Method()
{
}
}
Quindi come soluzione, invece, formatto il codice. Utilizzando
var formattedMethod = Formatter.Format(newMethod,
newMethod.Modifiers.Span,
document.Project.Solution.Workspace,
document.Project.Solution.Workspace.Options);
posso formattare i modificatori, ma sono ancora erroneamente frastagliato:
[TestClass]
public class MyClass
{
[TestMethod]
public virtual void Method()
{
}
}
Presumo che ciò è dovuto al fatto di curiosità, ma anteponendo il metodo formattato con i principali curiosità del metodo originale non fare la differenza . Voglio evitare di formattare l'intero documento perché, beh, questa non è un'azione per formattare l'intero documento.
L'intera applicazione dedicata del presente Codice Fix:
private Task<Solution> MakePublicAsync(Document document, SyntaxNode root, MethodDeclarationSyntax method)
{
var removableModifiers = new[]
{
SyntaxFactory.Token(SyntaxKind.InternalKeyword),
SyntaxFactory.Token(SyntaxKind.ProtectedKeyword),
SyntaxFactory.Token(SyntaxKind.PrivateKeyword)
};
var modifierList = new SyntaxTokenList()
.Add(SyntaxFactory.Token(SyntaxKind.PublicKeyword))
.AddRange(method.Modifiers.Where(x => !removableModifiers.Select(y => y.RawKind).Contains(x.RawKind)));
var newMethod = method.WithModifiers(modifierList);
var formattedMethod = Formatter.Format(newMethod, newMethod.Modifiers.Span, document.Project.Solution.Workspace, document.Project.Solution.Workspace.Options);
var newRoot = root.ReplaceNode(method, formattedMethod.WithLeadingTrivia(method.GetLeadingTrivia()));
var newDocument = document.WithSyntaxRoot(newRoot);
return Task.FromResult(newDocument.Project.Solution);
}
Stavo per postare la mia soluzione: se antepongo la trivia al 'SyntaxNode' che ricevo da' SyntaxFactory.Token (SyntaxKind.PublicKeyword) ', tutti i miei test funzionano. Diresti che la soluzione di annotazione del formatter è preferita a questo? –
Sì, in generale mi sento di raccomandare solo l'annotazione, quindi corrisponderà alle impostazioni degli utenti e verrà formattato tutto insieme al resto delle modifiche. –
Dove esattamente dovrei applicare questa annotazione? Quando lo faccio a livello di metodo, il metodo stesso viene formattato, ma l'intero metodo è gravemente rientrato. Voglio evitare di formattare l'intero documento in quanto sarebbe piuttosto fastidioso ogni volta che si utilizza una correzione del codice. –