diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/ProjectDependencyFinder.cs b/src/Microsoft.DotNet.ProjectJsonMigration/ProjectDependencyFinder.cs index 8003e1c6a..1c4280172 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/ProjectDependencyFinder.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/ProjectDependencyFinder.cs @@ -7,12 +7,48 @@ using Microsoft.DotNet.ProjectModel; using System.Linq; using System.IO; using Newtonsoft.Json.Linq; +using Microsoft.DotNet.ProjectModel.Compilation; +using Microsoft.DotNet.ProjectModel.Graph; namespace Microsoft.DotNet.ProjectJsonMigration { public class ProjectDependencyFinder { - public Dictionary FindPossibleProjectDependencies(string projectJsonFilePath) + public IEnumerable ResolveProjectDependencies(ProjectContext projectContext, HashSet preResolvedProjects=null) + { + preResolvedProjects = preResolvedProjects ?? new HashSet(); + + var projectExports = projectContext.CreateExporter("_").GetDependencies(); + var possibleProjectDependencies = + FindPossibleProjectDependencies(projectContext.ProjectFile.ProjectFilePath); + + var projectDependencies = new List(); + foreach (var projectExport in projectExports) + { + var projectExportName = projectExport.Library.Identity.Name; + ProjectDependency projectDependency; + + if (!possibleProjectDependencies.TryGetValue(projectExportName, out projectDependency)) + { + if (projectExport.Library.Identity.Type.Equals(LibraryType.Project) + && !preResolvedProjects.Contains(projectExportName)) + { + MigrationErrorCodes + .MIGRATE1014($"Unresolved project dependency ({projectExportName})").Throw(); + } + else + { + continue; + } + } + + projectDependencies.Add(projectDependency); + } + + return projectDependencies; + } + + private Dictionary FindPossibleProjectDependencies(string projectJsonFilePath) { var projectDirectory = Path.GetDirectoryName(projectJsonFilePath); @@ -112,7 +148,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration return paths; } - public static string ResolveRootDirectory(string projectPath) + private static string ResolveRootDirectory(string projectPath) { var di = new DirectoryInfo(projectPath); diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigrateProjectDependenciesRule.cs b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigrateProjectDependenciesRule.cs index 8b9795cc5..c1ee02a41 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigrateProjectDependenciesRule.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigrateProjectDependenciesRule.cs @@ -30,15 +30,11 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules { _projectDirectory = migrationSettings.ProjectDirectory; - var possibleProjectDependencies = _projectDependencyFinder - .FindPossibleProjectDependencies(migrationRuleInputs.DefaultProjectContext.ProjectFile.ProjectFilePath); - var migratedXProjDependencyPaths = MigrateXProjProjectDependencies(migrationSettings, migrationRuleInputs); - var migratedXProjDependencyNames = migratedXProjDependencyPaths.Select(p => Path.GetFileNameWithoutExtension(p)); + var migratedXProjDependencyNames = new HashSet(migratedXProjDependencyPaths.Select(p => Path.GetFileNameWithoutExtension(p))); AddPropertyTransformsToCommonPropertyGroup(migrationRuleInputs.CommonPropertyGroup); MigrateProjectJsonProjectDependencies( - possibleProjectDependencies, migrationRuleInputs.ProjectContexts, migratedXProjDependencyNames, migrationRuleInputs.OutputMSBuildProject); @@ -88,37 +84,16 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules } public void MigrateProjectJsonProjectDependencies( - Dictionary possibleProjectDependencies, IEnumerable projectContexts, - IEnumerable migratedXProjDependencyNames, + HashSet migratedXProjDependencyNames, ProjectRootElement outputMSBuildProject) { foreach (var projectContext in projectContexts) { + var projectDependencies = _projectDependencyFinder.ResolveProjectDependencies(projectContext, migratedXProjDependencyNames); var projectExports = projectContext.CreateExporter("_").GetDependencies(); - var projectDependencyTransformResults = new List(); - foreach (var projectExport in projectExports) - { - var projectExportName = projectExport.Library.Identity.Name; - ProjectDependency projectDependency; - - if (!possibleProjectDependencies.TryGetValue(projectExportName, out projectDependency)) - { - if (projectExport.Library.Identity.Type.Equals(LibraryType.Project) - && !migratedXProjDependencyNames.Contains(projectExportName)) - { - MigrationErrorCodes - .MIGRATE1014($"Unresolved project dependency ({projectExportName})").Throw(); - } - else - { - continue; - } - } - - projectDependencyTransformResults.Add(ProjectDependencyTransform.Transform(projectDependency)); - } + var projectDependencyTransformResults = projectDependencies.Select(p => ProjectDependencyTransform.Transform(p)); if (projectDependencyTransformResults.Any()) {