2016-11-07 99 views
0

我正在開發一個項目,在這個項目中,以前的開發人員使用一些非標準的命名方案,將其編碼到resharper中,幾乎所有的標識符都有前綴。所有本地變量開始tmp,參數與inout,等我如何可以在全局範圍更名爲變量開始,具體改變:從變量中刪除前綴

tmpMyVariablemyVariable

inMyParametermyParameter

m_Field_field

+0

您是否嘗試過使用構建重構工具VS提供?右鍵單擊對象重命名..除此之外,找到並替換(這不會在這裏工作),你可能必須手動或寫一個正則表達式。 – Botonomous

+1

@Botonomous這將涉及重命名每個變量一次,而不是能夠將這個變化一次全部應用於所有變量。 – Servy

+0

@Servy我沒有說這是一個很好的解決方案。 – Botonomous

回答

0

更換經過廣泛的研究對這個我最後寫一個羅斯林腳本,可以處理代碼的語義,而不是隻把它當作文本。最終的代碼(這很醜陋,因爲我把它寫成一次性扔掉)。由於名稱衝突,一些文件需要手動修復。我使用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); 

} 
-2

Ctrl + Shift + H和地點tmp(在開頭處留有空格以防止從第一個字段的中間替換tmp)並且在其他字段中沒有任何字段。

Ctrl + H搜索和當前文件替換 Ctrl + Shift + H搜索和當前項目

+0

這將匹配除標識符以外的其他內容(如字符串文字,不應更改)。此外,並非所有標識符的使用都以空格開始。例如'SomeMethod(tmpAnnoyingVariableName);'在'tmp'前面沒有空格。 – Servy

+0

您需要執行多次搜索和替換過程才能正確進行。首先你用空格搜索'tmp',然後'(tmp' then'= tmp'等等)。 – driconmax

+0

a)這個解決方案不會小寫tmp後面的字母 b)它會將註釋/字符串/等 c)剛剛被稱爲tmp的變量將被完全刪除,使代碼無法編譯 – macsux