Ich baue einen Analysator für C# -Code, der Fehler erzeugt, wenn ein String-Literal anstelle einer Const-Zeichenfolge für bestimmte Argumente für bestimmte Funktionen verwendet wird. Ie.String-Literale durch private const-Anweisungen ersetzen
class MyClass
{
private void MyMethod(IWriter writer)
{
writer.WriteInteger("NamedValue", 4);
}
}
Sollte sich:
class MyClass
{
private const string IoNamedValueKey = "NamedValue";
private void MyMethod(IWriter writer)
{
writer.WriteInteger(IoNamedValueKey , 4);
}
}
ich das bisschen habe zu arbeiten, wo er den Fehler anzeigt, aber ich möchte auch eine CodeFixProvider bereitzustellen. Ich habe in zwei Probleme gerannt:
- Ich muss die
private const string IoNamedValueKey = "NamedValue";
Anweisung hinzufügen, idealerweise nur über die beleidigende Methode. - Aber nur wenn es nicht schon existiert.
Ich bin nicht ganz sicher, dass die Vorlage Ansatz für die CodeFixProvider die entsprechenden Überlastungen für meine Zwecke verwendet (es ersetzt nur Namen geben mit Großbuchstaben-Varianten), so würde, was der beste Weg vorwärts aus dem RegisterCodeFixesAsync Verfahren ?
public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context)
{
// ... now what?
}
Nach roslynquoter der erforderliche Knoten, wie unten aufgebaut werden kann, aber ich bin an einem Verlust noch etwas darüber, wie es in den Kontext zu injizieren.
CompilationUnit()
.WithMembers(
SingletonList<MemberDeclarationSyntax>(
FieldDeclaration(
VariableDeclaration(
PredefinedType(
Token(SyntaxKind.StringKeyword)))
.WithVariables(
SingletonSeparatedList<VariableDeclaratorSyntax>(
VariableDeclarator(
Identifier("IoNamedValueKey"))
.WithInitializer(
EqualsValueClause(
LiteralExpression(
SyntaxKind.StringLiteralExpression,
Literal("NamedValue")))))))
.WithModifiers(
TokenList(
new []{
Token(SyntaxKind.PrivateKeyword),
Token(SyntaxKind.ConstKeyword)}))))
.NormalizeWhitespace()
nicht bekommen kann, dass ich zu arbeiten habe Angst, ich bin immer ein 'Können cast-Objekt vom Typ 'Microsoft.CodeAnalysis.CSharp.Syntax.CompilationUnitSyntax' zum Eingeben von 'Microsoft.CodeAnalysis.CSharp.Syntax.MemberDeclarationSyntax'-Fehler, wenn ich versuche, entweder 'root.ReplaceNode()' oder 'root.InsertNodesBefore () '. Ich verwende diesen Code, um die const-Deklaration zu erstellen: 'ParseCompilationUnit (string.Format (" private const string {0} = \ "{1} \"; ", Name, Wert));' –
Es ist nicht möglich, CompilationUnitSyntax einzufügen in TypeDeclarationyntax, weil es keine gültige Syntax ist, versuche, eine FieldDeclarationSyntax zu erstellen und einzufügen, schau dir die SyntaxFactory Klassenreferenz an, die ich dir in der Antwort geschickt habe – NValchev
Ich habe es geschafft, den Text einzufügen, aber dieser _cannot_ kann nicht der richtige Weg sein um es zu tun: VariableDeclarationSyntax Variable = VariableDeclaration (ParseTypeName ("private const String")); variable = variable.AddVariables (VariableDeclarator ("+ name +" = "+ wert +" "")); Rückgabe FieldDeclaration (Variable) .NormalizeWhitespace(); –