Próbując z diagnostyki i CodeFix aby kod, który przekształcać że:Roslyn C# zmiany przyrostu
variable = variable + 1;
otherVariable = otherVariable -1;
Into:
variable++;
otherVariable--;
Już zrobione diagnostyki (działa):
var incrementing = node as BinaryExpressionSyntax;
if (incrementing != null)
{
string right = incrementing .Right.ToString();
string left = incrementing .Left.ToString();
if (right == left + " - 1" || right == left + " + 1")
{
addDiagnostic(Diagnostic.Create(Rule, incrementation.GetLocation(), "Use the shorter way"));
}
}
Edytuj: Wprowadziłem trochę zmian. Teraz inkrementacja jest zawsze rozpoznawana. Program przechodzi do CodeFix, ale mój ReplaceToken z SyntaxFactory nie działa. (To teraz tylko dla "++", a nie "-"):
if (node.IsKind(SyntaxKind.SimpleAssignmentExpression)) //I use a node instead of a token
{
var IncrementationClause = (BinaryExpressionSyntax)node;
string left = IncrementationClause.Left.ToString();
left = left + "++";
string rigt = IncrementationClause.Right.ToString();
var newIncrementationClause = IncrementationClause.ReplaceToken(SyntaxFactory.Identifier(IncrementationClause.Left.ToString()), SyntaxFactory.Identifier(left));
newIncrementationClause = IncrementationClause.ReplaceToken(SyntaxFactory.Identifier(IncrementationClause.Right.ToString()), SyntaxFactory.Identifier(String.Empty));
newIncrementationClause = IncrementationClause.ReplaceToken(SyntaxFactory.Identifier(IncrementationClause.OperatorToken.ToString()), SyntaxFactory.Identifier(String.Empty));
var newRoot = root.ReplaceNode(IncrementationClause, newIncrementationClause);
return new[] { CodeAction.Create("Changer la mise en forme", document.WithSyntaxRoot(newRoot)) };
}
Powinieneś przeanalizować drzewo składniowe, a nie sprawdzać reprezentację napisów. 'ToString()' prawdopodobnie nie zwraca tego, czego się spodziewasz. – SLaks
Znaleźliśmy drogę, a teraz jest w CodeFix. Ale nic się nie zmieniło ... Mam CodeAction, ale nie podejmuję żadnych działań. Kiedy debuguję krok po kroku, widzę, że newIncrementationClause jest dokładnie taki sam jak IncrementationClause. Może możesz mi pomóc :) – Maloz
Wymieniasz nowy węzeł, który właśnie utworzyłeś, który z definicji nie znajduje się w drzewie. Nigdy nie powinieneś pracować z 'node.ToString()'; zawsze korzystaj bezpośrednio z API Node. – SLaks