Roslyn重命名Majuscle中的变量const

本文关键字:变量 const 重命名 Majuscle Roslyn | 更新日期: 2023-09-27 18:00:29

尝试转换:

const string maj = "variable";

在中

const string MAJ = "variable";

我正在使用带CodeFix的诊断程序。

我已经做了诊断:

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

正如你们所看到的,我正在寻找可以和一起使用的东西

编辑:

所以,我开始了解它是如何工作的。但有一点我不知道它是如何运作的。让我解释一下:

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。

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

Roslyn重命名Majuscle中的变量const

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

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

好的,我会找到一种方法,现在就可以了!以下是诊断:

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

如果有什么地方看起来不对劲,告诉我,但我试过了,效果很好!