从变量中删除前缀
本文关键字:前缀 删除 变量 | 更新日期: 2023-09-27 18:16:46
我正在做一个项目,以前的开发人员使用了一些非标准的命名方案,他将其编码为resharper,其中几乎所有标识符都有前缀。所有局部变量以tmp
开头,参数以in
或out
开头,等等。如何全局地对变量应用重命名,特别是change:
tmpMyVariable
into myVariable
inMyParameter
into myParameter
m_Field
into _field
在对此进行了广泛的研究之后,我最终编写了一个可以处理代码语义的Roslyn脚本,而不仅仅是将其视为文本。最终代码(它很难看,因为我写这个是一次性的)。由于名称冲突,一些文件需要手动修复。我用Resharper重命名了字段,所以代码只针对变量和参数。
static void Main(string[] args)
{
var solutionPath = @"D:'Development'lams'src'Lams.sln";
var workspace = MSBuildWorkspace.Create();
var solution = workspace.OpenSolutionAsync(solutionPath).Result;
var documents = solution.Projects.SelectMany(x => x.Documents).Select(x => x.Id).ToList();
foreach (var documentId in documents)
{
Console.WriteLine(solution.GetDocument(documentId).Name);
while (true)
{
var doc = solution.GetDocument(documentId);
var model = doc.GetSemanticModelAsync().Result;
var syntax = doc.GetSyntaxRootAsync().Result;
var parameters = syntax.DescendantNodes()
.OfType<ParameterSyntax>()
.Where(x => Regex.IsMatch(x.Identifier.ValueText, @"(in|tmp|out)([A-Z])('w+)"))
.ToList();
Console.Write($"{parameters.Count} ");
var parameter = parameters.FirstOrDefault();
if (parameter == null)
break;
string name = parameter.Identifier.ValueText;
name = Regex.Replace(name, @"(in|tmp|out)([A-Z])('w+)", m => m.Groups[2].Value.ToLower() + m.Groups[3].Value.ToString());
var symbol = model.GetDeclaredSymbol(parameter);
solution = Renamer.RenameSymbolAsync(solution, symbol, name, null).Result;
}
Console.WriteLine();
}
foreach (var documentId in documents)
{
Console.WriteLine(solution.GetDocument(documentId).Name);
while (true)
{
var doc = solution.GetDocument(documentId);
var model = doc.GetSemanticModelAsync().Result;
var syntax = doc.GetSyntaxRootAsync().Result;
var variables = syntax.DescendantNodes()
.OfType<VariableDeclarationSyntax>().SelectMany(x => x.Variables)
.Where(x => Regex.IsMatch(x.Identifier.ValueText, @"(in|tmp|out)([A-Z])('w+)"))
.ToList();
Console.Write($"{variables.Count} ");
var variable = variables.FirstOrDefault();
if (variable == null)
break;
string name = variable.Identifier.ValueText;
name = Regex.Replace(name, @"(in|tmp|out)([A-Z])('w+)", m => m.Groups[2].Value.ToLower() + m.Groups[3].Value.ToString());
var symbol = model.GetDeclaredSymbol(variable);
solution = Renamer.RenameSymbolAsync(solution, symbol, name, null).Result;
}
Console.WriteLine();
}
//var canChange = solution.Workspace.CanApplyChange(ApplyChangesKind.ChangeDocument);
solution.Workspace.TryApplyChanges(solution);
}
按下Ctrl + Shift + H
,在第一个字段中放置tmp
(开头有一个空格,以防止tmp
从单词的中间被替换),在其他字段中不放置任何内容
Ctrl + H
在当前文件中搜索和替换Ctrl + Shift + H
在当前项目中搜索和替换