diff options
author | Mike Krüger <mikkrg@microsoft.com> | 2018-04-04 09:56:02 +0300 |
---|---|---|
committer | Mike Krüger <mikkrg@microsoft.com> | 2018-04-04 09:56:02 +0300 |
commit | eaefee679092f3392694d542f305bb06f77d09e7 (patch) | |
tree | 7c47d469b5335ea94c27eb5bee94475d55048070 /main/src/core | |
parent | 3c5ebce624fe23effc145219a2021a4ec8b1a5af (diff) | |
parent | d392a2f269c74e77f478d6e26a23fe2d90b241a4 (diff) |
Merge branch 'master' into master-fix591384
Diffstat (limited to 'main/src/core')
-rw-r--r-- | main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs | 75 | ||||
-rw-r--r-- | main/src/core/MonoDevelop.Ide/ExtensionModel/MonoDevelop.Ide.addin.xml | 1 |
2 files changed, 72 insertions, 4 deletions
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs index ff4e9112c5..8d0e626dd4 100644 --- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs +++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs @@ -2326,6 +2326,12 @@ namespace MonoDevelop.Projects throw new InvalidOperationException (it.GetType ().Name + " already belongs to a project"); it.Project = this; } + + if (monitorItemsModifiedDuringReevaluation) { + if (itemsAddedDuringReevaluation == null) + itemsAddedDuringReevaluation = ImmutableList.CreateBuilder<ProjectItem> (); + itemsAddedDuringReevaluation.AddRange (objs); + } NotifyModified ("Items"); if (ProjectItemAdded != null) @@ -2338,6 +2344,12 @@ namespace MonoDevelop.Projects { foreach (var it in objs) it.Project = null; + + if (monitorItemsModifiedDuringReevaluation) { + if (itemsRemovedDuringReevaluation == null) + itemsRemovedDuringReevaluation = ImmutableList.CreateBuilder<ProjectItem> (); + itemsRemovedDuringReevaluation.AddRange (objs); + } NotifyModified ("Items"); if (ProjectItemRemoved != null) @@ -2346,6 +2358,10 @@ namespace MonoDevelop.Projects NotifyFileRemovedFromProject (objs.OfType<ProjectFile> ()); } + bool monitorItemsModifiedDuringReevaluation; + internal ImmutableList<ProjectItem>.Builder itemsAddedDuringReevaluation; + internal ImmutableList<ProjectItem>.Builder itemsRemovedDuringReevaluation; + internal void NotifyFileChangedInProject (ProjectFile file) { OnFileChangedInProject (new ProjectFileEventArgs (this, file)); @@ -2955,9 +2971,16 @@ namespace MonoDevelop.Projects } } } - if (IsReevaluating) + if (IsReevaluating) { + if (itemsAddedDuringReevaluation != null) { + // Handle new items added whilst re-evaluating the MSBuildProject. + foreach (var item in itemsAddedDuringReevaluation) { + unusedItems.Remove (item); + localItems.Add (item); + } + } Items.SetItems (localItems, newItems, unusedItems); - else + } else Items.AddRange (localItems); } @@ -2994,6 +3017,27 @@ namespace MonoDevelop.Projects return (eit, false); } } + + if (itemsRemovedDuringReevaluation != null) { + // Handle items removed whilst re-evaluating the MSBuildProject. + ProjectItem matchedRemovedItem = null; + foreach (var removedItem in itemsRemovedDuringReevaluation) { + if (ItemsAreEqual (buildItem, removedItem.BackingEvalItem) || CheckProjectReferenceItemsAreEqual (buildItem, removedItem)) { + matchedRemovedItem = removedItem; + break; + } + } + + if (matchedRemovedItem != null) { + itemsRemovedDuringReevaluation.Remove (matchedRemovedItem); + if (usedMSBuildItems != null) { + foreach (var sourceItem in buildItem.SourceItems) { + usedMSBuildItems.Add (sourceItem); + } + } + return (null, false); + } + } } var item = CreateProjectItem (buildItem); @@ -3728,13 +3772,25 @@ namespace MonoDevelop.Projects { // Compare only metadata, since item name and include can't change + MSBuildEvaluationContext context = null; var n = 0; foreach (var p in item.Metadata.GetProperties ()) { var p2 = evalItem.Metadata.GetProperty (p.Name); if (p2 == null) return false; - if (!p.ValueType.Equals (p.Value, p2.UnevaluatedValue)) - return false; + if (!p.ValueType.Equals (p.Value, p2.UnevaluatedValue)) { + if (p2.UnevaluatedValue != null && p2.UnevaluatedValue.Contains ('%')) { + // Check evaluated value is a match. + if (context == null) { + context = new MSBuildEvaluationContext (); + context.InitEvaluation (MSBuildProject); + } + string value = context.Evaluate (p.UnevaluatedValue); + if (!p.ValueType.Equals (p.Value, value)) + return false; + } else + return false; + } n++; } if (evalItem.Metadata.GetProperties ().Count () != n) @@ -4012,6 +4068,12 @@ namespace MonoDevelop.Projects { return BindTask (ct => Runtime.RunInMainThread (async () => { using (await writeProjectLock.EnterAsync ()) { + + if (modifiedInMemory) { + await Task.Run (() => WriteProject (monitor)); + modifiedInMemory = false; + } + var oldCapabilities = new HashSet<string> (projectCapabilities); bool oldSupportsExecute = SupportsExecute (); @@ -4019,7 +4081,9 @@ namespace MonoDevelop.Projects IsReevaluating = true; // Reevaluate the msbuild project + monitorItemsModifiedDuringReevaluation = true; await sourceProject.EvaluateAsync (); + monitorItemsModifiedDuringReevaluation = false; // Loads minimal data required to instantiate extensions and prepare for project loading InitBeforeProjectExtensionLoad (); @@ -4031,6 +4095,9 @@ namespace MonoDevelop.Projects } finally { IsReevaluating = false; + monitorItemsModifiedDuringReevaluation = false; + itemsAddedDuringReevaluation = null; + itemsRemovedDuringReevaluation = null; } if (resetCachedCompileItems) diff --git a/main/src/core/MonoDevelop.Ide/ExtensionModel/MonoDevelop.Ide.addin.xml b/main/src/core/MonoDevelop.Ide/ExtensionModel/MonoDevelop.Ide.addin.xml index 3846ff564c..e881821723 100644 --- a/main/src/core/MonoDevelop.Ide/ExtensionModel/MonoDevelop.Ide.addin.xml +++ b/main/src/core/MonoDevelop.Ide/ExtensionModel/MonoDevelop.Ide.addin.xml @@ -407,6 +407,7 @@ <Extension path="/MonoDevelop/Ide/Composition"> <Assembly file="Microsoft.CodeAnalysis.CSharp.EditorFeatures.dll"/> <Assembly file="Microsoft.CodeAnalysis.EditorFeatures.dll"/> + <Assembly file="Microsoft.CodeAnalysis.EditorFeatures.Text.dll"/> <Assembly file="Microsoft.CodeAnalysis.Features.dll" /> <Assembly file="Microsoft.CodeAnalysis.Workspaces.dll" /> <Assembly file="Microsoft.CodeAnalysis.Workspaces.Desktop.dll" /> |