एक नैदानिक और एक CodeFix साथ की कोशिश कर रहा एक कोड है जो परिणत कि बनाने के लिए:रोसलिन सी # incrementing परिवर्तन
variable = variable + 1;
otherVariable = otherVariable -1;
में:
variable++;
otherVariable--;
पहले से ही निदान (यह काम करता है) किया:
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"));
}
}
संपादित करें: मैंने कुछ बदलाव किया है। अब वृद्धिशीलता हमेशा पहचानी जाती है। कार्यक्रम कोडफिक्स में जाता है, लेकिन एक सिंटेक्स फैक्टरी के साथ मेरा ReplaceToken काम नहीं करता है। (यह अब केवल "++" के लिए है और नहीं "-"):
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)) };
}
आप वाक्य रचना पेड़ का विश्लेषण करना चाहिए, स्ट्रिंग प्रतिनिधित्व की जांच नहीं। 'ToString()' शायद आप जो भी उम्मीद करते हैं उसे वापस नहीं करता है। – SLaks
मुझे रास्ता मिल गया है और अब यह कोडफिक्स में जाता है। लेकिन कुछ भी नहीं बदला ... मेरे पास कोड कोड है, लेकिन कोई कार्रवाई नहीं की गई है। जब मैं चरण-दर-चरण डीबग करता हूं, तो मैं देख सकता हूं कि newIncrementationClause बिल्कुल वृद्धि के समान है। शायद आप मेरी मदद कर सकते हैं :) – Maloz
आप एक नया नोड बदल रहे हैं जिसे आपने अभी बनाया है, जो परिभाषा के अनुसार पेड़ में नहीं है। आपको 'नोड। टॉस्ट्रिंग()' के साथ कभी काम नहीं करना चाहिए; हमेशा नोड एपीआई का उपयोग करें। – SLaks