diff options
5 files changed, 35 insertions, 33 deletions
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/ProjectMigrationHandler.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/ProjectMigrationHandler.cs index 976dc06b42..4aa9ae352e 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/ProjectMigrationHandler.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/ProjectMigrationHandler.cs @@ -42,13 +42,13 @@ namespace MonoDevelop.Projects.Extensions yield break; } - public abstract bool Migrate (ProjectLoadProgressMonitor monitor, MSBuildProject project, string fileName, string language); + public abstract Task<bool> Migrate (ProjectLoadProgressMonitor monitor, MSBuildProject project, string fileName, string language); public virtual bool CanPromptForMigration { get { return false; } } - public virtual MigrationType PromptForMigration (ProjectLoadProgressMonitor monitor, MSBuildProject project, string fileName, string language) + public virtual Task<MigrationType> PromptForMigration (ProjectLoadProgressMonitor monitor, MSBuildProject project, string fileName, string language) { throw new NotImplementedException (); } diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/ProjectTypeNode.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/ProjectTypeNode.cs index f1f4beca17..5f2fa78d1d 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/ProjectTypeNode.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/ProjectTypeNode.cs @@ -35,15 +35,28 @@ namespace MonoDevelop.Projects.Extensions [ExtensionNode (ExtensionAttributeType=typeof(ExportProjectTypeAttribute))] public class ProjectTypeNode: SolutionItemTypeNode { + [NodeAttribute] + bool migrationRequired = true; + + [NodeAttribute] + string migrationHandler; + + public bool IsMigrationRequired { + get { return migrationRequired; } + } + + public ProjectMigrationHandler MigrationHandler { + get { return (ProjectMigrationHandler) Addin.CreateInstance (migrationHandler); } + } + public override async Task<SolutionItem> CreateSolutionItem (ProgressMonitor monitor, string fileName, string typeGuid) { MSBuildProject p = null; if (!string.IsNullOrEmpty (fileName)) { p = await MSBuildProject.LoadAsync (fileName); - // TODO NPM -// if (MSBuildProjectService.CanMigrateFlavor (p.ProjectTypeGuids)) -// await MSBuildProjectService.MigrateFlavor (monitor, fileName, typeGuid, this, p); + if (!string.IsNullOrEmpty (migrationHandler)) + await MSBuildProjectService.MigrateFlavor (monitor, fileName, typeGuid, p, this); } var project = await base.CreateSolutionItem (monitor, fileName, typeGuid) as Project; diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/SolutionItemTypeNode.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/SolutionItemTypeNode.cs index 5c00072556..2b9efdf923 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/SolutionItemTypeNode.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/SolutionItemTypeNode.cs @@ -82,7 +82,7 @@ namespace MonoDevelop.Projects.Extensions } } - internal string ItenTypeName { + internal string ItemTypeName { get { return type; } } diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProject.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProject.cs index a9401d8eb2..a36711eb2b 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProject.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProject.cs @@ -187,6 +187,14 @@ namespace MonoDevelop.Projects.Formats.MSBuild TextFile.WriteFile (fileName, content, bom, true); } + public Task SaveAsync (string fileName) + { + return Task.Run (() => { + string content = SaveToString (); + TextFile.WriteFile (fileName, content, bom, true); + }); + } + public string SaveToString () { // StringWriter.Encoding always returns UTF16. We need it to return UTF8, so the diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectService.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectService.cs index 62338193a5..94cd552f88 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectService.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Formats.MSBuild/MSBuildProjectService.cs @@ -138,7 +138,6 @@ namespace MonoDevelop.Projects.Formats.MSBuild item.EndLoad (); }; - item.TypeGuid = typeGuid ?? node.Guid; await item.LoadAsync (monitor, fileName, format); return item; } @@ -163,18 +162,6 @@ namespace MonoDevelop.Projects.Formats.MSBuild return false; } - internal static SolutionItem CreateSolutionItem (string typeGuid) - { - foreach (var node in GetItemTypeNodes ()) { - if (node.Guid.Equals (typeGuid, StringComparison.OrdinalIgnoreCase)) { - var it = node.CreateSolutionItem (new ProgressMonitor (), null, typeGuid).Result; - it.EnsureInitialized (); - return it; - } - } - throw new InvalidOperationException ("Unknown project type: " + typeGuid); - } - internal static Project CreateProject (string typeGuid, params string[] flavorGuids) { foreach (var node in GetItemTypeNodes ().OfType<ProjectTypeNode> ()) { @@ -196,27 +183,21 @@ namespace MonoDevelop.Projects.Formats.MSBuild throw new InvalidOperationException ("Unknown project type: " + type); } -/* TODO NPM - internal static bool CanMigrateFlavor (string[] guids) - { - - } - - internal static async Task<bool> MigrateFlavor (IProgressMonitor monitor, string fileName, string typeGuid, MSBuildProjectNode node, MSBuildProject p) + internal static async Task<bool> MigrateFlavor (ProgressMonitor monitor, string fileName, string typeGuid, MSBuildProject p, ProjectTypeNode node) { var language = GetLanguageFromGuid (typeGuid); - if (MigrateProject (monitor, node, p, fileName, language)) { - p.Save (fileName); + if (await MigrateProject (monitor, node, p, fileName, language)) { + await p.SaveAsync (fileName); return true; } return false; } - static async Task<bool> MigrateProject (IProgressMonitor monitor, MSBuildProjectNode st, MSBuildProject p, string fileName, string language) + static async Task<bool> MigrateProject (ProgressMonitor monitor, ProjectTypeNode st, MSBuildProject p, string fileName, string language) { - var projectLoadMonitor = monitor as IProjectLoadProgressMonitor; + var projectLoadMonitor = monitor as ProjectLoadProgressMonitor; if (projectLoadMonitor == null) { // projectLoadMonitor will be null when running through md-tool, but // this is not fatal if migration is not required, so just ignore it. --abock @@ -229,7 +210,7 @@ namespace MonoDevelop.Projects.Formats.MSBuild } var migrationType = st.MigrationHandler.CanPromptForMigration - ? st.MigrationHandler.PromptForMigration (projectLoadMonitor, p, fileName, language) + ? await st.MigrationHandler.PromptForMigration (projectLoadMonitor, p, fileName, language) : projectLoadMonitor.ShouldMigrateProject (); if (migrationType == MigrationType.Ignore) { if (st.IsMigrationRequired) { @@ -260,7 +241,7 @@ namespace MonoDevelop.Projects.Formats.MSBuild throw new Exception ("Could not migrate the project"); return true; - }*/ + } internal static string GetLanguageGuid (string language) { @@ -349,7 +330,7 @@ namespace MonoDevelop.Projects.Formats.MSBuild { var className = item.GetType ().FullName; foreach (SolutionItemTypeNode node in GetItemTypeNodes ()) { - if (node.ItenTypeName == className) + if (node.ItemTypeName == className) return node.Guid; } return GenericItemGuid; |