2014-04-28 8 views
5

एक नैदानिक ​​और एक 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)) }; 
} 
+2

आप वाक्य रचना पेड़ का विश्लेषण करना चाहिए, स्ट्रिंग प्रतिनिधित्व की जांच नहीं। 'ToString()' शायद आप जो भी उम्मीद करते हैं उसे वापस नहीं करता है। – SLaks

+0

मुझे रास्ता मिल गया है और अब यह कोडफिक्स में जाता है। लेकिन कुछ भी नहीं बदला ... मेरे पास कोड कोड है, लेकिन कोई कार्रवाई नहीं की गई है। जब मैं चरण-दर-चरण डीबग करता हूं, तो मैं देख सकता हूं कि newIncrementationClause बिल्कुल वृद्धि के समान है। शायद आप मेरी मदद कर सकते हैं :) – Maloz

+0

आप एक नया नोड बदल रहे हैं जिसे आपने अभी बनाया है, जो परिभाषा के अनुसार पेड़ में नहीं है। आपको 'नोड। टॉस्ट्रिंग()' के साथ कभी काम नहीं करना चाहिए; हमेशा नोड एपीआई का उपयोग करें। – SLaks

उत्तर

0

ठीक है, मुझे अपने आप से रास्ता मिल रहा है! यहाँ CodeFix है:

if (node.IsKind(SyntaxKind.SimpleAssignmentExpression)) 
{ 
     var IncrementationClause = (BinaryExpressionSyntax)node; 
     var IncrementionClauseExpressionStatement = IncrementationClause.Parent; 

     string right = IncrementationClause.Right.ToString(); 
     string left = IncrementationClause.Left.ToString(); 

     var ExpressionNew = SyntaxFactory.ExpressionStatement(IncrementationClause); 

     if (right == left + " - 1") 
     { 
      var BonneIncrementation = SyntaxFactory.PostfixUnaryExpression(SyntaxKind.PostDecrementExpression, IncrementationClause.Left); 
      ExpressionNew = SyntaxFactory.ExpressionStatement(BonneIncrementation).WithAdditionalAnnotations(Formatter.Annotation).WithLeadingTrivia(leading).WithTrailingTrivia(trailing); 
      } 
      else 
      { 
      var BonneIncrementation = SyntaxFactory.PostfixUnaryExpression(SyntaxKind.PostIncrementExpression, IncrementationClause.Left); 
      ExpressionNew = SyntaxFactory.ExpressionStatement(BonneIncrementation).WithAdditionalAnnotations(Formatter.Annotation).WithLeadingTrivia(leading).WithTrailingTrivia(trailing); 
      } 

      var newRoot = root.ReplaceNode(IncrementionClauseExpressionStatement, ExpressionNew); 

      return new[] { CodeAction.Create("Convert in the good way of incrementing", document.WithSyntaxRoot(newRoot)) }; 


} 
2

निदान और नहीं अवधि तर्क का स्रोत अवधि का उपयोग करें। साथ ही, अवधि में पहले टोकन के माता-पिता आवश्यक रूप से बाइनरी अभिव्यक्ति नहीं होंगे जो आप खोज रहे हैं। आपको या तो पूर्वजों और स्वयं() का उपयोग करके अभिभावक श्रृंखला को खोजना होगा या नोड को खोजने के लिए FindNode() का उपयोग करना होगा जो कि सबसे अच्छी अवधि से मेल खाता है।

इसके अलावा आप यह देखने के लिए टोकन की जांच कर रहे हैं कि इसमें नोड का प्रकार है या नहीं। नियम के रूप में टोकन या कीवर्ड में सभी टोकन प्रकार समाप्त होते हैं। आपको उस नोड को ढूंढने की ज़रूरत है जिसमें सिंटैक्सकिंड है।

संबंधित मुद्दे