|
1 | 1 | using EnvDTE; |
2 | 2 | using EnvDTE80; |
| 3 | +using Microsoft.VisualStudio.Shell.Interop; |
| 4 | +using System.Collections.Generic; |
3 | 5 | using System.ComponentModel.Design; |
4 | 6 | using System.IO; |
5 | 7 | using System.Windows.Forms; |
| 8 | +using VSLangProj; |
6 | 9 |
|
7 | 10 | namespace CodingWithCalvin.ProjectRenamifier |
8 | 11 | { |
@@ -77,27 +80,95 @@ void RenameProject(Project project, DTE2 dte) |
77 | 80 | { |
78 | 81 | ThreadHelper.ThrowIfNotOnUIThread(); |
79 | 82 |
|
80 | | - var projectFileName = Path.GetFileName(project.FullName); |
| 83 | + var oldProjectFileName = Path.GetFileName(project.FullName); |
81 | 84 | var projectFileNameNoExtension = Path.GetFileNameWithoutExtension(project.FullName); |
| 85 | + var projectExtension = Path.GetExtension(oldProjectFileName); |
| 86 | + |
| 87 | + var newProjectFileName = $"{projectFileNameNoExtension}-NEW{projectExtension}"; |
| 88 | + |
82 | 89 | var projectPath = |
83 | 90 | Path.GetDirectoryName(project.FullName) |
84 | 91 | ?? throw new InvalidOperationException(); |
85 | 92 | var parentDirectoryName = new DirectoryInfo(projectPath).Parent.Name; |
86 | | - var grandparentDirectory = new DirectoryInfo(parentDirectoryName).Parent.FullName; |
| 93 | + var oldParentDirectory = new DirectoryInfo(projectPath).Parent.FullName; |
| 94 | + |
| 95 | + var grandparentDirectory = new DirectoryInfo(parentDirectoryName).Parent.FullName; |
| 96 | + var newParentDirectory = Path.Combine(grandparentDirectory, $"{parentDirectoryName}-NEW"); |
| 97 | + |
| 98 | + // hold onto all projects that reference this project |
| 99 | + var referencingProjects = new List<Project>(); |
| 100 | + foreach (Project p in dte.Solution.Projects) |
| 101 | + { |
| 102 | + if(p.Object is VSProject referencingVSProject) |
| 103 | + { |
| 104 | + foreach(Reference reference in referencingVSProject.References) |
| 105 | + { |
| 106 | + if(reference.SourceProject != null && reference.SourceProject.UniqueName == project.UniqueName) |
| 107 | + { |
| 108 | + referencingProjects.Add(p); |
| 109 | + } |
| 110 | + } |
| 111 | + } |
| 112 | + } |
| 113 | + |
| 114 | + // hold onto all projects that this project references |
| 115 | + var referencedProjects = new List<Project>(); |
| 116 | + |
| 117 | + if (project.Object is VSProject referencedVSProject) |
| 118 | + { |
| 119 | + foreach (Reference reference in referencedVSProject.References) |
| 120 | + { |
| 121 | + if (reference.SourceProject != null) |
| 122 | + { |
| 123 | + referencedProjects.Add(reference.SourceProject); |
| 124 | + } |
| 125 | + } |
| 126 | + } |
| 127 | + |
| 128 | + // unload project, then do the work |
| 129 | + dte.Solution.Remove(project); |
87 | 130 |
|
| 131 | + //rename parent directory, if necessary |
88 | 132 | if (parentDirectoryName.Equals(projectFileNameNoExtension)) |
89 | 133 | { |
90 | | - // rename parent directory |
| 134 | + Directory.Move(oldParentDirectory, newParentDirectory); |
91 | 135 | } |
92 | 136 |
|
93 | 137 | // rename project |
94 | | - |
95 | | - // fix solution? |
96 | | - // remove old project? |
97 | | - // add new project? |
| 138 | + File.Move(oldProjectFileName, newProjectFileName); |
| 139 | + |
| 140 | + // add new project back to solution |
| 141 | + dte.Solution.AddFromFile(newProjectFileName, true); |
98 | 142 |
|
99 | | - // fix references? |
| 143 | + // need handle to new project now that its back |
| 144 | + Project newProjectReference = null; |
| 145 | + foreach (Project p in dte.Solution.Projects) |
| 146 | + { |
| 147 | + if(p.UniqueName == newProjectFileName) |
| 148 | + { |
| 149 | + newProjectReference = p; |
| 150 | + break; |
| 151 | + } |
| 152 | + } |
100 | 153 |
|
| 154 | + // fix projects that reference the old project to reference the new one |
| 155 | + foreach (var referencingProject in referencingProjects) |
| 156 | + { |
| 157 | + if(referencingProject.Object is VSProject vsProject) |
| 158 | + { |
| 159 | + vsProject.References.AddProject(newProjectReference); |
| 160 | + } |
| 161 | + } |
| 162 | + |
| 163 | + // fix this project's references |
| 164 | + foreach (var referencedProject in referencedProjects) |
| 165 | + { |
| 166 | + if(newProjectReference.Object is VSProject vsProject2) |
| 167 | + { |
| 168 | + vsProject2.References.AddProject(referencedProject); |
| 169 | + } |
| 170 | + } |
| 171 | + |
101 | 172 | // sync new namespace? |
102 | 173 | } |
103 | 174 | } |
|
0 commit comments