Roslyn重命名Majusucle中的变量const

试图转换:

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。

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

尝试使用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)) }; } } 

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