2014-04-28 26 views
5

Roslyn C# değeri artırılarak değişikliği

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

Düzenleme: Bazı değişiklik yaptım. Şimdi artımlı her zaman tanınır. Program CodeFix içinde gitmek, ancak bir SyntaxFactory ile benim ReplaceToken çalışmaz.

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

Sen dize temsilini kontrol, sözdizimi ağacı analiz edilmelidir. ToString(), muhtemelen beklediğiniz şeyi geri getirmez. – SLaks

+0

Yolu buldum ve şimdi CodeFix'e gidiyor. Ama hiçbir şey değişmez ... Bir CodeAction'ım var, ama hiçbir işlem yapılmadı. Adım adım hata ayıkladığımda, newIncrementationClause'ın IncrementationClause ile tamamen aynı olduğunu görebiliyorum. Belki bana yardımcı olabilirsiniz :) – Maloz

+0

Yeni oluşturduğunuz yeni bir düğümü değiştiriyorsunuz, bu da tanım gereği ağaçta değil. Node.ToString() 'ile asla çalışmamalısınız; Her zaman Düğüm API'lerini doğrudan kullanın. – SLaks

cevap

0

Okey, kendime yolu buluyorum! İşte CodeFix geçerli:

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

tanı ve yayılma Tartışmanın kaynağı açıklığı kullanmayı deneyin: - ("" Sadece "++" için şimdi nerede değil). Ayrıca, yayındaki ilk belirtecin üst öğesi mutlaka aradığınız ikili ifade olmayacaktır. Ana zincirini .AncestorsAndSelf() kullanarak veya span ile en iyi eşleşen düğümü bulmak için FindNode() öğesini kullanmanız gerekir.

Ayrıca bir düğüm olup olmadığını görmek için bir belirteci denetliyorsunuz. Kural olarak, tüm jeton türleri Token veya Keyword ile biter. SyntaxKind'e sahip olan düğümü bulmanız gerekiyor.