public static string CopyRenamedFile(string source, string target, string fileName, string analyzer, IList <CheckData> checks, Dictionary <string, IEnumerable <string> > categories, Dictionary <string, Dictionary <string, string> > projectGuids) { string fileContents = File.ReadAllText(source + @"\" + fileName); fileContents = fileContents.Replace("REPLACE.ME", analyzer); fileContents = fileContents.Replace("REPLACEME", analyzer.Replace(".", String.Empty)); if (fileName == "REPLACEMEAnalyzersResources.resx") { var sb = new StringBuilder(); // add diagnostic resource strings foreach (var check in checks) { sb.Append(CodeTemplates.GenerateDiagnosticResourceData(check)); } Debug.Assert(categories != null && categories.ContainsKey(analyzer)); // add category resource strings sb.Append(CodeTemplates.GenerateCategoriesResourceData(categories[analyzer])); fileContents = fileContents.Replace("INSERTRESOURCEDATA", sb.ToString()); } else if (fileName == "REPLACE.ME.Analyzers.csproj") { var sb = new StringBuilder(); foreach (var check in checks) { sb.Append(CodeTemplates.GenerateCompileItem(CodeTemplates.GenerateAnalyzerFileName(check))); sb.Append(CodeTemplates.GenerateCompileItem(CodeTemplates.GenerateCodeFixFileName(check))); } sb.Append(CodeTemplates.GenerateCompileItem(CodeTemplates.CategoryFileName)); fileContents = fileContents.Replace("INSERTSOURCEFILES", sb.ToString()); } else if (fileName == "REPLACE.ME.CSharp.Analyzers.csproj") { var sb = new StringBuilder(); foreach (var check in checks) { sb.Append(CodeTemplates.GenerateCompileItem(CodeTemplates.GenerateCSharpAnalyzerFileName(check))); sb.Append(CodeTemplates.GenerateCompileItem(CodeTemplates.GenerateCSharpCodeFixFileName(check))); } fileContents = fileContents.Replace("INSERTSOURCEFILES", sb.ToString()); } else if (fileName == "REPLACE.ME.VisualBasic.Analyzers.vbproj") { var sb = new StringBuilder(); foreach (var check in checks) { sb.Append(CodeTemplates.GenerateCompileItem(CodeTemplates.GenerateBasicAnalyzerFileName(check))); sb.Append(CodeTemplates.GenerateCompileItem(CodeTemplates.GenerateBasicCodeFixFileName(check))); } fileContents = fileContents.Replace("INSERTSOURCEFILES", sb.ToString()); } else if (fileName == "REPLACE.ME.Analyzers.UnitTests.csproj") { var sb = new StringBuilder(); foreach (var check in checks) { sb.Append(CodeTemplates.GenerateCompileItem(CodeTemplates.GenerateAnalyzerTestsFileName(check))); sb.Append(CodeTemplates.GenerateCompileItem(CodeTemplates.GenerateCodeFixTestsFileName(check))); } fileContents = fileContents.Replace("INSERTSOURCEFILES", sb.ToString()); } fileName = fileName.Replace("REPLACE.ME", analyzer); fileName = fileName.Replace("REPLACEME", analyzer.Replace(".", String.Empty)); string guid = GetGuid(); fileContents = fileContents.Replace("INSERTGUID", guid); // a new GUID for product ID in vsixmanifest only fileContents = fileContents.Replace("INSERTNOBRACESGUID", Guid.NewGuid().ToString()); // insert GUIDs of referenced projects if (fileName.EndsWith("proj")) { foreach (var projectKind in Enum.GetValues(typeof(ProjectKind)).Cast <ProjectKind>()) { string sub; switch (projectKind) { case ProjectKind.Core: sub = "CORE"; break; case ProjectKind.CSharp: sub = "CSHARP"; break; case ProjectKind.VisualBasic: sub = "VB"; break; case ProjectKind.UnitTests: case ProjectKind.Setup: case ProjectKind.NuGet: continue; default: throw new InvalidOperationException(); } string toReplace = string.Format("INSERT{0}GUID", sub); // project GUIDs for this kind Dictionary <string, string> kindGuids; if (projectGuids.TryGetValue(projectKind.ToString(), out kindGuids)) { string projectGuid; if (kindGuids.TryGetValue(analyzer, out projectGuid)) { fileContents = fileContents.Replace(toReplace, projectGuid); } } } } CreateFile(fileContents, target, fileName); return(guid); }