Roslyn在Majuscule中重命名变量const

时间:2014-04-26 14:51:46

标签: c# roslyn diagnostics

尝试转换:

const string maj = "variable";

const string MAJ = "variable";

我在CodeFix上使用Diagnostic。

我已经完成了诊断:

var localDeclarationConst = node as LocalDeclarationStatementSyntax;
if (localDeclarationConst != null &&
    localDeclarationConst.Modifiers.Any(SyntaxKind.ConstKeyword)
    )
{
    foreach (VariableDeclaratorSyntax variable in localDeclarationConst.Declaration.Variables)
    {
        var symbol = model.GetDeclaredSymbol(variable);
        if (symbol != null)
        {
            string varName = symbol.Name;
            if (!varName.Equals(varName.ToUpper()))
            {
                addDiagnostic(Diagnostic.Create(Rule, localDeclarationConst.GetLocation(), "Les constantes doivent être en majusucle"));
            }
        }
    }

}

但我找不到CodeFix的方法。这是我已经写的:

if (token.IsKind(SyntaxKind.ConstKeyword))
{
    var ConstClause = (LocalDeclarationStatementSyntax)token.Parent;
    var test = ConstClause.GetText();
    var newConstClause = ConstClause.With //What with this With ??


    var newRoot = root.ReplaceNode(ConstClause, newConstClause);

    return new[] { CodeAction.Create("Mettre en maj", document.WithSyntaxRoot(newRoot)) };
}

正如您所看到的,我正在寻找可以与.With一起使用的东西

修改

所以,我开始明白它是如何工作的。但有一点我无法知道它是如何工作的。让我解释一下:

if (token.IsKind(SyntaxKind.ConstKeyword))
{
   var ConstClause = (VariableDeclaratorSyntax)token.Parent;
   var test = ConstClause.Identifier.Text;
   var newConstClause = ConstClause.ReplaceToken(SyntaxFactory.Identifier(test), SyntaxFactory.Identifier(test.ToUpperInvariant()));
   var newRoot = root.ReplaceNode(ConstClause, newConstClause);

   return new[] { CodeAction.Create("Make upper", document.WithSyntaxRoot(newRoot)) };


 }

这就是我所做的。要访问变量的名称(ConstClause.Identifier.Text),我使用VariableDeclaratorSyntax而不是LocalDeclarationStatementSyntax。

但它不起作用。我有什么用? 这将非常有用,因为我将知道如何更改变量的名称。我需要那个。

2 个答案:

答案 0 :(得分:1)

尝试ReplaceToken()而不是With方法。

此外,在您的诊断中,您可以使用VariableDeclarator.Identifier而不是强制使用GetDeclaredSymbol创建符号。

答案 1 :(得分:1)

哎呀,我现在找到一种方法吧! 这是诊断:

var localDeclarationConst = node as LocalDeclarationStatementSyntax;
if (localDeclarationConst != null &&
    localDeclarationConst.Modifiers.Any(SyntaxKind.ConstKeyword)
    )
{
foreach (VariableDeclaratorSyntax variable in localDeclarationConst.Declaration.Variables)
{
     string varName = variable.Identifier.Text;
     if (!varName.Equals(varName.ToUpper()))
     {
        addDiagnostic(Diagnostic.Create(Rule, variable.GetLocation(), "Les constantes doivent être en majusucle"));
     }

}

这是CodeFix:

 var root = await document.GetSyntaxRootAsync(cancellationToken); (root)
 var token = root.FindToken(span.Start); 
 var node = root.FindNode(span);

 if (node.IsKind(SyntaxKind.VariableDeclarator))
 {
   if (token.IsKind(SyntaxKind.IdentifierToken))
   {
        var variable = (VariableDeclaratorSyntax)node;
        string newName = variable.Identifier.ValueText;
        string NameDone = String.Empty;
        for (int i = 0; i < newName.Length; i++)
        {
             NameDone = NameDone.ToString() + char.ToUpper(newName[i]);
        }

        var leading = variable.Identifier.LeadingTrivia;
        var trailing = variable.Identifier.TrailingTrivia;

        VariableDeclaratorSyntax newVariable = variable.WithIdentifier(SyntaxFactory.Identifier(leading, NameDone, trailing));

        var newRoot = root.ReplaceNode(variable, newVariable);
        return new[] { CodeAction.Create("Make upper", document.WithSyntaxRoot(newRoot)) };
   }
}

如果出现问题,请告诉我,但我尝试了它并且有效!