private async Task AddContextItemsToSolutionAsync()

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;
        }