2014-04-28 116 views
5

具有診斷和CodeFix試圖讓誰變換代碼:羅斯林C#遞增變化

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")); 
    } 
} 

編輯: 我做了一些改變。 現在總是可以識別增量。該程序進入CodeFix,但我的ReplaceToken與SyntaxFactory不起作用。 (現在只針對「++」而不是「 - 」):

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

我已經找到了方法,現在它進入CodeFix。但沒有任何改變......我有一個CodeAction,但沒有任何行動。當我逐步調試時,我可以看到newIncrementationClause與IncrementationClause完全相同。也許你可以幫我:) – Maloz

+0

你正在替換你剛創建的新節點,它根據定義不在樹中。你不應該使用'node.ToString()';總是直接使用Node API。 – 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

嘗試使用診斷的源跨度而不是span參數。此外,跨度中第一個標記的父代不一定是您正在查找的二進制表達式。您必須使用.AncestorsAndSelf()搜索父鏈,或使用FindNode()來查找與跨度最匹配的節點。

此外,您正在檢查令牌以查看它是否具有某種節點。通常,所有令牌類型都以令牌或關鍵字結尾。您需要找到具有該SyntaxKind的節點。