in code/src/UI/VisualStudio/GenShell/VsGenShellSolution.cs [50:124]
private async Task AddContextItemsToSolutionAsync(ProjectInfo projectInfo)
{
var filesByProject = ProjectHelper.ResolveProjectFiles(projectInfo.ProjectItems);
var filesForExistingProjects = filesByProject.Where(k => !projectInfo.Projects.Any(p => p == k.Key));
var nugetsForExistingProjects = projectInfo.NugetReferences.Where(n => !projectInfo.Projects.Any(p => p == n.Project)).GroupBy(n => n.Project, n => n);
var sdksForExistingProjects = projectInfo.SdkReferences.Where(n => !projectInfo.Projects.Any(p => p == n.Project)).GroupBy(n => n.Project, n => n);
foreach (var files in filesForExistingProjects)
{
if (!await IsCpsProjectAsync(files.Key))
{
await AddItemsToProjectAsync(files.Key, files.Value);
}
}
foreach (var nuget in nugetsForExistingProjects)
{
await AddNugetsForProjectAsync(nuget.Key, nuget);
}
foreach (var sdk in sdksForExistingProjects)
{
await AddSdksForProjectAsync(sdk.Key, sdk);
}
// Ensure projectsToAdd are ordered correctly.
// projects from old project system should be added before project from CPS project system, as otherwise nuget restore will fail
var orderedProject = projectInfo.Projects.OrderBy(p => IsCpsProjectAsync(p).Result);
double secAddProjects = 0;
double secAddFiles = 0;
double secAddNuget = 0;
foreach (var project in orderedProject)
{
var chrono = Stopwatch.StartNew();
await AddProjectToSolutionAsync(project);
secAddProjects += chrono.Elapsed.TotalSeconds;
chrono.Restart();
if (!await IsCpsProjectAsync(project) && filesByProject.ContainsKey(project))
{
await AddItemsToProjectAsync(project, filesByProject[project]);
}
secAddFiles += chrono.Elapsed.TotalSeconds;
chrono.Restart();
var projNugetReferences = projectInfo.NugetReferences.Where(n => n.Project == project);
if (projNugetReferences.Any())
{
await AddNugetsForProjectAsync(project, projNugetReferences);
}
secAddNuget += chrono.Elapsed.TotalSeconds;
var projSdksReferences = projectInfo.SdkReferences.Where(n => n.Project == project);
if (projSdksReferences.Any())
{
await AddSdksForProjectAsync(project, projSdksReferences);
}
chrono.Stop();
}
GenContext.ToolBox.Shell.UI.ShowStatusBarMessage(StringRes.StatusAddingProjectReferences);
await AddReferencesToProjectsAsync(projectInfo.ProjectReferences);
GenContext.Current.ProjectMetrics[ProjectMetricsEnum.AddProjectToSolution] = secAddProjects;
GenContext.Current.ProjectMetrics[ProjectMetricsEnum.AddFilesToProject] = secAddFiles;
GenContext.Current.ProjectMetrics[ProjectMetricsEnum.AddNugetToProject] = secAddNuget;
}