我正在開發一個項目,在這個項目中,以前的開發人員使用一些非標準的命名方案,將其編碼到resharper中,幾乎所有的標識符都有前綴。所有本地變量開始tmp
,參數與in
或out
,等我如何可以在全局範圍更名爲變量開始,具體改變:從變量中刪除前綴
tmpMyVariable
到myVariable
inMyParameter
到myParameter
m_Field
到_field
我正在開發一個項目,在這個項目中,以前的開發人員使用一些非標準的命名方案,將其編碼到resharper中,幾乎所有的標識符都有前綴。所有本地變量開始tmp
,參數與in
或out
,等我如何可以在全局範圍更名爲變量開始,具體改變:從變量中刪除前綴
tmpMyVariable
到myVariable
inMyParameter
到myParameter
m_Field
到_field
更換經過廣泛的研究對這個我最後寫一個羅斯林腳本,可以處理代碼的語義,而不是隻把它當作文本。最終的代碼(這很醜陋,因爲我把它寫成一次性扔掉)。由於名稱衝突,一些文件需要手動修復。我使用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
搜索和當前項目
您是否嘗試過使用構建重構工具VS提供?右鍵單擊對象重命名..除此之外,找到並替換(這不會在這裏工作),你可能必須手動或寫一個正則表達式。 – Botonomous
@Botonomous這將涉及重命名每個變量一次,而不是能夠將這個變化一次全部應用於所有變量。 – Servy
@Servy我沒有說這是一個很好的解決方案。 – Botonomous