Clean up ProjectDependencyFinder API to be self contained

This commit is contained in:
Bryan Thornbury 2016-09-22 17:44:34 -07:00
parent 5523f24712
commit b4a0cc245a
2 changed files with 42 additions and 31 deletions

View file

@ -7,12 +7,48 @@ using Microsoft.DotNet.ProjectModel;
using System.Linq; using System.Linq;
using System.IO; using System.IO;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Microsoft.DotNet.ProjectModel.Compilation;
using Microsoft.DotNet.ProjectModel.Graph;
namespace Microsoft.DotNet.ProjectJsonMigration namespace Microsoft.DotNet.ProjectJsonMigration
{ {
public class ProjectDependencyFinder public class ProjectDependencyFinder
{ {
public Dictionary<string, ProjectDependency> FindPossibleProjectDependencies(string projectJsonFilePath) public IEnumerable<ProjectDependency> ResolveProjectDependencies(ProjectContext projectContext, HashSet<string> preResolvedProjects=null)
{
preResolvedProjects = preResolvedProjects ?? new HashSet<string>();
var projectExports = projectContext.CreateExporter("_").GetDependencies();
var possibleProjectDependencies =
FindPossibleProjectDependencies(projectContext.ProjectFile.ProjectFilePath);
var projectDependencies = new List<ProjectDependency>();
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<string, ProjectDependency> FindPossibleProjectDependencies(string projectJsonFilePath)
{ {
var projectDirectory = Path.GetDirectoryName(projectJsonFilePath); var projectDirectory = Path.GetDirectoryName(projectJsonFilePath);
@ -112,7 +148,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration
return paths; return paths;
} }
public static string ResolveRootDirectory(string projectPath) private static string ResolveRootDirectory(string projectPath)
{ {
var di = new DirectoryInfo(projectPath); var di = new DirectoryInfo(projectPath);

View file

@ -30,15 +30,11 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
{ {
_projectDirectory = migrationSettings.ProjectDirectory; _projectDirectory = migrationSettings.ProjectDirectory;
var possibleProjectDependencies = _projectDependencyFinder
.FindPossibleProjectDependencies(migrationRuleInputs.DefaultProjectContext.ProjectFile.ProjectFilePath);
var migratedXProjDependencyPaths = MigrateXProjProjectDependencies(migrationSettings, migrationRuleInputs); var migratedXProjDependencyPaths = MigrateXProjProjectDependencies(migrationSettings, migrationRuleInputs);
var migratedXProjDependencyNames = migratedXProjDependencyPaths.Select(p => Path.GetFileNameWithoutExtension(p)); var migratedXProjDependencyNames = new HashSet<string>(migratedXProjDependencyPaths.Select(p => Path.GetFileNameWithoutExtension(p)));
AddPropertyTransformsToCommonPropertyGroup(migrationRuleInputs.CommonPropertyGroup); AddPropertyTransformsToCommonPropertyGroup(migrationRuleInputs.CommonPropertyGroup);
MigrateProjectJsonProjectDependencies( MigrateProjectJsonProjectDependencies(
possibleProjectDependencies,
migrationRuleInputs.ProjectContexts, migrationRuleInputs.ProjectContexts,
migratedXProjDependencyNames, migratedXProjDependencyNames,
migrationRuleInputs.OutputMSBuildProject); migrationRuleInputs.OutputMSBuildProject);
@ -88,37 +84,16 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
} }
public void MigrateProjectJsonProjectDependencies( public void MigrateProjectJsonProjectDependencies(
Dictionary<string, ProjectDependency> possibleProjectDependencies,
IEnumerable<ProjectContext> projectContexts, IEnumerable<ProjectContext> projectContexts,
IEnumerable<string> migratedXProjDependencyNames, HashSet<string> migratedXProjDependencyNames,
ProjectRootElement outputMSBuildProject) ProjectRootElement outputMSBuildProject)
{ {
foreach (var projectContext in projectContexts) foreach (var projectContext in projectContexts)
{ {
var projectDependencies = _projectDependencyFinder.ResolveProjectDependencies(projectContext, migratedXProjDependencyNames);
var projectExports = projectContext.CreateExporter("_").GetDependencies(); var projectExports = projectContext.CreateExporter("_").GetDependencies();
var projectDependencyTransformResults = new List<ProjectItemElement>(); var projectDependencyTransformResults = projectDependencies.Select(p => ProjectDependencyTransform.Transform(p));
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));
}
if (projectDependencyTransformResults.Any()) if (projectDependencyTransformResults.Any())
{ {