【问题标题】:Roslyn C# incrementing changeRoslyn C# 递增变化
【发布时间】:2014-04-28 11:40:37
【问题描述】:

尝试使用 Diagnostic 和 CodeFix 来制作转换代码的代码:

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,但我的带有 SyntaxFactory 的 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() 可能不会返回您期望的结果。
  • 我找到了方法,现在它进入了 CodeFix。但没有任何改变......我有一个 CodeAction,但没有执行任何操作。当我一步一步调试的时候,我可以看到newIncrementationClause和IncrementationClause完全一样。也许你可以帮助我:)
  • 您正在替换刚刚创建的新节点,根据定义,该节点不在树中。你永远不应该使用node.ToString();始终直接使用 Node API。

标签: c# roslyn diagnostics


【解决方案1】:

尝试使用诊断的源跨度而不是跨度参数。此外,跨度中第一个标记的父代不一定是您要查找的二进制表达式。您必须使用 .AncestorsAndSelf() 搜索父链或使用 FindNode() 查找与跨度最匹配的节点。

此外,您正在检查令牌以查看它是否具有节点类型。通常,所有令牌类型都以 Token 或 Keyword 结尾。您需要找到具有该 SyntaxKind 的节点。

【讨论】:

    【解决方案2】:

    好吧,我自己找路! 这是代码修复:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多